A. android Service启动Activity
Android Service 基础知识点
我们都知道Activity中启动Activity,只需要startActivity,如果在Service中启动Activity呢?
在Service中启动Activity,很多人说在非Activity中启动Activity需要加FLAG_ACTIVITY_NEW_TASK flag,如果我不加会怎么样呢?
并没有出现异常和崩溃,跳转也是正常的,但是与之前所说的会崩溃报出异常不符合啊?!难道是与版本有关吗?大友于是我使用了Android 23去测试果然抛出了异常
ContextImpl在Android studio中属于隐藏源码,在IDE中可能看不到,那就需要在SDK中去找 我的是:D:\AndroidSdk\sources\android-23\android\app\ContextImpl.java
可以看到只是判断条件不同而已,android-23中发现没有Intent.FLAG_ACTIVITY_NEW_TASK会直接抛出异常,而android-26中我们在非 Activity 调用 startActivity() 的时候,我们这个 options 通常是 null 的,所以在 26 之间的时候,误把判断条件 options == null 写成了 options != null 导致进不去 if,从而不会抛出异常
附加:在android 24-android 27(即android N-android O)之间出现了bug,也就是说即使没有加Intent.FLAG_ACTIVITY_NEW_TASK也会正常跳转激仿销
可以很明显看到判断条件targetSdkVersion <明游 Build.VERSION_CODES.N || targetSdkVersion >= Build.VERSION_CODES.P 即在24-27
看Activity中启动Activity的源码
Activity.startActivity() ->startActivityForResult()->mInstrumentation.execStartActivity() ...最终还是Ams去启动Activity 也就是Activity中重写了startActivity()方法所以不会出现这个异常
其实直观很好理解,如果不是在Activity中启动的,那就可以看做不是用户主动的行为,也就说这个界面可能出现在任何APP之上,如果不用Intent.FLAG_ACTIVITY_NEW_TASK将其限制在自己的Task中,那用户可能会认为该Activity是当前可见APP的页面,这是不合理的。举个例子:我们在听音乐,这个时候如果邮件Service突然要打开一个Activity,如果不用Intent.FLAG_ACTIVITY_NEW_TASK做限制,那用户可能认为这个Activity是属于音乐APP的,因为用户点击返回的时候,可能会回到音乐,而不是邮件(如果邮件之前就有界面)
对比源码发现,在我们非 Activity 调用 startActivity() 的时候,我们这个 options 通常是 null 的,所以在 24~27 之间的时候,误把判断条件 options == null 写成了 options != null 导致进不去 if,从而不会抛出异常,如此我们使用 Context.startActivity() 的时候是一定要加上 FLAG_ACTIVITY_NEW_TASK 的,但是在 Android N 到 O-MR1,即 24~27 之间却出现了 bug,即使没有加也会正确跳转
结语:感谢各位大佬的分享,对此有疑问的可以去运行跑一下,看一下相关的源码,如有错误的需要改进的地方,请留言评论指出,谢谢!
参考文章:
B. 如何查看Android 中native的Service
在Android里面,init程序会解析 Init.rc文件,然后启动很多Native Service。如何查看这些service的状态呢,查看init的源代码,发现所有的native service的信息都会保存到系统属性里面。这样就可以用下面的命令查看各个Service的状态。
# getprop |grep init.svc
getprop |grep init.svc
[init.svc.servicemanager]: [running]
[init.svc.vold]: [running]
[init.svc.netd]: [running]
[init.svc.debuggerd]: [running]
[init.svc.omsril-daemon]: [running]
[init.svc.sdm]: [running]
[init.svc.zygote]: [running]
[init.svc.media]: [running]
[init.svc.dbus]: [running]
[init.svc.installd]: [running]
[init.svc.keystore]: [running]
[init.svc.lapisrv]: [running]
[init.svc.console]: [running]
[init.svc.tcmd-autolaunch]: [stopped]
[init.svc.tel]: [stopped]
[init.svc.pxa920-setup]: [stopped]
[init.svc.logcat]: [running]
[init.svc.logcat-radio]: [running]
[init.svc.dnsmasq]: [running]
[init.svc.powerpolicy]: [stopped]
[init.svc.adbd]: [running]
[init.svc.telserver]: [stopped]
[init.svc.bootanim]: [stopped]
[init.svc.fmradiod]: [stopped]
[init.svc.wpa_supplicant]: [running]
[init.svc.dhcpcd]: [running]
C. 一文总结Android系统服务大管家-ServiceManager
Android系统服务大管家ServiceManager总结:
定义与位置:
启动与运行:
程序与功能差异:
启动过程:
核心功能实现:
唤醒时机与作用: