导航:首页 > 源码编译 > androidservice源码

androidservice源码

发布时间:2025-05-25 03:28:14

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总结

阅读全文

与androidservice源码相关的资料

热点内容
腾讯云esc服务器在哪进去 浏览:803
技能优先的宏命令 浏览:882
vb可视化编程的步骤是 浏览:41
字母转换加密c语言 浏览:351
android框架的作用 浏览:378
php有什么好书 浏览:232
安卓怎么给电脑连接网络 浏览:799
w10怎么解压并覆盖文件 浏览:968
linux中运行c程序 浏览:894
java程序设计教程pdf 浏览:741
安卓大屏usb怎么侦测 浏览:76
百度云盘怎么解压到qq浏览器 浏览:515
蚁群算法思想 浏览:425
安卓手机感光器灵敏怎么解决 浏览:461
程序员副业合作利益分配 浏览:285
老板手机装什么app 浏览:496
洪城一卡通app有什么作用 浏览:452
照片源码转换 浏览:426
交车贷需要哪个app可以交 浏览:927
java接口的实现方式 浏览:934