今天無意中接觸到IntenService。不知其意,于是,百度之。
IntentService 和Service是經常作為比較的對象,不隻是是因為有公共的名字“Service”,而且還因為IntentService是繼承自Service的。那麼,兩者究竟有什麼樣的差別和聯系呢。
Service的話,作為android開發者都比較熟悉,它主要用在背景運作。例如:使用UC浏覽器上網的時候,天天動聽播放着音樂。那麼IntentService繼承自Service的話,這一作用 也是具備的。
Service 的話在主線程中,是以它不能處理耗時太多的操作,如果需要處理耗時太多的操作的話,那麼則需要另外開發線程進行處理;比如說操作資料庫、連接配接網絡等。
而IntentService的話,它本身對于資料的處理另外開辟了線程進行處理,是以我的了解是它對Service做了一個很好的封裝。它的實作機制是首先,建立一個消息隊列,如果有任務需要進行處理的話,那麼首先将任務加載到消息隊列中,而真正處理消息的則在WrokThread線程中。通過先來先服務的方式對消息進行處理。
以下是兩者關系示意圖:
兩者的實作方式大體差不多,細節上有所不同,先來看看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的作用了,它用于背景處理耗時的操作,諸如聯網,操作資料庫等。