歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Android開發教程:Service簡析

簡介

Service是Android 四大組件之一,它跟Activity的級別差不多,但是他不能自己運行,只能後台運行,並且可以和其他組件進行交互。

Service的啟動有兩種方式:context.startService()和context.bindService()。
 
1.使用context.startService()啟動Service

生命周期:
context.startService()  ->onCreate()- >onStart()->Servicerunning->context.stopService()

onDestroy() ->Service stop
 
如果Service還沒有運行,則android先調用onCreate()然後調用onStart();如果Service已經運行,則只調用onStart(),所以一個Service的onStart方法可能會重復調用多次。
 
stopService的時候直接onDestroy,如果是調用者自己直接退出而沒有調用stopService的話,Service會一直在後台運行。該Service的調用者再啟動起來後可以通過stopService關閉Service。
 
所以調用startService的生命周期為:onCreate --> onStart(可多次調用) --> onDestroy
 
2.使用context.bindService()啟動Service

生命周期:

context.bindService()->onCreate()->onBind()->Service running

onUnbind() ->onDestroy() ->Servicestop

onBind將返回給客戶端一個IBind接口實例,IBind允許客戶端回調服務的方法,比如得到Service運行的狀態或其他操作。這個時候把調用者(Context,例如Activity)會和Service綁定在一起,Context退出了,Srevice就會調用onUnbind->onDestroy相應退出。
     
所以調用bindService的生命周期為:onCreate --> onBind(只一次,不可多次綁定) --> onUnbind -->onDestory。
 
在Service每一次的開啟關閉過程中,只有onStart可被多次調用(通過多次startService調用),其他onCreate,onBind,onUnbind,onDestory在一個生命周期中只能被調用一次。

service可以在和多場合的應用中使用,比如播放多媒體的時候用戶啟動了其他Activity這個時候程序要在後台繼續播放,比如檢測SD卡上文件的變化,再或者在後台記錄你地理信息位置的改變等等。

下面是一個實際的例子:

這個例子有四個類:



其中和Service有關的是PlayMusicActivit.java和MusicService.java

PlayMusicActivit是一個啟動界面上面有四個按鈕分別來啟動、暫停、停止和關閉Service

MusicService是一個實際的Service類

