android service的学习笔记

android service是后台运行的服务,没有界面。比如我们后台播放音乐就可以启动一个服务,service和其他组件一样是运行在主线程的,所以不能进行耗时的操作,不过我们可以开启一个线程来支持耗时操作

服务一般分为两种:

本地服务:Localhost Serviece是应用程序内部的服务,程序通过context.startService()来启动服务,通过调用Context.stopService()来关闭服务,内部也可以通过调用Service.stopSelf或者 Service.stopSelfResult()来自己停止,无论调用的多少次的,startService()只需要调用一次stopService();

2:远程服务, 远程服务是android程序内部的,可以吧接口暴露,让其他程序调用。调用Context.bindService()方法建立连接,并启动,以调用 Context.unbindService()关闭连接。

 

context.startService() ->onCreate()- >onStart()->Service running–调用context.stopService() ->onDestroy()

context.bindService()->onCreate()->onBind()->Service running–调用>onUnbind() -> onDestroy() 从上诉可以知道分别对应本地的,,以及远程的,也对应不同的方式启动这个服务。

下面看看第一个案例:

最基本的service案例:

启动服务来后台播放music

 

[java][/java] view plaincopy

  1. public class PlayMusicService extends Activity implements OnClickListener{
  2.     private Button playBtn;
  3.     private Button stopBtn;
  4.     private Button pauseBtn;
  5.     private Button closeBtn;
  6.     private Button exitBtn;
  7.     private Intent intent;
  8.     @Override
  9.     protected void onCreate(Bundle savedInstanceState) {
  10.         super.onCreate(savedInstanceState);
  11.         setContentView(R.layout.music_service);
  12.         playBtn=(Button) findViewById(R.id.play);
  13.         stopBtn=(Button) findViewById(R.id.stop);
  14.         pauseBtn=(Button) findViewById(R.id.pause);
  15.         closeBtn=(Button) findViewById(R.id.close);
  16.         exitBtn=(Button) findViewById(R.id.exit);
  17.         playBtn.setOnClickListener(this);
  18.         stopBtn.setOnClickListener(this);
  19.         pauseBtn.setOnClickListener(this);
  20.         closeBtn.setOnClickListener(this);
  21.         exitBtn.setOnClickListener(this);
  22.     }
  23.     @Override
  24.     public void onClick(View v) {
  25.         int op=-1;
  26.         intent=new Intent(“com.musicService”);
  27.     switch (v.getId()) {
  28.     case R.id.play:
  29.         op=1;
  30.         break;
  31.     case R.id.stop:                             // stop music
  32.         op=2;
  33.         break;
  34.     case R.id.pause:                            // pause music
  35.         op=3;
  36.         break;
  37.     case R.id.close:                            // close activity
  38.         this.finish();
  39.         break;
  40.     case R.id.exit:
  41.         op=4;
  42.         stopService(intent);
  43.         this.finish();
  44.         break;
  45.     }
  46.     Bundle bundle=new Bundle();
  47.     bundle.putInt(“op”, op);
  48.     intent.putExtras(bundle);
  49.     startService(intent);
  50.     }
  51.     @Override
  52.     public void onDestroy() {
  53.         // TODO Auto-generated method stub
  54.         super.onDestroy();
  55.         if(intent!=null){
  56.             stopService(intent);
  57.         }
  58.     }
  59. }

下面启动的服务:

 

 

[java][/java] view plaincopy

  1. public class MusicService extends Service{
  2.     private static final String TAG = “MyService”;
  3.     private MediaPlayer mediaPlayer;
  4.     @Override
  5.     public IBinder onBind(Intent intent) {
  6.         return null;
  7.     }
  8.     @Override
  9.     public void onCreate() {
  10.         Log.v(TAG, “onCreate”);
  11.         super.onCreate();
  12.         if(mediaPlayer==null){
  13.             mediaPlayer=MediaPlayer.create(this, R.raw.tmp);
  14.             mediaPlayer.setLooping(false);
  15.         }
  16.    }
  17.     @Override
  18.     public void onDestroy() {
  19.         Log.v(TAG, “onDestroy”);
  20.         Toast.makeText(this, “stop media player”, Toast.LENGTH_SHORT);
  21.         if (mediaPlayer != null) {
  22.             mediaPlayer.stop();
  23.             mediaPlayer.release();
  24.         }
  25.     }
  26.     @Override
  27.     public void onStart(Intent intent, int startId) {
  28.         Log.v(TAG, “onStart”);
  29.         if(intent!=null){
  30.             Bundle bundle=intent.getExtras();
  31.             if(bundle!=null){
  32.                 int op=bundle.getInt(“op”);
  33.                 switch (op) {
  34.                 case 1:
  35.                     play();
  36.                     break;
  37.                 case 2:
  38.                     stop();
  39.                     break;
  40.                 case 3:
  41.                     pause();
  42.                     break;
  43.                 }
  44.             }
  45.         }
  46.     }
  47.     public void pause() {
  48.         if (mediaPlayer != null && mediaPlayer.isPlaying()) {
  49.             mediaPlayer.pause();
  50.         }
  51.     }
  52.     private void stop() {
  53.         // TODO Auto-generated method stub
  54.         if(mediaPlayer!=null){
  55.             mediaPlayer.stop();
  56.             try {
  57.                 mediaPlayer.prepare();
  58.             } catch (IllegalStateException e) {
  59.                 // TODO Auto-generated catch block
  60.                 e.printStackTrace();
  61.             } catch (IOException e) {
  62.                 // TODO Auto-generated catch block
  63.                 e.printStackTrace();
  64.             }
  65.         }
  66.     }
  67.     private void play() {
  68.         // TODO Auto-generated method stub
  69.         if(!mediaPlayer.isPlaying()){
  70.             mediaPlayer.start();
  71.         }
  72.     }
  73. }

