Android中Service和IntentService的差別
阿新 • • 發佈:2018-11-02
前言:
ServiceTimeout(20 seconds)小概率型別Service在特定的時間內無法處理完成,會造成ANR — 應用程式無響應(ANR:Application Not Responding)的情況
▲ 分析 :
避免ANR最核心的一點就是在主執行緒減少耗時操作。這時我們建議使用intentService處理。intentService是一個非同步的,會自動停止的服務,很好解決了傳統的Service中處理完耗時操作忘記停止並銷燬Service的問題
▲ 區別 :
1. 首先IntentService是繼承自Service;
2. Service不是一個單獨的程序,它和應用程式在同一個程序中;
3. Service也不是一個執行緒,所以我們要避免在Service中進行耗時的操作;
4. IntentService使用佇列的方式將請求的Intent加入佇列,然後開啟了一個Worker Thread(工作執行緒)在處理佇列中的Intent,對於非同步的startService請求,
IntentService會處理完成一個之後在處理第二個,每一個請求都會在一個單獨的Worker Thread中處理,不會阻塞應用程式的主執行緒。
因此,如果我們如果要在Service裡面處理一個耗時的操作,我們可以用IntentService來代替使用。
5. 使用IntentService 必須首先繼承IntentService並實現onHandleIntent()方法,將耗時的任務放在這個方法執行,其他方面,IntentService和Service一樣。
▲ 例子 :
Service_demo
public class MyService extends Service { @Override public void onCreate() { super.onCreate(); } @Override public void onStart(Intent intent, int startId) { super.onStart(intent, startId); //經測試,Service裡面是不能進行耗時的操作的,必須要手動開啟一個工作執行緒來處理耗時操作 Log.e("MyService","onStart"); try { Thread.sleep(20000); } catch (InterruptedException e) { e.printStackTrace(); } Log.e("MyService","睡眠結束"); } @Override public IBinder onBind(Intent intent) { return null; } }
IntentService_demo
public class MyIntentService extends IntentService { public MyIntentService() { super("donkor"); } @Override protected void onHandleIntent(Intent intent) { // 經測試,IntentService裡面是可以進行耗時的操作的 //IntentService使用佇列的方式將請求的Intent加入佇列,然後開啟一個worker thread(執行緒)來處理佇列中的Intent //對於非同步的startService請求,IntentService會處理完成一個之後再處理第二個 Log.e("MyIntentService","onStart"); try { Thread.sleep(20000); } catch (InterruptedException e) { e.printStackTrace(); } Log.e("MyIntentService","睡眠結束"); } }
TextServiceActivity
public class TextServiceActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
startService(new Intent(this,MyService.class));//主介面阻塞,最終會出現Application not responding
//連續兩次啟動IntentService,會發現應用程式不會阻塞,而且最重的是第二次的請求會再第一個請求結束之後執行(這個證實了IntentService採用單獨的執行緒每次只從佇列中拿出一個請求進行處理)
startService(new Intent(this,MyIntentService.class));
startService(new Intent(this,MyIntentService.class));
}
}