在我们的应用程序中,我们有一个Service以这种方式定义
<service
android:name="ServiceName"
android:exported="false" />
When Activity's onCreate()
被调用,应用程序启动这个Service。一切都很好,直到它被移到后台很长一段时间。将应用程序移至前台后onCreate()再次被调用,应用程序尝试启动Service但出现错误:
引起原因:java.lang.SecurityException:未经许可不允许启动服务 Intent { act=action_name cmp=app_bundle/service_name } 未从 uid 10156 导出
应用程序崩溃,重新启动后一切又恢复正常。我真的不明白出了什么问题。好像Activity是从新开始的uid
,但尝试与Service从另一个进程与另一个进程uid
(????).
崩溃仅重现于Asus phone, Android 6.0.0.
好像Activity是从新开始的uid
,但尝试与Service从另一个进程与另一个进程uid
(????)
我相信你已经回答了自己的问题。
一切都很好,直到它被移到后台很长一段时间。
在此期间“很久”您的应用程序的进程(与uid
10XXX 已分配)启动了Service本来就有可能被系统干掉的。你的Service可能回来了START_STICKY或来自其的类似标志onStartCommand()
,所以当应用程序进程被杀死时Service在一个新的流程中开始,和另外一个uid
分配的由系统。
然后,当您将应用程序带回到前台时,它会在一个全新的进程中运行(意味着与另一个进程一起运行)uid
由系统分配)。其中之一内Activity's onCreate()
你开始Service具有android:exported="false"
并且,因为这次它是从另一个内部调用的uid
, a SecurityException
被抛出(这种行为可能仅是您的华硕手机特定的 - 我建议检查其他供应商的手机的行为).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)