步驟:
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源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。日誌