必须在androidMainfast.xml进行注册

 

 

[html][/html] view plaincopy

  1. <activity
  2.             android:name=”com.example.myservicetest.service.PlayMusicService”
  3.             android:label=”@string/app_name” />
  4.  <service
  5.             android:name=”.service.MusicService”
  6.             android:enabled=”true” >
  7.             <intent-filter>
  8.                 <action android:name=”com.musicService” />
  9.             </intent-filter>
  10.         </service>

上面是基本的,下面让activity将信息发送给一个广播,让接收到广播来启动一个service,首先注册广播

 

 

[html][/html] view plaincopy

  1. <activity
  2.            android:name=”com.example.myservicetest.receiver.PlayMusicRecevicer”
  3.            android:label=”@string/app_name” />
  4. lt;receiver android:name=”.receiver.MusicReceiver” >
  5.            <intent-filter>
  6.                <action android:name=”com.musicReceiver” />
  7.            </intent-filter>
  8.        </receiver>

发送广播的代码

 

 

[java][/java] view plaincopy

  1. public class PlayMusicRecevicer extends Activity implements OnClickListener {
  2.     private Button playBtn;
  3.     private Button stopBtn;
  4.     private Button pauseBtn;
  5.     private Button exitBtn;
  6.     private Button closeBtn;
  7.     private Intent intent;
  8.     @Override
  9.     protected void onCreate(Bundle savedInstanceState) {
  10.         // TODO Auto-generated method stub
  11.         super.onCreate(savedInstanceState);
  12.         setContentView(R.layout.music_receiver);
  13.         playBtn = (Button) findViewById(R.id.play);
  14.         stopBtn = (Button) findViewById(R.id.stop);
  15.         pauseBtn = (Button) findViewById(R.id.pause);
  16.         exitBtn = (Button) findViewById(R.id.exit);
  17.         closeBtn = (Button) findViewById(R.id.close);
  18.         playBtn.setOnClickListener(this);
  19.         stopBtn.setOnClickListener(this);
  20.         pauseBtn.setOnClickListener(this);
  21.         exitBtn.setOnClickListener(this);
  22.         closeBtn.setOnClickListener(this);
  23.     }
  24.     @Override
  25.     public void onClick(View v) {
  26.         int op = -1;
  27.         intent = new Intent(“com.musicReceiver”);
  28.         switch (v.getId()) {
  29.         case R.id.play:
  30.             op = 1;
  31.             break;
  32.         case R.id.stop: // stop music
  33.             op = 2;
  34.             break;
  35.         case R.id.pause:
  36.             op = 3;
  37.             break;
  38.         case R.id.close:
  39.             this.finish();
  40.             break;
  41.         case R.id.exit:                             // process by MusicReceiver
  42.             op = 4;
  43.             this.finish();
  44.             break;
  45.         }
  46.         Bundle bundle = new Bundle();
  47.         bundle.putInt(“op”, op);
  48.         intent.putExtras(bundle);
  49.         sendBroadcast(intent);
  50.     }
  51.     @Override
  52.     public void onDestroy() {
  53.         super.onDestroy();
  54.         if (intent != null) {
  55.             stopService(intent);
  56.         }
  57.     }
  58. }

接收到广播,启动service

 

 

[java][/java] view plaincopy

  1. public class MusicReceiver extends BroadcastReceiver {
  2.     @Override
  3.     public void onReceive(Context context, Intent intent) {
  4.         Bundle bundle = intent.getExtras();
  5.         Intent it = new Intent(context,MusicService.class);
  6.         it.putExtras(bundle);
  7.         if(bundle!=null){
  8.             int op = bundle.getInt(“op”);
  9.             if (op == 4) {
  10.                 context.stopService(it);
  11.             }else{
  12.                 context.startService(it);
  13.             }
  14.         }
  15.     }
  16. }

标签