天天看點

你所不知道的IntentService

  今天無意中接觸到IntenService。不知其意,于是,百度之。

  IntentService 和Service是經常作為比較的對象,不隻是是因為有公共的名字“Service”,而且還因為IntentService是繼承自Service的。那麼,兩者究竟有什麼樣的差別和聯系呢。

  Service的話,作為android開發者都比較熟悉,它主要用在背景運作。例如:使用UC浏覽器上網的時候,天天動聽播放着音樂。那麼IntentService繼承自Service的話,這一作用  也是具備的。

  Service 的話在主線程中,是以它不能處理耗時太多的操作,如果需要處理耗時太多的操作的話,那麼則需要另外開發線程進行處理;比如說操作資料庫、連接配接網絡等。

 而IntentService的話,它本身對于資料的處理另外開辟了線程進行處理,是以我的了解是它對Service做了一個很好的封裝。它的實作機制是首先,建立一個消息隊列,如果有任務需要進行處理的話,那麼首先将任務加載到消息隊列中,而真正處理消息的則在WrokThread線程中。通過先來先服務的方式對消息進行處理。

以下是兩者關系示意圖:

你所不知道的IntentService

兩者的實作方式大體差不多,細節上有所不同,先來看看IntentService

我們需要進行耗時操作處理的話。繼承IntentService。然後重寫onHandleIntent 方法。我們的耗時處理實作寫于此方法即可。

public class MyIntentService extends IntentService {

	public MyIntentService() {
		super("android");
	}

	@Override
	protected void onHandleIntent(Intent intent) {
		System.out.println("begin");
		try {
			Thread.sleep(20000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("end");

	}

}
           

接着我們再來看Servie

public class MyService extends Service {

	public void onCreate() {
		super.onCreate();
		System.out.println("create");
	}

	public void onStart(Intent intent, int startId) {
		super.onStart(intent, startId);
		System.out.println("begin");
		try {
			Thread.sleep(20000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("end");

	}

	@Override
	public IBinder onBind(Intent intent) {
		return null;
	}
}
           

我們在onStart方法中進行處理。但是我們不能處理耗時比較長的操作。如果需要的話,我們必須另起線程進行處理。

再說一句,上述兩者都是通過startService方式啟動的。

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		startService(new Intent(this, MyService.class));
		startService(new Intent(this, MyIntentService.class));
		startService(new Intent(this, MyIntentService.class));
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		// getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}
           

好了,現在我們就知道了IntentService的作用了,它用于背景處理耗時的操作,諸如聯網,操作資料庫等。

繼續閱讀