zoukankan      html  css  js  c++  java
  • Android:关于服务的总结

    服务

    • startService(intent)
    • stopService(intent)

    服务的生命周期

    • 如果采用start的方式开启服务

      oncreate()--->onstartcommand()--->onstart()--->onDestroy();
      服务如果已经被开启,不会重复的创建,多次调用startService方法,服务的oncreate方法始终只会执行一次.
      oncreate()--->onstartcommand()--->onstart()--->onstartcommand()---onstart()--->onDestroy();
      服务只会被停止一次,多次的调用stopservice的方法,是无效的.
      start的方式可以多次调用 多次开启服务
      一旦开启,就没关系了,及时Activity挂了,服务还是很好的在后台运行.
      不可以调用服务的方法

    • 如果采用的是bind的方式开启服务

      oncreate() --->onbind() -->onunbind()---->ondestry();
      bind的方式 只可以调用一次,一旦成功绑定了,就不能重复的绑定,否则解绑就会失败
      bind的方式, 服务只可以被解绑一次,多次的解绑服务,应用程序会异常退出.
      不求同时生,但求同时死.(Activity挂了,服务就挂了)
      可以调用服务的方法

    混合调用服务的生命周期处理

    为了保证服务长期的运行,又想调用服务的方法.
    startService() 保证服务长期后台运行
    bindService() 绑定服务 ,调用服务的方法
    unbindservice() 解绑服务,不需要再去调用方法了
    stopService() 停止服务

    start方式开启服务的缺点

    无法调用服务里面的方法, 无法得到服务的引用

    bind方式开启服务

    1. 采用bind的方法绑定开启服务
       bindService(intent, conn, BIND_AUTO_CREATE);
    2. 服务内部实现一个代理人类
       private class MyBinder2 extends Binder implements IService{}
    3. 定义IService的接口
       服务的中间人想暴露什么方法,就怎么定义接口
    4. 返回代理人对象
           public IBinder onBind(Intent intent) {}
    5. 实现serviceConnection接口里面的方法
       private class MyConn implements ServiceConnection{
       @Override
       public void onServiceConnected(ComponentName name, IBinder service) {
           myBinder = (IService) service;
           System.out.println("Activity,得到代理人对象");
       }
    6. 调用接口里面的方法

    绑定服务的应用常见

    • 提供一个服务,后台运行,里面有一些公共的逻辑供调用.
      1. 微信支付, 微信有一个支付的服务,绑定,调用支付的方法
      2. sony手机,人脸识别的服务,绑定到这个服务,传递一个照片,就会把人脸标记出来
      3. 音乐播放器,后台服务里面播放音乐,绑定服务,暂停,下一曲,上一曲

    远程服务&本地服务

    • 远程,服务在别的apk应用程序里面的服务,叫远程服务
    • 本地,服务在你的apk应用程序的内部的服务,叫本地服务

    IPC

    inter process communication
    进程间通讯

    AIDL

    android interface definition language
    安卓接口定义语言,绑定远程服务的写法

    1. 采用bind的方法绑定开启服务
       intent 隐式的意图 intent.setAction("action");
       bindService(intent, conn, BIND_AUTO_CREATE);
    2. 服务内部实现一个代理人类
       定义一个aidl文件,删除public的访问修饰符,修改文件的扩展名为aidl
       private class MyBinder2 extends IService.Sub{}
    3. 定义IService的接口,通过aidl文件生成的
       服务的中间人想暴露什么方法,就怎么定义接口
    4. 返回代理人对象
           public IBinder onBind(Intent intent) {}
    5. 实现serviceConnection接口里面的方法
       private class MyConn implements ServiceConnection{
       @Override
       public void onServiceConnected(ComponentName name, IBinder service) {
           IService.Sub.asInterface(service);
           System.out.println("Activity,得到代理人对象");
       }
    6. 调用接口里面的方法
  • 相关阅读:
    js实现element中可清空的输入框(1)
    vue中v-model的学习
    Oracle触发器和MySQL触发器的简单应用
    Java中的多线程你只要看这一篇就够了()
    HTML 随笔记之 刷新页面
    HTML CSS 随笔记之 cursor
    float到底是干什么的?
    Spring Boot 事物的快速应用
    java web 中文乱码
    LVM 创建实例
  • 原文地址:https://www.cnblogs.com/tinyclear/p/6165224.html
Copyright © 2011-2022 走看看