Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android四大組件之Service和子類IntentService

android四大組件之Service和子類IntentService

編輯:關於Android編程

四大組件中, Service跟Activity的生命周期非常類似,它也是可執行的.甚至可看做是沒有界面的"Activity", 因為它的運行,用戶並不會像Activity那樣能看到它能呈現出來具體的視圖界面. 同樣,就像Activity一樣, 需要繼承Service來使用它的子類. 並且同樣需要在AndroidManifest.xml中配置所定義的Service.


Service的生命周期

\

簡述上面周期中的幾個方法:<喎?/kf/ware/vc/" target="_blank" class="keylink">vc3Ryb25nPjwvcD4KPHA+MSwgyOfNvMq+LFNlcnZpY2UgtcS8uLj2t723qG9uQ3JlYXRlKCksIG9uRGVzdHJveSgpyse4+kFjdGl2aXR50rvR+bXELLa8yse0tL2ous3P+rvZx7C72LX3tcS3vbeoLlNlcnZpY2XU2kFjdGl2aXR5wO+xu7S0vajG9Lavus3No9a5LCDSsr/J0tTU2tfUye3KudPDc3RvcFNlbGYoKcC0zaPWuS48L3A+CjxwPjxicj4KPC9wPgo8cD4yLCBvblN0YXJ0KCkg1NrQwrDmsb7S0b6tsbtvblN0YXJ0Q29tbWFuZCgpy/m0+szmLMjnufvKx9Om08PWp7PWvsmw5rG+tcTPtc2zLNTyvMzQ+NPDb25TdGFydCgpLiAgb25TdGFydCgwILrNb25TdGFydENvbW1hbmQoKSC2vMrHU2VydmljZcb0tq/Ksbvhu9i197XEt723qC4gyOe5+8rHzai5/XN0YXJ0U2VydmljZSgpwLTG9LavU2VydmljZSzEx8O0w7+0zsb0tq+2vLvhu9i1929uU3RhcnRDb21tYW5kKCkg1eK49re9t6guPC9wPgo8cD48YnI+CjwvcD4KPHA+Mywgb25CaW5kKCksIFNlcnZpY2Wxu7DztqjKsbvYtfe1xLe9t6guIDwvcD4KPHA+PGJyPgo8L3A+CjxwPjQsIG9uVW5iaW5kKCksIFNlcnZpY2W6zcv5sPO2qLXEy/nT0EFjdGl2aXR5try2z7+qyrG74bvYtfe4w7e9t6guPC9wPgo8cD48YnI+CjwvcD4KPHA+PHN0cm9uZz7V4sDv0qrHv7X3z8JBY3Rpdml0ecb0tq9TZXJ2aWNltcTBvdbWt723qLrNx/ix8Do8L3N0cm9uZz48L3A+CjxwPkFjdGl2aXR5v8nS1M2ouf1zdGFydFNlcnZpY2UoKSC6zSBiaW5kU2VydmljZSgpIMG9uPa3vbeowLTG9LavLiBzdGFydFNlcnZpY2UoKcb0tq9TZXJ2aWNlLCBBY3Rpdml0ebrNU2VydmljZdauvOTDu9PQudjBqiwgtbFBY3Rpdml0ec3Ls/bByyxTZXJ2aWNlu+G8zND4tObU2rKi1MvQ0C4gtvhiaW5kU2VydmljZSgpILe9yr3G9LavtcS7sCxBY3Rpdml0ebrNU2VydmljZcrH09C52MGqtcQsQWN0aXZpdHmyu732xNy6zVNlcnZpY2XNqNDFLLKix9K1sUFjdGl2aXR5zcuz9sqxLFNlcnZpY2XSsrvh1tDWuS7PwsPmu+HJz7j2wP3X0yzNqLn9tPrC67+0s/bH+LHwOjwvcD4KPHA+PGJyPgo8L3A+CjxoMj7F5NbDt73KvTwvaDI+CjxwPjxwcmUgY2xhc3M9"brush:java;">


新建兩個Service:

**
 * 通過StartService()來啟動的Service對象
 * @author Mr.Et
 *
 */
public class MyStartService extends Service{
	private String TAG = "MyStartService";
	
	@Override
	public void onCreate()
	{
		Log.i(TAG, "onCreate()");
		super.onCreate();
		
	}
	
	/**
	 * Service被啟動後會回調該方法
	 */
	@Override
	public int onStartCommand(Intent intent,int flags,int startId)
	{
		Log.i(TAG, "onStartCommand()");
		super.onStartCommand(intent, flags, startId);
		return START_STICKY;
	}
	
	/**
	 * (該方法必須被實現)
	 * 綁定Service時會回調該方法
	 */
	@Override
	public IBinder onBind(Intent intent) {
		//這裡默認為空,如果需要傳回Binder對象跟Activity通信
		//則可以繼承Binder來實現返回對象即可.
		Log.i(TAG, "onBind()");
		return null;
	}
	
