您的位置:首页 > 其它

Service启动方式之bindService

2018-01-18 17:57 267 查看
   “迷津欲有问,平海夕漫漫。”在未来的开发道路中,我们要刻苦钻研,用心去研究理论知识,只有树立远大的目标(架构师)我们才有一个动力。一、使用场景在同个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");
}
}
我们进行分析可得出如下流程图:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: