Android Service
Android的service主要用于跨进程通信。
静态配置有
配置 | 说明 |
android:exported | 是否暴露给其他app |
android:enabled | 是否启用 |
android:permission | 权限声明 |
android:process | 所属进程 |
android:isolatedProcess | 独立且独占的进程 |
有体现生命周期的回调
配置 | 说明 |
onCreate() | 初始化 |
onBind() | 客户端以bind方式连接 |
onStartCommand(),onStart() | 客户端以start方式连接 |
onDestroy() | 析构 |
启动service方式
通常start方式启动服务是为了启动服务,然后服务有独立的功能,调用方不需要后续动作;bind是为了通过服务得到一些辅助性的调用并返回结果,后续逻辑又回归调用方。
当然两种方式可以组合使用。
配置 | 说明 |
context.startService(intent); | 多次调用的startId不同 |
context.bindService(intent, connection, Context.BIND_AUTO_CREATE); | 服务连接以异步onServiceConnected()方式,加锁或sleep会死锁。 |
context.bindService(intent, Context.BIND_AUTO_CREATE, Executors.newSingleThreadExecutor(), connection); |
可以加锁等待onServiceConnected()服务连接完成。 Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q |
bindService的逻辑:
出现以下异常时表示跨进程获取的是一个Stub,不能直接转为Binder对象
java.lang.ClassCastException: android.os.BinderProxy cannot be cast to ...
参考:
https://www.jb51.net/article/76474.htm (Android中bindService基本使用方法概述)
https://www.jb51.net/article/76470.htm (Android中startService基本使用方法概述)
https://blog.csdn.net/u013620306/article/details/123660079
https://blog.csdn.net/m0_37605407/article/details/104046580 (android.os.BinderProxy cannot be cast to ... )
http://t.zoukankan.com/keke-xiaoxiami-p-4343045.html (跨进程 同一app不同进程之间通信)
https://blog.csdn.net/LVXIANGAN/article/details/85323004 (Android之Service设置android:process作用)
https://blog.csdn.net/qq_42470947/article/details/104088260 (跨进程通信——AIDL、之Service基本细节使用之:精通)
https://blog.csdn.net/qq_34709057/article/details/108535277 (Kotlin写一个简单的绑定服务)
https://blog.csdn.net/cike110120/article/details/86511236 (binderService()方法的调用过程)
https://blog.csdn.net/derek_liuxuedong/article/details/72935194 (Android基础知识之BindService)
https://blog.csdn.net/sunzy993/article/details/123938831 (aidl 在异步线程 bindService)