记Android 通知栏点击打开Activity会重建的问题

  • 需求背景:后台下载需要在通知栏显示下载进度
  • 有段时间没写原生,就按照官网的示例照写了,但在点击通知栏跳转到Activity被重建了,导致App崩溃了。

官网地址:developer.android.google.cn/training/no…

示例代码:

    // Create an Intent for the activity you want to start
    val resultIntent = Intent(this, ResultActivity::class.java)
    // Create the TaskStackBuilder
    val resultPendingIntent: PendingIntent? = TaskStackBuilder.create(this).run {
        // Add the intent, which inflates the back stack
        addNextIntentWithParentStack(resultIntent)
        // Get the PendingIntent containing the entire back stack
        getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT)
    }
复制代码

查一遍没发现相关的问题的答案,后面查看源码发现TaskStackBuilder在创建PendingIntent时会对第一Intent添加重建Activity堆栈,问题找到了。

问题代码:

    public PendingIntent getPendingIntent(int requestCode, int flags, Bundle options) {
        if (mIntents.isEmpty()) {
            throw new IllegalStateException(
                    "No intents added to TaskStackBuilder; cannot getPendingIntent");
        }
        return PendingIntent.getActivities(mSourceContext, requestCode, getIntents(),                  flags,options);
    }
    
    @NonNull
    public Intent[] getIntents() {
        Intent[] intents = new Intent[mIntents.size()];
        if (intents.length == 0) return intents;
        intents[0] = new Intent(mIntents.get(0)).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK 
                Intent.FLAG_ACTIVITY_CLEAR_TASK |
                Intent.FLAG_ACTIVITY_TASK_ON_HOME);
        for (int i = 1; i < intents.length; i++) {
            intents[i] = new Intent(mIntents.get(i));
        }
        return intents;
    }
复制代码

解决方案:弃用TaskStackBuilder改用PendingIntent.getActivity

  val resultIntent = Intent(this, ResultActivity::class.java)
  resultIntent.addFlags(FLAG_ACTIVITY_SINGLE_TOP)
  val resultPendingIntent = PendingIntent.getActivity(this, 0, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT)

复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享