一、IntentService簡介
IntentService是Service的子類,比普通的Service增加瞭額外的功能。先看Service本身存在兩個問題:
-
Service不會專門啟動一條單獨的進程,Service與它所在應用位於同一個進程中;
-
Service也不是專門一條新線程,因此不應該在Service中直接處理耗時的任務;
二、IntentService特征
-
會創建獨立的worker線程來處理所有的Intent請求;
-
會創建獨立的worker線程來處理onHandleIntent()方法實現的代碼,無需處理多線程問題;
-
所有請求處理完成後,IntentService會自動停止,無需調用stopSelf()方法停止Service;
-
為Service的onBind()提供默認實現,返回null;
-
為Service的onStartCommand提供默認實現,將請求Intent添加到隊列中;
三、使用步驟(詳情參考Service項目)
-
繼承IntentService類,並重寫onHandleIntent()方法即可;
MainActivity.java文件
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void startService(View source) { // 創建所需要啟動的Service的Intent Intent intent = new Intent(this, MyService.class); startService(intent); } public void startIntentService(View source) { // 創建需要啟動的IntentService的Intent Intent intent = new Intent(this, MyIntentService.class); startService(intent); } }
MyIntentService.java文件
public class MyIntentService extends IntentService { public MyIntentService() { super("MyIntentService"); } @Override protected void onHandleIntent(Intent intent) { // IntentService會使用單獨的線程來執行該方法的代碼 // 該方法內執行耗時任務,比如下載文件,此處隻是讓線程等待20秒 long endTime = System.currentTimeMillis() + 20 * 1000; System.out.println("onStart"); while (System.currentTimeMillis() < endTime) { synchronized (this) { try { wait(endTime - System.currentTimeMillis()); } catch (InterruptedException e) { e.printStackTrace(); } } } System.out.println("----耗時任務執行完成---"); } }
MyService.java文件
public class MyService extends Service { @Override public IBinder onBind(Intent arg0) { return null; } @Override public int onStartCommand(Intent intent, int flags, int startId) { // 該方法內執行耗時任務可能導致ANR(Application Not Responding)異常 long endTime = System.currentTimeMillis() + 20 * 1000; System.out.println("onStart"); while (System.currentTimeMillis() < endTime) { synchronized (this) { try { wait(endTime - System.currentTimeMillis()); } catch (InterruptedException e) { e.printStackTrace(); } } } System.out.println("----耗時任務執行完成---"); return START_STICKY; } }
運行上述代碼,啟動MyIntentService的會使用單獨的worker線程,因此不會阻塞前臺的UI線程;而MyService會
-
-