今天看到一张图片,上面有句话 —- 没有伞的孩子,要快跑
android五中方式调用服务service中的方法分别是
- 通过重复调用startService 来根据意图Intent传递的参数调用
- 通过Handle调用
- 通过bindService调用
- 通过AIDL调用
- 通过BroadcastReceiver调用
再讲解这五中方法之前我们先来回顾一下Service的生命周期:
从图片可以看到service的一般生命周期,但当service已经启动过了这时再调用startService,服务不会走onCreat了而是走onStartCommand,而且原始的onStartCommand中并没有什么影响程序运行的东西,所以我们可以多次调用startService而不用担心会产生什么对服务不好的Bug.至于startService和bindService的混合调用,混合调用也要特别注意生命周期,先start,再bind,然后unbind,最后stop.不然会引发一些匪夷所思的bug.好了,我们来实现这五中调用吧O(∩_∩)O~
通过重复调用startService 来根据意图Intent传递的参数调用
先看效果:
`service中的代码`
`public class MyService extends Service {
private Messenger mMessenger;
private Toast mToast;
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
mToast = Toast.makeText(this, "参数错误", Toast.LENGTH_SHORT);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
String command = intent.getStringExtra("command");
if ("eat".equals(command)) {
eat();
}
else if ("drink".equals(command)){
drink();
}
else if ("sleep".equals(command)) {
sleep();
}
else {
showToast("参数命令应为[ eat | drink | sleep ]");
}
return super.onStartCommand(intent, flags, startId);
}
public void showToast(String result) {
mToast.setText(result);
mToast.show();
}
private void eat() {
showToast("我是服务方法,我在吃东西");
}
private void drink() {
showToast("我是服务方法,我在喝白开水");
}
private void sleep() {
showToast("我是服务方法,我在睡懒觉");
}
}`
然后我们通过点击按钮来重复调用startService,根据输入的命令调用服务中相应的方法
Intent intent = new Intent(this, MyService.class);
intent.putExtra(“command”,mEditText.getText().toString().trim());
startService(intent);
通过Handle调用
上面我们调用startService传递参数给startService的时候还可以传递报信者Messenger
intent.putExtra(“Messenger”,new Messenger(mHandler));
报信者拿着我们的handler就可以正常工作了,MyService做以下修改
`@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Messenger messenger = (Messenger) intent.getExtras().get("Messenger");
if (messenger != null){
Message msg = new Message();
msg.obj = new MiddleMan(); //把中间人对象放到消息中
try {
messenger.send(msg); //方送消息,由MainActivity中的handelMessage处理
} catch (RemoteException e) {
e.printStackTrace();
}
}
return super.onStartCommand(intent, flags, sta