我的应用状态栏中有通知:
Notification notification = new Notification(R.drawable.icon, null, System.currentTimeMillis());
Intent notificationIntent = new Intent(this.parent, MainActivity.class);
PendingIntent contentIntent = PendingIntent.getActivity(this.parent, 0, notificationIntent, 0);
...
notification.flags = Notification.FLAG_ONGOING_EVENT;
mNotificationManager.notify(NOTIFICATION_ID, notification);
问题在于,当您从应用程序按下主页按钮(将其推到后台)时,按下从状态栏访问的列表中的通知,它会启动活动的新副本。我想要做的就是恢复应用程序(比如当你长按主页按钮并按下应用程序的图标时)。有没有办法创建一个Intent来做到这一点?
答案 0 :(得分:31)
我已经通过在androidManifest.xml文件中将我的活动的launchMode
更改为singleTask
来解决了这个问题。
此属性的默认值为standard
,允许运行任意数量的实例。
中找到详细说明“singleTask”和“singleInstance”活动只能开始一项任务。它们始终位于活动堆栈的根部。此外,设备一次只能保存一个活动实例 - 只有一个这样的任务。 [...]
“singleTask”和“singleInstance”模式在一个方面也各不相同:“singleTask”活动允许其他活动成为其任务的一部分。它始终是其任务的根源,但其他活动(必然是“标准”和“单一活动”)可以启动到该任务中。另一方面,“singleInstance”活动不允许其他活动成为其任务的一部分。这是任务中唯一的活动。如果它启动另一个活动,则该活动将分配给另一个任务 - 就像FLAG_ACTIVITY_NEW_TASK在意图中一样。
我希望这会有所帮助
答案 1 :(得分:1)
我遇到了类似的问题,处理这个问题的正确方法是使用标志:Intent.FLAG_ACTIVITY_CLEAR_TOP和Intent.FLAG_ACTIVITY_SINGLE_TOP就像这样
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
从文档中可以看出:
如果已设置,并且正在启动的活动已在当前任务中运行,则不会启动该活动的新实例,而是将关闭其上的所有其他活动,并将此Intent传递给(现在在最前面)作为新意图的旧活动。
如果设置,如果活动已经在历史堆栈的顶部运行,则不会启动该活动。
答案 2 :(得分:0)
我刚刚找到了解决这个问题的方法:我创建了 getPreviousIntent 方法并将其提供给PendingIntent:
private Intent getPreviousIntent(Intent newIntent) {
final ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
final List<ActivityManager.RecentTaskInfo> recentTaskInfos = am.getRecentTasks(1024,0);
String myPkgNm = getPackageName();
if (!recentTaskInfos.isEmpty()) {
ActivityManager.RecentTaskInfo recentTaskInfo;
for (int i = 0; i < recentTaskInfos.size(); i++) {
recentTaskInfo = recentTaskInfos.get(i);
if (recentTaskInfo.baseIntent.getComponent().getPackageName().equals(myPkgNm)) {
newIntent = recentTaskInfo.baseIntent;
newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
}
}
}
return newIntent;
}
答案 3 :(得分:0)
将此行添加到应用清单文件中的相应活动。
android:launchMode="singleTask"
例如:
<activity
android:name=".Main_Activity"
android:label="@string/title_main_activity"
android:theme="@style/AppTheme.NoActionBar"
android:launchMode="singleTask" />
答案 4 :(得分:0)
我的设备之间的行为不一致,有些意图使额外功能失去了,并且调用了MainActivity的 OnNewIntent 和 onCreate 方法。
什么不起作用:
清单:
<activity android:name=".MainActivity"
android:launchMode="singleTask">
服务:
Intent notificationIntent = new Intent(this.getBaseContext(), MainActivity.class);
notificationIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
notificationIntent.putExtra("TEST", 1);
可以做什么:
清单:
<activity android:name=".MainActivity"
android:launchMode="singleTask">
服务:
PackageManager pm = getPackageManager();
Intent launchIntent = m.getLaunchIntentForPackage(BuildConfig.APPLICATION_ID);
launchIntent.putExtra("TEST", 2);
答案 5 :(得分:0)
您可以模拟启动意图(就像用户单击您的应用程序图标以启动它一样):
val launchIntent = context.packageManager.getLaunchIntentForPackage(context.packageName)
val contentIntent = PendingIntent.getActivity(context, 0, launchIntent, 0)
这样,您不必不必在清单中将您的应用标记为“ singleTask”或“ singleInstance”(这会产生其他问题)。因此,这应该是正确的解决方案。
注意,但是,由于涉嫌存在android错误,上述解决方案可能无法直接为您服务。可以在in this question中找到有关android bug和解决方法的讨论。
答案 6 :(得分:-1)
我用:
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
notificationIntent.setAction(Intent.ACTION_MAIN);
不确定这些是您需要设置的值,但答案是在那些方法/标志中。