1. 程式人生 > >Android 學習之路 四大元件之service

Android 學習之路 四大元件之service

1 程序概念介紹

  四大元件都是執行在主執行緒

  Android中的服務 也是在後臺執行  可以理解成是在後臺執行並且是沒有介面的Activity

  (1)Foreground process 前臺程序  使用者正在互動  可以理解成相 當於 Activity執行onResume方法

  (2)Visible process 可視程序 使用者沒有在互動 但使用者還一直能看得見頁面 相當於Activity執行了onPause方法 

  (3)Service Process  服務程序  通過startService()開啟了一個服務

  (4)Background process  後臺程序  當前使用者看不見頁面 相當於Activity執行了onStop方法

  (5)Empty process 空程序 不回維持任何元件(使用者一直按返回鍵 任務棧銷燬,但程序還在)

2 start方式開啟服務的特點

服務的生命週期

oncreate()

onstartCommand()

ondestory()

  服務是在後臺執行 可以理解成是沒有介面的activity

  定義四大元件的方式都是一樣的  

  定義一個類繼承Service

   特點:

  (1)服務通過startservice方式開啟 第一次點選按鈕開啟服務 會執行服務的onCreate 和 onStart方法

  (2)如果第二次開始在點選按鈕開啟服務 服務之後執行onStrat方法

  (3)服務被開啟後 會在設定頁面裡面的 running裡面找得到這個服務 

  (4)startservice 方式開啟服務 服務就會在後臺長期執行 直到使用者手工停止 或者呼叫StopService方法 服務才會被銷燬

3.bindService

為了呼叫服務中的方法引入bindservice

(1)服務通過bindService方式開啟 第一次點選按鈕開啟服務 會執行服務的onCreate 和 onBind方法

  (2)如果第二次在點選按鈕開啟服務 服務無響應

  (3)當onbind方法返回的值為null時,onserviceConnected方法不執行的

  (4)不求同日生 但求同日死  activity和服務之間

 (5)服務不可以多次解綁,多次解綁會異常

(6)通過bindService開啟的服務在設定頁面的正在執行中無法找到 相當於一個隱形服務

4.百度音樂盒小案例 (不實現具體功能只練習bindservice 混合開啟服務)

業務需求:該服務既要持續在後臺執行 也要呼叫服務中的方法

1.先呼叫startService開啟服務

2.呼叫bindService繫結服務 傳遞方法

3.unBindService解綁服務

public class MainActivity extends AppCompatActivity {
    private UseMusic um;
    private MainActivity.myConn myConn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //混合開啟服務
        //1.先start開啟服務
        Intent intent = new Intent(this, MusicService.class);
        startService(intent);
        //2.用bind開啟服務 可以傳遞ibinder 從而可以呼叫方法
        myConn = new myConn();
        bindService(intent,myConn,BIND_AUTO_CREATE);

    }
    public class myConn implements ServiceConnection{




        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
             um = (UseMusic) service;
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    }
    public void play(View v){
        um.callPlay();

    }
    public void pause(View v){
       um.callPause();

    }
    public void continuePlay(View v){
        um.callRePlay();

    }


    @Override
    protected void onDestroy() {
        //解綁
        unbindService(myConn);
        super.onDestroy();
    }

}
public class MusicService extends Service {
    //一定要記得在onbind方法中把mybinder傳遞過去
    @Override
    public IBinder onBind(Intent intent) {
        return new myBinder();
    }

    @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();
    }
    public void play(){
        System.out.println("播放");
    }
    public void pause(){
        System.out.println("暫停");
    }
    public void replay(){
        System.out.println("繼續播放");
    }
//定義一個Ibinder類的實現類(中間人物件 可以在外面的類中呼叫服務中的方法)繼承一個介面的實現子類
    public class myBinder extends Binder implements UseMusic{


    @Override
    public void callPlay() {
        play();

    }

    @Override
    public void callPause() {
        pause();
    }

    @Override
    public void callRePlay() {
        replay();
    }
}
}
//在介面中暴漏想要暴露的方法
public interface UseMusic {
    public void callPlay();
    public void callPause();
    public void callRePlay();
}

 

aidl程序間的通訊