	@Override
	public void onDestroy()
	{
		super.onDestroy();
		Log.i(TAG, "onDestroy()");
	}
	
}

/**
 * 通過bindService()來啟動的Service對象
 * @author Mr.Et
 *
 */
public class MyBindService extends Service{
	private String TAG = "MyBindService";
	
	
	public class MyBinder extends Binder
	{
		public void printContent()
		{
			Log.i(TAG, "print the content in Class - MyBinder.");
		}
	}
	
	/**
	 * Service被創建是會回調該方法
	 */
	@Override
	public void onCreate()
	{
		Log.i(TAG, "onCreate()");
		super.onCreate();
	}
	
	/**
	 * Service被啟動後會回調該方法
	 */
	@Override
	public int onStartCommand(Intent intent,int flags,int startId)
	{
		Log.i(TAG, "onStartCommand()");
		super.onStartCommand(intent, flags, startId);
		return START_STICKY;
	}
	
	/**
	 * 綁定Service時會回調該方法
	 */
	@Override
	public IBinder onBind(Intent intent) {
		Log.i(TAG, "onBind()");
		// 返回Binder的子類MyBinder和Activity通信
		return new MyBinder();
	}
	
	/**
	 * 如果前面是通過bindService()來綁定啟動Service的,
	 * 那麼當解綁停止Service時會調用該方法
	 */
	@Override
	public boolean onUnbind(Intent intent)
	{
		Log.i(TAG, "onUnbind()");
		return true;
	}
	
	/**
	 * Service被銷毀前會回調該方法
	 */
	@Override
	public void onDestroy()
	{
		Log.i(TAG, "onDestroy()");
		super.onDestroy();
	}
	
}

啟動Service的方法

第一種,startService()啟動Service

Intent StartIntent = new Intent(this,MyStartService.class);
	
	/**
	 * 通過startService()啟動Service
	 * 這種方式
	 */
	private void doStartService()
	{	
		//類似廣播,也可以用setAction("XXX")使特定的Service啟動
		//StartIntent.setAction("com.test.service.My_MSG");
		//創建Intent,跟跳轉Activity的方式類似
		Intent StartIntent = new Intent(this,MyStartService.class);
		startService(StartIntent);
	}
	
	/**
	 * 停止Service
	 */
	private void doStopService()
	{
		stopService(StartIntent);
	}

第二種,bindService()啟動(綁定)Service

private MyBinder myBinder;
	
	private ServiceConnection conn = new ServiceConnection() {
		//當Activity和Service連接成功時會調用該方法
		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			// TODO Auto-generated method stub
			//在這裡通過自定義的Binder與Service通信
			myBinder = (MyBinder)service;
		}

		
		//當Activity和Service斷開連接時會調用該方法
		@Override
		public void onServiceDisconnected(ComponentName name) {
			// TODO Auto-generated method stub
			
		}
		
	};
	
	/**
	 * 通過bindService()啟動(綁定)Service
	 */
	private void doBindSerive()
	{
		Intent bindIntent = new Intent();
		bindIntent.setAction("com.test.service.My_MSG");
		//當Service還沒創建時,
		//第三個參數如果為0則不自動創建Service,為Service.BIND_AUTO_CREATE則自動創建
		bindService(bindIntent, conn, Service.BIND_AUTO_CREATE);
	}
	
	/**
	 * 解除綁定Service
	 */
	private void doUnbindService()
	{
		unbindService(conn);
	}

ServiceConnection對象 conn是通過綁定方式啟動,和Service通信的重要中介.當和Service連接成功和斷開連接時都會回調裡面的onServiceConnected() 和onServiceDisconnected() 方法. 但如果是用戶主動使用unBindService()斷開Activity和Service之間的連接,onServiceDisconnected()並不會被調用.因為系統將這視為正常情況. 只有是由於內存不足或其他原因導致異常中止Service和Activity之間的連接時,才會調用該方法. 並且可以通過在conn中獲取Binder對象, 實現和Service的通信.

IntentService和Service的區別

系統提供了IntentService, 它是Service的子類.默認新建新的線程在運行. 而Service是缺少這個特質的,因為Service和調用者( 比如某個Activity )是運行在同一個進程中,會直接和調用競爭有限的資源,所以Service不適合用於處理耗時耗資源的任務,否則極易阻塞主線程導致ANR錯誤.

而IntentService 是這一情況的比較好的解決方案. 它自動實現多線程, 會新建工作線程專門處理任務, 同時使用了隊列來管理請求啟動IntentService的各個Intent. 比如當有3個intent都請求該IntentService,那麼IntentService會按照隊列順序依次去新建線程,處理任務,保證在同一時間內只有一個intent在調用該intentService.當調用完畢會intentService會自動停止自身,並處理下一次的調用.直至最後.所以如果使用intentService, 用戶並不需要主動的使用stopService() 或者在intentService中使用stopSelf()來停止.

繼承IntentService必須實現onHandleIntent()方法, 將耗時的任務放在這個方法內即可. 其他方面,IntentService跟普通Service一樣.




  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved