使用极光推送的过程中, 发现每次点击通知的时候, 都会重启一遍App

猜测原因是极光推送识别到我的主Activity是BootActivity, 但是实际上在启动到MainActivity的时候, 它就已经finish了, 导致极光认为我程序已经关闭, 所以重启了一次

解决方法也很简单, 极光提供了通知点击的广播, BroadcastReceiver注册之后, 点击通知的事件就由开发者接管, 因此在onReceive里面添加如下代码, 就可以让app回到前台而不会重启:

context.startActivity(Intent(context, MainActivity::class.java)
            .setFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED or Intent.FLAG_ACTIVITY_NEW_TASK))

注意代码中给Intent定义的Activity不是BootActivity

这样设置之后, 点击推送时, 如果app正在后台运行, 就跟从最近任务里打开的效果一样; 如果不在后台运行, 就会启动代码中定义的MainActivity

所以最好不要在BootActivity中定义任何初始化操作, 不然点击通知的时候就会跳过这些初始化, 直接进入主界面


网上还有一种常见的解决方案:

通过ActivityManager获取RunningTasks,如果存在该应用对应的task,则通过ActivityManager的moveTaskToFront(rti.id, ActivityManager.MOVE_TASK_WITH_HOME);方法将应用唤起到前台,然后处理相关操作;如果没有相关的task,则直接启动应用即可

然而用于获取RunningTasks的getRunningTasks方法已经被标为deprecated, 并且没有替代方案, 所以我没有采用这种方式