开发者社区 问答 正文

设备重启后,app无法自启动,其他有的app却可以这是为什么?



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卡。

展开
收起
猫饭先生 2017-10-23 14:16:14 1732 分享 版权
阿里云 AI 助理回答

针对您遇到的问题,即集成阿里云移动推送后应用在设备重启后未能自动启动,这主要是由于Android系统对广播接收器的管理策略所导致的。根据您的描述,问题根源在于应用被标记为停止状态或安装在SD卡上,从而无法接收到"BOOT_COMPLETED"广播。

解决方案:

  1. 移除应用的“停止”状态

    • 如果您的应用因为用户手动强制停止或者从未启动过而处于停止状态,可以通过手动打开应用一次来解除这个状态。在实际场景中,这不是一个理想的解决方案,因为依赖于用户的操作。但在测试阶段,这是一个快速验证问题的方法。
  2. 更改应用的自启动权限设置

    • 对于Android 6.0(API级别23)及以上版本,需要在应用内引导用户到系统的权限管理界面,开启自启动权限。不同手机厂商可能有不同的实现方式和命名(如华为、小米等有各自的权限管理界面),确保应用能在后台运行并接收广播。
  3. 修改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>
      
    • 注意,从Android 8.0(API级别26)开始,对于隐式广播(包括BOOT_COMPLETED),默认情况下不允许在Manifest中静态注册接收器。您需要改为在应用启动时动态注册接收器,或者将应用的服务声明为前台服务,并在其中注册接收器。
  4. 处理SD卡安装问题

    • 如果您的应用安装在SD卡上,考虑改变安装位置或者处理逻辑以适应系统先发送广播再挂载SD卡的顺序。不过,通常建议避免将重要服务或接收器依赖于SD卡安装的应用,因为这会增加不可预测性。
  5. 使用JobScheduler或WorkManager替代

    • 考虑到Android系统对后台任务执行的限制日益严格,如果应用的主要目的是在设备重启后执行某些任务,可以考虑使用JobScheduler(适用于API 21+)或WorkManager(更现代且兼容所有版本)来安排任务。这些组件能更好地与系统资源管理和电池优化策略协同工作。

综上所述,要解决集成阿里云移动推送后应用无法在设备重启后自动启动的问题,需要结合上述方法,调整应用的配置和权限设置,同时考虑到不同Android版本的兼容性问题。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答