步骤:
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源创计划”,欢迎正在阅读的你也加入,一块儿分享。日志