Android Service與Activity之間的通訊(bindService啓動方式)

步驟:
1.在服務文件中提供Binder 下文中onBind()方法裏return的對象
2.在Activity文件中實現ServiceConnection,重寫兩個回調方法
3.在Activity文件中調用bindService(),傳遞ServiceConnection
4.系統調用onServiceConnected()的回調方法時,可以使用接口定義的方法開始調用服務
5.在Activity文件中斷開與服務的鏈接-------->調用unBindService()
web

onBind方法是Service與Activity之間創建通訊的橋樑(中間人),修改後的Service以下ide

public class BasisService extends Service {
    @Nullable
    public static final String TAG = "BasisService";
    private BasisBind basisBind;

    @Override
    public void onCreate() {
        Log.d(TAG, "------>onCreate()");
        basisBind = new BasisBind();
        super.onCreate();

    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(TAG, "------>onStartCommand()");
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        Log.d(TAG, "------>onDestroy()");
        super.onDestroy();

    }

    @Override
    public IBinder onBind(Intent intent) {
        Log.d(TAG, "------>onBind()");
        return basisBind;
    }

    @Override
    public boolean onUnbind(Intent intent) {
        Log.d(TAG, "------>onUnBind()");
        return super.onUnbind(intent);
    }

    public void show() {
        Toast.makeText(this, "成功", Toast.LENGTH_SHORT).show();
    }

    public class BasisBind extends Binder {
        public void realize() {
            show();
        }
    }
}

相對於上文Android Service的基本用法添加了一個 onUnbind方法,以及一些操做在這裏插入圖片描述
下面開始介紹下bindService啓動方式
在這裏插入圖片描述
能夠看到其中有三個參數,第二個參數以下svg

在這裏插入圖片描述
Java文件以下this

public class StartSevice extends AppCompatActivity implements View.OnClickListener {

    private Button btn_start;
    private MyConn conn;
    private BasisService.BasisBind basisBind;
    private Button btn_stop;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_start_sevice);
        conn = new MyConn();
        initView();
    }

    private void initView() {
        btn_start = (Button) findViewById(R.id.btn_start);

        btn_start.setOnClickListener(this);

        btn_stop = (Button) findViewById(R.id.btn_stop);
        btn_stop.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {

        switch (v.getId()) {

            case R.id.btn_start:
                //綁定的方式啓動
                Intent bindIntent = new Intent(this, BasisService.class);
                bindService(bindIntent, conn, BIND_AUTO_CREATE);
                break;

            case R.id.btn_stop:
                //建議寫在onDestroy()方法中,這裏只爲顯示效果
                unbindService(conn);
                break;
        }

    }

    public void verify() {
        //脫離了service的體系,不能用new對象來調用服務的方法
        BasisService service = new BasisService();
        service.show();
    }

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

    //ServiceConnection 服務鏈接
    private class MyConn implements ServiceConnection {
        //當服務鏈接時,若是綁定的服務onBind()沒有返回值,則不執行該方法
        //第三個參數iBinder:能夠轉化成在服務裏寫的自定義IBinder
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            //拿到中間人
            basisBind = (BasisService.BasisBind) iBinder;
            basisBind.realize();
        }

        @Override
        public void onServiceDisconnected(ComponentName componentName) {

        }
    }

}

下面運行經過看日誌瞭解一下其生命週期
1.綁定服務
在這裏插入圖片描述
2.屢次綁定,沒有日誌
3.解綁服務在這裏插入圖片描述
由此能夠發現這種啓動方式的生命週期與startService啓動方式生命週期是不一樣的.net

本文同步分享在 博客「計蒙不吃魚」(CSDN)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。日誌

相關文章
相關標籤/搜索