一,怎么让他们之间通信呢?
先看下Context的bindService()方法
public boolean bindService(Intent service, ServiceConnection conn, int flags) {
throw new RuntimeException("Stub!");
}
service :该参数通过Intent指定要启动的Service
conn: 是一个ServiceConnection对象,用于监听访问者与Service之间的连接状态,;
fkags:指定绑定是是否自动创建Service,0(不创建) BIND_AUTO_CREATE(自动创建);
IBinder对象相当于Service组件的内部钩子,关联到绑定的Service组件,其他程序组件绑定该Service时,Service就会把IBinder对象返回给其他程序组件。
代码如下:
/**
* Created by CWJ on 2019/3/8.
* Author:Chen
* Email:1181620038@qq.com
* Ver:1
* DEC: 通过StartService Service与访问者之间基本上不存在太多的管理,因此Service与访问者无法进行通信,交换数据
*/
public class BindService extends Service {
private int count = 1;
private boolean quit;
//这里内部类
private MyBinder binder = new MyBinder();
@Override
public void onCreate() {
super.onCreate();
new Thread() {
@Override
public void run() {
while (!quit) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
count++;
Log.e("count", "count" + count);
}
}
}.start();
}
@Override
public boolean onUnbind(Intent intent) {
Log.e("", "当Service被断开连时,会回调该方法");
return true;
}
/**
* 被关闭之前回调该方法
*/
@Override
public void onDestroy() {
super.onDestroy();
this.quit = true;
}
//定义OnBinder方法所返回的对象 Service 允许客户端通过该Ibinder对象来访问Service内部的数据
public class MyBinder extends Binder {
public int getCount() {
/**
* 获取Service的运行状态:count
*/
return count;
}
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
//返回IBinder对象
//这里可以让Service访问到Activity传来的数据
String date = intent.getStringExtra("activity");
Log.e("date:", date);
return binder;
}
activity
public class ServiceActivity extends AppCompatActivity {
BindService.MyBinder binder;
public Button btn;
public Button btn1;
public Button btn2;
Intent intent;
/* 定义一个ServicesCounnection对象*/
private ServiceConnection conn = new ServiceConnection() {
/**
* 当Activity与Service连接成功时回调该方法
*
* @param componentName
* @param iBinder
*/
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
//获取Service的OnBind方法所返回的MyBinder对象
binder = (BindService.MyBinder) iBinder;
}
/**
* 断开时调用
* @param componentName
*/
@Override
public void onServiceDisconnected(ComponentName componentName) {
}
};
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_server);
intent = new Intent(this, BindService.class);
intent.putExtra("activity","AAAAAAAAAAAAAAAAA");
btn = findViewById(R.id.btn);
btn1 = findViewById(R.id.btn1);
btn2 = findViewById(R.id.btn2);
//绑定
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
bindService(intent, conn, Service.BIND_AUTO_CREATE);
}
});
//解除
btn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
unbindService(conn);
}
});
//获取数据
btn2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(ServiceActivity.this, "值:" + binder.getCount(), Toast.LENGTH_SHORT).show();
}
});
}
}
与startService() 方法启动不同的是,bindService() 方法并不会执行重复的绑定。
startService()每点击一次。就会执行OnStartCommand()一次