1.问题
我集成了移动推送后,将设备重启,为什么我的app没有启动,而其他好多app都自动了?
2.问题原因
操作系统在启动的时候会发出一个“BOOT_COMPLETED”的系统广播,该广播会发送到该广播的所有广播。但是在Android 3.1中,google为广播增加了FLAG_INCLUDED_STOPPED_PACKAGES和FLAG_EXCLUDED_STOPPED_PACKAGES两个参数用来标识是否将该广播发送到处于停止状态的应用所持有。系统广播设置了FLAG_EXCLUDED_STOPPED_PACKAGES参数,所以如果应用程序处于停止状态,即使监听启动广播也无法接收到。这一点不仅针对系统启动广播,针对所有的系统广播都一样。需要指出的是,这里的停止状态和Activity生命周期中的stop状态是完全不一样的,包管理器中的stopped state指的是安装后从来没有启动过或者是被用户手动强制停止的应用。判断一个应用程序是否处于停止状态可以在手机中“设备—》应用程序—》XXAPP”中查看。如果该应用的“强行停止”按钮已经变灰,说明该应用已经被强行停止,处于stop状态。另外还有一种情况可以导致应用无法自启动,即如果当前app安装在SD卡,因为系统启动的逻辑是先发出“BOOT_COMPLETED”广播之后再挂载SD卡。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
针对您遇到的问题,即集成阿里云移动推送后应用在设备重启后未能自动启动,这主要是由于Android系统对广播接收器的管理策略所导致的。根据您的描述,问题根源在于应用被标记为停止状态或安装在SD卡上,从而无法接收到"BOOT_COMPLETED"广播。
移除应用的“停止”状态:
更改应用的自启动权限设置:
修改Manifest文件:
确保您的AndroidManifest.xml
文件中已经正确注册了用于接收"BOOT_COMPLETED"广播的BroadcastReceiver
,并且添加了必要的权限:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<receiver android:name=".YourBootReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<!-- 为了兼容性,还可以添加其他动作 -->
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
处理SD卡安装问题:
使用JobScheduler或WorkManager替代:
JobScheduler
(适用于API 21+)或WorkManager
(更现代且兼容所有版本)来安排任务。这些组件能更好地与系统资源管理和电池优化策略协同工作。综上所述,要解决集成阿里云移动推送后应用无法在设备重启后自动启动的问题,需要结合上述方法,调整应用的配置和权限设置,同时考虑到不同Android版本的兼容性问题。