Service启动方式之bindService
2018-01-18 17:57
267 查看
“迷津欲有问,平海夕漫漫。”在未来的开发道路中,我们要刻苦钻研,用心去研究理论知识,只有树立远大的目标(架构师)我们才有一个动力。一、使用场景在同个app之间调用(即是同一个进程中)
在不同app之间调用(即是跨进程间通信)
注意:进程和线程的关系(阅读我的博客文章Java基础:http://blog.csdn.net/join_xiao/article/details/79097933)
二、代码示例同个app间调用(该服务只启动一次)activity界面代码
service代码
同个app间调用(该服务只启动多次)
在不同app之间调用(即是跨进程间通信)
注意:进程和线程的关系(阅读我的博客文章Java基础:http://blog.csdn.net/join_xiao/article/details/79097933)
二、代码示例同个app间调用(该服务只启动一次)activity界面代码
public class BinderActivityA extends AppCompatActivity implements View.OnClickListener { private Button btn1; private Button btn2; private Button btn3; private Button btn4; private BindService bindService = null; private boolean isBound = false; private ServiceConnection conn = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { isBound = true; BindService.MyBinder binder = (BindService.MyBinder) service; bindService = binder.getService(); int num = bindService.getRandomNumber(); Log.v("test","numA="+num); } //client 和service连接意外丢失时,会调用该方法 @Override public void onServiceDisconnected(ComponentName name) { Log.v("test","onServiceDisconnected A"); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_binder_acticity); findLayoutView(); setLister(); initData(); } private void findLayoutView() { btn1 = (Button) findViewById(R.id.btn1); btn2 = (Button) findViewById(R.id.btn2); btn3 = (Button) findViewById(R.id.btn3); btn4 = (Button) findViewById(R.id.btn4); } private void setLister() { btn1.setOnClickListener(this); btn2.setOnClickListener(this); btn3.setOnClickListener(this); btn4.setOnClickListener(this); } private void initData() { } @Override public void onClick(View v) { Intent intent = null; switch (v.getId()){ case R.id.btn1: intent = new Intent(BinderActivityA.this, BindService.class); intent.putExtra("from", "ActivityA"); bindService(intent,conn,BIND_AUTO_CREATE); break; case R.id.btn2: if (isBound){ isBound = false; Log.v("test","ActicityA is unbindService"); unbindService(conn); } break; case R.id.btn3: intent = new Intent(this, BinderActivityB.class); startActivity(intent); break; case R.id.btn4: this.finish(); break; } } @Override protected void onDestroy() { super.onDestroy(); Log.i("test", "ActivityA -> onDestroy"); }
service代码
public class BindService extends Service { public class MyBinder extends Binder { public BindService getService(){ return BindService.this; } } //通过binder实现了 调用者(client)与 service之间的通信 private MyBinder binder = new MyBinder(); private final Random generator = new Random(); @Override public void onCreate() { super.onCreate(); Log.i("test","BindService -> onCreate, Thread: " + Thread.currentThread().getName()); } @Override public IBinder onBind(Intent intent) { Log.i("test", "BindService -> onBind, Thread: " + Thread.currentThread().getName()); return binder; } @Override public boolean onUnbind(Intent intent) { Log.i("test", "BindService -> onUnbind, from:" + intent.getStringExtra("from")); return false; } @Override public int onStartCommand(Intent inten 9a90 t, int flags, int startId) { Log.i("test", "BindService -> onStartCommand, startId: " + startId + ", Thread: " + Thread.currentThread().getName()); return START_NOT_STICKY; } @Override public void onDestroy() { Log.i("test", "BindService -> onDestroy, Thread: " + Thread.currentThread().getName()); super.onDestroy(); } //在Service中暴露出去的方法,供client调用 public int getRandomNumber(){ return generator.nextInt(); } }
同个app间调用(该服务只启动多次)
public class BinderActivityB extends Activity implements View.OnClickListener { private Button btn1; private Button btn2; private Button btn4; private BindService bindService = null; private boolean isBound = false; private ServiceConnection conn = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { isBound = true; BindService.MyBinder binder = (BindService.MyBinder) service; bindService = binder.getService(); int num = bindService.getRandomNumber(); Log.v("hjz","numB="+num); } @Override public void onServiceDisconnected(ComponentName name) { Log.v("hjz","onServiceDisconnected B"); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_binder_b); findLayoutView(); setLister(); initData(); } private void findLayoutView() { btn1 = (Button) findViewById(R.id.btn1); btn2 = (Button) findViewById(R.id.btn2); btn4 = (Button) findViewById(R.id.btn4); } private void setLister() { btn1.setOnClickListener(this); btn2.setOnClickListener(this); btn4.setOnClickListener(this); } private void initData() { } @Override public void onClick(View v) { Intent intent = null; switch (v.getId()){ case R.id.btn1: intent = new Intent(BinderActivityB.this, BindService.class); intent.putExtra("from", "ActivityB"); bindService(intent,conn,BIND_AUTO_CREATE); break; case R.id.btn2: if (isBound){ isBound = false; Log.v("hjz","ActicityB is unbindService"); unbindService(conn); } break; case R.id.btn4: this.finish(); break; } } @Override protected void onDestroy() { super.onDestroy(); Log.i("hjz", "ActivityB -> onDestroy"); } }我们进行分析可得出如下流程图:
相关文章推荐
- Android 启动 Service(startservice和bindservice) 两种方式的区别
- Android 启动 Service(startservice和bindservice) 两种方式的区别
- 启动service的两种方式:startService与bindService的区别
- android Service(二) activity启动Service方式二:bindService()
- 用bindService()启动Service的方式与生命周期
- 服务启动方式三-使用bindService方式启动服务
- Android 两种启动Service(远程)的方式:Bind 与Start
- 启动service的两种方式:startService与bindService的区别
- android90 bind方式启动服务service调用service里的方法
- Android -- service两种启动方式startService与bindService
- Android Service学习篇三:Service启动方式之bindService
- (一)Service的生命周期和两种启动方式
- 关于service启动方式
- service 总结之启动方式和生命周期
- 用BindService 启动注意点
- mysql启动方式:service mysqld start
- Android四大组件Service之bindService启动
- Service 启动 Bind与unBind
- 配置tomcat & nginx以service方式启动
- 安卓Service绑定方式启动服务并调用服务中的方法