android五中方式调用服务service中的方法

本文详细介绍了Android中调用Service方法的五种方式:通过startService、Handle、bindService、AIDL以及BroadcastReceiver。文章首先回顾了Service的生命周期,然后逐一讲解每种调用方法的实现原理和注意事项,包括如何通过Intent传递参数、通过Handle通信、通过IBinder接口以及跨进程通信的AIDL机制。最后提到了BroadcastReceiver在服务调用中的应用。
摘要由CSDN通过智能技术生成

今天看到一张图片,上面有句话 —- 没有伞的孩子,要快跑

android五中方式调用服务service中的方法分别是
- 通过重复调用startService 来根据意图Intent传递的参数调用
- 通过Handle调用
- 通过bindService调用
- 通过AIDL调用
- 通过BroadcastReceiver调用

再讲解这五中方法之前我们先来回顾一下Service的生命周期:
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
  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值