Android學習--探究服務(二)

 

服務的基本用法java


 

      定義服務: 咱們須要先建立服務,咱們要使用就的利用一個類去繼承它,而後重寫它的幾個方法,具體的咱們看下面的代碼:多線程

 

      咱們重寫了下面三個方法:ide

      * onCreate()                 服務建立的時候調用this

      * onStartCommand()     每次服務啓動的時候調用線程

      * onDestory()                服務銷燬的時候調用3d

      注意點: 首先要明白咱們的onCreate()方法,咱們說了它只會在服務被建立的時候調用,以後你開啓服務的時候是不會再調用這個onCreate()方法了,沒啓動一次只會走 onStartCommand()方法,onDestory()是在服務被銷燬的時候調用,下面咱們再看看它的啓動。component

Intent startIntent = new Intent(this,MyService.class);

// 啓動服務
startService(startIntent);
// 中止服務
stopService(startIntent);

 

活動和服務之間的通訊blog


 

      首先咱們的完善咱們的服務類,在咱們的服務類中添加  Binder 類,這個類會對咱們想要在服務類中作的事作一個管理:繼承

class MyService extends Service{

    public MyService() {
    }

    private DownloadBinder downloadBinder = new DownloadBinder();
    class DownloadBinder extends Binder{

        public void startDownload(){

            Log.d("DownloadBinder","startDownload");
        }

        public  int getProgress(){

            Log.d("DownloadBinder","getProgress");
            return 0;
        }
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return downloadBinder;
    }

    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }
}

 

      接着咱們看在活動裏面是怎樣和這個服務類進行一個綁定的,具體的須要注意的地方咱們都加了註釋,就不在這裏在重複,注意看註釋就能夠:生命週期

 /*
    *
    * 首先咱們建立一個ServiceConnection匿名類,在裏面重寫了onServiceConnected和onServiceDisconnected方法
    * 這兩個方法分別在活動和服務成功綁定的時候和解綁的時候調用
    *
    * */
    private MyService.DownloadBinder downloadBinder;
    private ServiceConnection connection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            // 綁定成以後咱們就能夠隨意的使用調用服務中的方法了
            downloadBinder = (MyService.DownloadBinder) iBinder;
            downloadBinder.startDownload();
            downloadBinder.getProgress();
        }

        @Override
        public void onServiceDisconnected(ComponentName componentName) {

        }
    };


    // 綁定和解綁按鈕事件來綁定和解綁
    @Override
    public void onClick(View view) {

        switch (view.getId()){
            // 活動綁定服務
            case R.id.bind_service:

                // 綁定的時候使用bindService方法,參數分別是 Intent 和 connection
                Intent bindIntent = new Intent(this,MyService.class);
                bindService(bindIntent,connection,BIND_AUTO_CREATE);
                break;

            // 活動解綁服務
            case R.id.unbind_service:

                unbindService(connection);
                break;

            default:
                break;
        }

    }

 

 

服務的生命週期


  

      咱們經過下面的兩張圖說一下服務的生命週期:

 

      Service生命週期流程圖:

      咱們在經過下面的一個調用順序來解讀一下這生命週期:

 

 

 

 

 服務使用的兩個小技巧


  

      一、使用前臺服務
 
          服務幾乎都是在後臺運行的,但因爲服務的優先級比較低,當系統出現內存不足的狀況的時候就有可能回收掉正在後臺運行的服務,若是咱們想服務一直保持運行狀態,而不會因爲系統內存不足緣由致使服務被回收掉,就能夠考慮使用前臺服務,前臺服務和普通服務最大的區別就在於他會一直有一個正在運行的圖標在系統的狀態欄顯示。
 
          咱們經過下面的代碼展現如何建立一個前臺服務:
 
 
 
      二、使用IntentService
 
           話說回來,在前面咱們就有說過,服務中的代碼是默認運行在主線程中的,若是直接在服務中處理洗衣額好事的邏輯,就很容易出現ANR (Application Not Responding),因此這個時候咱們就須要使用安卓的多線程技術,咱們應該在服務中的每一個具體的方法裏開啓一個子線程,而後去處理一些耗時的操做。
 
           按照咱們的邏輯,咱們就須要開啓多線程,執行耗時操做,而後在操做完成以後關閉服務,代碼以下:

 

      可咱們還有更簡單的方法來作這件事,利用咱們要說的 IntentService
  

 

       經過上面這兩篇文章,關於Android服務大概就介紹完了。
相關文章
相關標籤/搜索