- 需求背景:后台下载需要在通知栏显示下载进度
- 有段时间没写原生,就按照官网的示例照写了,但在点击通知栏跳转到
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