Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android基本功:IntentService的使用

Android基本功:IntentService的使用

編輯:關於Android編程

一、IntentService簡介

IntentService是Service的子類,比普通的Service增加了額外的功能。先看Service本身存在兩個問題:

  • Service不會專門啟動一條單獨的進程,Service與它所在應用位於同一個進程中;

  • Service也不是專門一條新線程,因此不應該在Service中直接處理耗時的任務;

    二、IntentService特征

    • 會創建獨立的worker線程來處理所有的Intent請求;

    • 會創建獨立的worker線程來處理onHandleIntent()方法實現的代碼,無需處理多線程問題;

    • 所有請求處理完成後,IntentService會自動停止,無需調用stopSelf()方法停止Service;

    • 為Service的onBind()提供默認實現,返回null;

    • 為Service的onStartCommand提供默認實現,將請求Intent添加到隊列中;

      三、使用步驟(詳情參考Service項目)

      1. 繼承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會

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved