1. 程式人生 > >Android中Service和IntentService的差別

Android中Service和IntentService的差別

前言:

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));
    }  
}