第一种方式:通过Binder方式调用Service方法
public class TestBinderService extends Service {
private TestBinder mBinder;
@Override
public void onCreate() {
super.onCreate();
Log.d("TAG", "userService: onCreate ");
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d("TAG", "userService: onDestroy");
}
class TestBinder extends Binder{
public void userService(boolean nice){
Log.d("TAG", "userService: nice= "+nice);
Toast.makeText(getApplicationContext(), "报告,任务完成", Toast.LENGTH_SHORT).show();
}
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
Log.d("TAG", "userService: onBind");
if (mBinder == null){
mBinder = new TestBinder();
}
return mBinder;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d("TAG", "userService: onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
}
Activity如下
/* Activity实现了ServiceConnection 接口,Override了onServiceConnected与onServiceDisconnected方法,
我们可以在onServiceConnected方法中拿到binder,即可操作service,实现通信 */
public class MainActivity extends AppCompatActivity implements View.OnClickListener, ServiceConnection {
private TestBinderService.TestBinder binder;
private Intent intent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.tv_0).setOnClickListener(this);
findViewById(R.id.tv_1).setOnClickListener(this);
findViewById(R.id.tv_2).setOnClickListener(this);
intent = new Intent(this, TestBinderService.class);
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.tv_0){
//绑定并启动服务
bindService(intent, this, BIND_AUTO_CREATE);
startService(intent);
} else if (v.getId() == R.id.tv_1){
//在onServiceConnected方法中 , binder被引用,可以调用service中自定义的binder的方法了
binder.userService(true);
} else if (v.getId() == R.id.tv_2){
//若服务已经被停止或解绑,自然会报java.lang.IllegalArgumentException: Service not registered
Intent intent = new Intent(this, TestBinderService.class);
stopService(intent);
unbindService(this);
}
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.d("TAG", "onServiceConnected: onServiceConnected");
binder = (TestBinderService.TestBinder) service;
}
@Override
public void onServiceDisconnected(ComponentName name) {
Log.d("TAG", "onServiceConnected: onServiceDisconnected");
}
}
第二种----广播
第三种----Eventbus
网友评论