day08_服务

来源:互联网 发布:淘宝收到货后怎么评价 编辑:程序博客网 时间:2024/05/16 18:25

服务

服务的生命周期、调用服务里的方法

服务的生命周期


1 start开启服务的生命周期(重点)

  • 完整生命周期: onCreate()–>onStartCommand()–>onDestroy()
  • 开启服务: onCreate()–>onStartCommand()
  • 停止服务:onDestroy()

  • 特点:
    1. 服务长期运行在后台
    2. 服务可以被多次开启,每次都执行onStartCommand()
    3. 服务只能被停止一次,多次停止无效

2 bind绑定服务的生命周期(重点)

  • 完整生命周期:onCreate()–>onBind()–>onUnBind()–>onDestroy()

  • 绑定服务:onCreate()–>onBind()

  • 解绑服务:onUnBind()–>onDestroy()

  • 特点:

    1. 不能长期运行在后台,不是一个服务进程
    2. 服务只能被绑定一次
    3. 服务只能被解绑一次,多次解绑抛出异常
    4. 调用服务的方法
    5. activity和绑定的service是同生共死
  • 区别:

    1. 能不能长期运行在后台
    2. 能不能调用服务里的方法

绑定服务调用方法


3 绑定服务调用服务里的方法

  1. 绑定服务

    Intent service = new Intent(this,MyService.class);bindService(service, new MyConn(), BIND_AUTO_CREATE);
  2. 服务被绑定成功

    @Overridepublic IBinder onBind(Intent intent) {    Log.e(TAG, "2. 服务被绑定成功");    Log.e(TAG, "3. 返回服务里内部类的对象");    return new MoMiShu();}
  3. 返回服务里内部类的对象

    public class MoMiShu extends Binder {    public void banZheng(int money) {        if (money > 1000) {            methodInService();        } else {            Toast.makeText(MyService.this, "没钱不给办,写几年代码吧", 0).show();        }    }}
  4. 连接成功后

    @Overridepublic void onServiceConnected(ComponentName name, IBinder service) {    Log.i(TAG, "4. activity和service连接成功");          }
  5. 把IBinder强转成服务里的内部类对象

        mService = (MoMiShu) service;
  6. 拿服务里的内部类间接调用服务里的方法

    mService.banZheng(100000000);

4 绑定服务抽取接口(重点)

  1. 写一个接口,写一个要爆了的方法
  2. 让服务里的内部类实现这个接口,重写接口里的方法
  3. 在连接成功后,把IBinder强转成接口类型
  4. 调接口里的方法,实际上调用的时接口实现类即服务里的内部类里的方法

5 混合方式开启服务

  • 应用场景:即想服务长期运行在后台,又想调用服务里的方法

  • 推荐步骤

    • startService
    • bindService
    • unBindService
    • stopService

远程服务


6 本地服务和远程服务

  • 本地服务:服务组件在自己的应用程序里
  • 远程服务:服务组件不不不在自己的应用程序里

7 本地应用调用远程服务中的方法(重点)

  • IPC :进程间通讯机制
  • AIDL:安卓接口定义语言

  • 编写步骤:

    05远程应用:    1. 把接口文件改成.aidl文件    2. 去掉这个.aidl文件里的权限修饰符public,开发工具会在gen目录下生成一个同名的.java文件    3. 让远程服务里的内部类继承Stub类06本地应用:    4. 创建一个和远程应用里.aidl文件所在的包名一样的包    5. 把远程应用里的.aidl文件复制到这个包里    6. Stub.asInterface(service)强转成05远程应用里的接口    7. 拿着这个接口间接的调用远程服务里的方法

8 远程服务的使用场景

  • 阅读Android操作系统的源码
  • 手机系统的服务
  • 超级大公司写远程服务供其他程序员调用