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)

posted @ 2022-12-30 21:56  xyphoenix  阅读(70)  评论(0)    收藏  举报