深入淺出 Android核心組件Service(1)
首先我們先來看看怎么使用Service,然后再談Android Service的內(nèi)部機制。
在Android中Service的啟動方式有兩種,今天先發(fā)第一種。
Service的啟動方式一:
啟動:Context.startService(new Intent(context,xxx.class));
停止:Context.stopService() ;
我畫了一個Service啟動的流程圖,相信大家一看就懂。Activity通過 Intent啟動Service,如果Service還沒有運行,則android先調(diào)用onCreate()然后調(diào)用onStart();如果 Service已經(jīng)運行,則只調(diào)用onStart(),所以一個Service的onStart方法可能會重復調(diào)用多次。 調(diào)用stopService就會觸發(fā)Service的onDestroy()方法。

這一節(jié)里面傻蛋做了一個示例程序是一個音樂播放器,界面如下,功能很簡單:播放、暫停、停止音樂、關閉Activity(這時Service仍然運行,繼續(xù)播放音樂)、退出程序(停止音樂退出Activity)。

由于要控制Service的動作,傻蛋寫了一個播放的通用類,這樣在以后的課程中還能用上,代碼如下:
- /**
- * MyMediaController.java
- * com.androidtest.service.mediaplayer
- *
- * Function: TODO
- *
- * ver date author
- * ──────────────────────────────────
- * 2011-5-16 Leon
- *
- * Copyright (c) 2011, 最牛網(wǎng) All Rights Reserved.
- */
- package com.zuiniuwang;
- import java.io.Serializable;
- import android.media.MediaPlayer;
- /**
- * ClassName:MyMediaController
- * Function: Mediaplayer 的一個控制類,控制播放器的播放 暫停 停止 等動作
- * REASON
- *
- * @author Leon
- * @version
- * @since Ver 1.1
- * @Date 2011-5-16
- */
- public enum MyMediaController implements Serializable {
- play {
- @Override
- public void execute() {
- if (mediaPlayer != null && !mediaPlayer.isPlaying())
- mediaPlayer.start();
- // TODO Auto-generated method stub
- }
- },
- pause {
- @Override
- public void execute() {
- // TODO Auto-generated method stub
- if (mediaPlayer != null && mediaPlayer.isPlaying()) {
- mediaPlayer.pause();
- }
- }
- },
- stop {
- @Override
- public void execute() {
- // TODO Auto-generated method stub
- if (mediaPlayer != null) {
- mediaPlayer.stop();
- try {
- // 在stop后如果要重新Start需要prepare一下
- mediaPlayer.prepare();
- // 從頭播放
- mediaPlayer.seekTo(0);
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
- };
- public static MediaPlayer mediaPlayer;
- public abstract void execute();
- }
然后是控制播放的Activity:
- /**
- * MusicPlayer.java
- * com.androidtest.activity
- *
- * Function: TODO
- *
- * ver date author
- * ──────────────────────────────────
- * 2011-5-15 Leon
- *
- * Copyright (c) 2011, 最牛網(wǎng) All Rights Reserved.
- */
- package com.androidtest.activity.musicplayer;
- import android.app.Activity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.util.Log;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import com.androidtest.MyImageButton;
- import com.androidtest.R;
- import com.androidtest.service.mediaplayer.MyMediaController;
- import com.androidtest.service.mediaplayer.NormalMusicService;
- import com.androidtest.sharedpreferences.TestSharePreferences;
- /**
- * ClassName:MusicPlayer Function: TODO ADD FUNCTION Reason: TODO ADD REASON
- *
- * @author Leon
- * @version
- * @since Ver 1.1
- * @Date 2011-5-15
- */
- public class NormalMusicPlayerActivity extends Activity implements OnClickListener {
- private static final String TAG = NormalMusicPlayerActivity.class.getSimpleName();
- private Intent intent ;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- this.setContentView(R.layout.music_player_layout);
- Button playButton = (Button) this.findViewById(R.id.play);
- playButton.setOnClickListener(this);
- Button pauseButton =(Button) this.findViewById(R.id.pause);
- pauseButton.setOnClickListener(this);
- Button stopButton =(Button)this.findViewById(R.id.stop);
- stopButton.setOnClickListener(this);
- Button closeActivityButton =(Button)this.findViewById(R.id.close);
- closeActivityButton.setOnClickListener(this);
- Button exitActivityButton =(Button)this.findViewById(R.id.exit);
- exitActivityButton.setOnClickListener(this);
- intent = new Intent("com.androidtest.service.mediaplayer.NormalMusicService");
- TestSharePreferences testSharePreferences=(TestSharePreferences)this.getApplication();
- Log.v(TAG , ""+testSharePreferences.getSharedInteger());
- }
- private void playAction(MyMediaController playType) {
- Bundle bundle = new Bundle();
- bundle.putSerializable(NormalMusicService.INTENT_KEY, playType);
- intent.putExtras(bundle);
- NormalMusicPlayerActivity.this.startService(intent);
- }
- @Override
- public void onClick(View view) {
- // TODO Auto-generated method stub
- switch (view.getId()) {
- case R.id.play:
- Log.d(TAG, "play.......");
- playAction(MyMediaController.play);
- break;
- case R.id.pause:
- Log.d(TAG, "pause.......");
- playAction(MyMediaController.pause);
- break;
- case R.id.stop:
- Log.d(TAG, "stop.......");
- playAction(MyMediaController.stop);
- break;
- case R.id.close:
- Log.d(TAG, "close.......");
- this.finish();
- break;
- case R.id.exit:
- Log.d(TAG, "exit.......");
- stopService(intent);
- this.finish();
- }
- }
- }
最后是Service類
- /**
- * MusicService.java
- * com.androidtest.service
- *
- * Function: TODO
- *
- * ver date author
- * ──────────────────────────────────
- * 2011-5-15 Leon
- *
- * Copyright (c) 2011, 最牛網(wǎng) All Rights Reserved.
- */
- package com.zuiniuwang.service;
- import java.io.Serializable;
- import android.app.Service;
- import android.content.Intent;
- import android.media.MediaPlayer;
- import android.os.IBinder;
- import android.util.Log;
- import com.zuiniuwang.*;
- /**
- * ClassName:MusicService
- * Function: TODO ADD FUNCTION
- * Reason: TODO ADD REASON
- *
- * @author Leon
- * @version
- * @since Ver 1.1
- * @Date 2011-5-15
- */
- public class NormalMusicService extends Service{
- private String TAG = NormalMusicService.class.getSimpleName();
- private MediaPlayer myMediaPlayer ;
- public static final String INTENT_KEY= "action" ;
- @Override
- public IBinder onBind(Intent arg0) {
- // TODO Auto-generated method stub
- return null;
- }
- @Override
- public void onCreate() {
- // TODO Auto-generated method stub
- Log.v(TAG , TAG+ " onCreate()");
- super.onCreate();
- if(myMediaPlayer==null){
- myMediaPlayer=MediaPlayer.create(this, R.raw.test) ;
- myMediaPlayer.setLooping(false);
- }
- }
- @Override
- public void onStart(Intent intent, int startId) {
- // TODO Auto-generated method stub
- Log.v(TAG , TAG + " onStart()");
- super.onStart(intent, startId);
- if(intent!=null){
- MyMediaController mediaControl =(MyMediaController)intent.getSerializableExtra(NormalMusicService.INTENT_KEY);
- mediaControl.mediaPlayer=myMediaPlayer;
- mediaControl.execute();
- }
- }
- @Override
- public void onDestroy() {
- // TODO Auto-generated method stub
- super.onDestroy();
- Log.v(TAG , " onDestroy");
- if(myMediaPlayer!=null){
- myMediaPlayer.stop();
- myMediaPlayer.release();
- }
- }
- }
附件為本實例的代碼下載地址:http://down.51cto.com/data/326354