另外連個類是用來做通知的,將在通知裡面講解

  1. package com.my;  
  2.   
  3. import android.app.Activity;  
  4. import android.app.NotificationManager;  
  5. import android.content.Intent;  
  6. import android.os.Bundle;  
  7. import android.view.View;  
  8. import android.widget.Button;  
  9.   
  10. public class PlayMusicActivity extends Activity {  
  11.     private static final int NOTIFICATION_ID = 10001;  
  12.   
  13.     private Button playBtn;  
  14.     private Button stopBtn;  
  15.     private Button pauseBtn;  
  16.     private Button closeBtn;  
  17.     private Button exitBtn;  
  18.   
  19.     @Override  
  20.     public void onCreate(Bundle savedInstanceState) {  
  21.         super.onCreate(savedInstanceState);  
  22.         setContentView(R.layout.main);  
  23.   
  24.         playBtn = (Button) findViewById(R.id.play_btn);  
  25.         stopBtn = (Button) findViewById(R.id.stop_btn);  
  26.         pauseBtn = (Button) findViewById(R.id.pause_btn);  
  27.         closeBtn = (Button) findViewById(R.id.close_btn);  
  28.         exitBtn = (Button) findViewById(R.id.exit_btn);  
  29.   
  30.         playBtn.setOnClickListener(new View.OnClickListener() {  
  31.   
  32.             @Override  
  33.             public void onClick(View v) {  
  34.                 Intent service = new Intent("com.my.musicService");  
  35.                 Bundle value = new Bundle();  
  36.                 value.putInt("opt"1);  
  37.                 service.putExtras(value);  
  38.                 startService(service);  
  39.                   
  40.             }  
  41.         });  
  42.         stopBtn.setOnClickListener(new View.OnClickListener() {  
  43.   
  44.             @Override  
  45.             public void onClick(View v) {  
  46.                 Intent service = new Intent("com.my.musicService");  
  47.                 Bundle value = new Bundle();  
  48.                 value.putInt("opt"2);  
  49.                 service.putExtras(value);  
  50.                 startService(service);  
  51.             }  
  52.         });  
  53.         pauseBtn.setOnClickListener(new View.OnClickListener() {  
  54.   
  55.             @Override  
  56.             public void onClick(View v) {  
  57.                 Intent service = new Intent("com.my.musicService");  
  58.                 Bundle value = new Bundle();  
  59.                 value.putInt("opt"3);  
  60.                 service.putExtras(value);  
  61.                 startService(service);  
  62.             }  
  63.         });  
  64.         closeBtn.setOnClickListener(new View.OnClickListener() {  
  65.   
  66.             @Override  
  67.             public void onClick(View v) {  
  68.                 PlayMusicActivity.this.finish();  
  69.             }  
  70.         });  
  71.         exitBtn.setOnClickListener(new View.OnClickListener() {  
  72.   
  73.             @Override  
  74.             public void onClick(View v) {  
  75.                 Intent service = new Intent("com.my.musicService");  
  76.                 stopService(service);  
  77.                 final NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);  
  78.                 nm.cancel(NOTIFICATION_ID);  
  79.                 PlayMusicActivity.this.finish();  
  80.             }  
  81.         });  
  82.     }  
  83.   
  84. }  
 
  1. package com.my;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import android.app.Service;  
  6. import android.content.Intent;  
  7. import android.media.MediaPlayer;  
  8. import android.os.Bundle;  
  9. import android.os.IBinder;  
  10. import android.util.Log;  
  11.   
  12. public class MusicService extends Service {  
  13.     private static final String TAG = "MusicService";  
  14.     private MediaPlayer mediaPlayer;  
  15.   
  16.     @Override  
  17.     public IBinder onBind(Intent intent) {  
  18.         return null;  
  19.     }  
  20.   
  21.     @Override  
  22.     public void onCreate() {  
  23.         Log.i(TAG, "create service");  
  24.         super.onCreate();  
  25.         if(mediaPlayer == null) {  
  26.             mediaPlayer = MediaPlayer.create(this, R.raw.he);  
  27.             mediaPlayer.setLooping(false);  
  28.         }  
  29.     }  
  30.       
  31.     @Override  
  32.     public void onDestroy() {  
  33.         Log.i(TAG, "destroy service");  
  34.         super.onDestroy();  
  35.         if(mediaPlayer != null) {  
  36.             mediaPlayer.stop();  
  37.             mediaPlayer.release();  
  38.         }  
  39.     }  
  40.       
  41.     @Override  
  42.     public void onStart(Intent intent, int startId) {  
  43.         Log.i(TAG, "start service");  
  44.         super.onStart(intent, startId);  
  45.         if(intent != null) {  
  46.             Bundle bundle = intent.getExtras();  
  47.             if(bundle != null) {  
  48.                 int opt = bundle.getInt("opt");  
  49.                 switch(opt) {  
  50.                 case 1:  
  51.                     play();break;  
  52.                 case 2:  
  53.                     stop();break;  
  54.                 case 3:  
  55.                     pause();break;  
  56.                 }  
  57.             }  
  58.         }  
  59.     }  
  60.       
  61.     private void play() {  
  62.         if(!mediaPlayer.isPlaying()) {  
  63.             mediaPlayer.start();  
  64.         }  
  65.     }  
  66.       
  67.     private void pause() {  
  68.         if(mediaPlayer != null && mediaPlayer.isPlaying()) {  
  69.             mediaPlayer.pause();  
  70.         }  
  71.     }  
  72.       
  73.     private void stop() {  
  74.         if(mediaPlayer != null) {  
  75.             mediaPlayer.stop();  
  76.             try {  
  77.                 mediaPlayer.prepare();  
  78.             } catch (IllegalStateException e) {  
  79.                 e.printStackTrace();  
  80.             } catch (IOException e) {  
  81.                 e.printStackTrace();  
  82.             }  
  83.         }  
  84.     }  
  85.       
  86. }  
Copyright © Linux教程網 All Rights Reserved