Android:来自通知时,会在已经打开的活动和内存增加的基础上添加活动。 如何清除所有以前的活动,甚至在点击通知时终止应用程序?
以下是我如何构建通知:
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context)//
.setContentTitle(notificationTitle)//
.setContentText(notificationText)//
.setSmallIcon(R.drawable.app_icon_transparent)//
.setAutoCancel(true)//
.setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.drawable.asd));//
// Creates an explicit intent for an Activity in your app
Intent resultIntent = new Intent(context, StarterActivity.class);
resultIntent.putExtra("comingFromNotification", true);
// The stack builder object will contain an artificial back stack for
// the
// started Activity.
// This ensures that navigating backward from the Activity leads out of
// your application to the Home screen.
TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
// Adds the back stack for the Intent (but not the Intent itself)
stackBuilder.addParentStack(StarterActivity.class);
// Adds the Intent that starts the Activity to the top of the stack
stackBuilder.addNextIntent(resultIntent);
PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
mBuilder.setContentIntent(resultPendingIntent);
NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
// mId allows you to update the notification later on.
mNotificationManager.notify((int) now.getTimeInMillis(), mBuilder.build());
现在,当用户收到通知并单击它时,将启动StarterActivity。它启动应用程序所需的所有资源,然后启动主要活动。
如果应用程序已经运行到这一刻并且已经占用了50 mb的ram,那么现在ram上升到65,这意味着之前的进程没有被杀死,而且这个进程从它开始。
问题是,如果应用程序在用户点击通知时运行,该怎么杀死它?
编辑:在一些类似的问题中,我发现了这个
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP| Intent.FLAG_ACTIVITY_NEW_TASK);
这会有帮助吗?这些标志意味着什么?
EDIT2:不。那些旗帜没有帮助。在内存中有一些缓存对象的应用程序进程仍然存在,RAM再次上升。
答案 0 :(得分:2)
FLAG_ACTIVITY_CLEAR_TOP - 清除中间活动,而不是每个活动,例如:
你有电话A> B> C> D> E,然后从E调用B.在此类调用后,活动C和D将被删除,活动A将保留。
如果你有电话A> B> C> E和你从E调用活动F,不会清除任何活动。
FLAG_ACTIVITY_SINGLE_TOP可确保在再次调用顶级活动时不会重新创建顶级活动。例如:
你得到A> B> C,然后再打电话给B.在这样的呼叫B之后将不会重新创建,但将调用当前存在。如果您将调用A,它将被重新创建,因为它不在堆栈顶部。
Activity_new_task - 用于复杂的后退导航。您可以管理多个任务,换句话说,可以管理多个活动调用历史记录。创建新任务不会删除previos任务。是一个绝对的要求,当启动应用程序与通知,深层链接或任何其他"启动器"行为。一个任务内的纯化对另一个任务历史记录没有影响
我认为,启动后的历史记录重置将与这三个标志一起实现:FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TOP | FLAG_ACTIVITY_CLEAR_TASK 这应该是明确的任务历史,关闭它并创造新的任务。如果不起作用,请尝试使用FLAG_ACTIVITY_RESET_TASK_IF_NEEDED替换Clear_Task。
答案 1 :(得分:2)
您的架构并不适合解决此问题。正如您在一些评论中提到的,StarterActivity
是您的根活动(即:具有ACTION = MAIN和CATEGORY = LAUNCHER的那个),但您不能将其保留在活动堆栈中,因此您无法利用FLAG_ACTIVITY_CLEAR_TOP
。
要解决您的问题,您不应在finish()
启动StarterActivity
时致电MainActivity
。这样您就可以使用FLAG_ACTIVITY_CLEAR_TOP
(有或没有FLAG_ACTIVITY_SINGLE_TOP
,具体取决于您是否要使用StarterActivity
的现有实例或创建新实例。
一旦你有了这个工作,你现在需要处理用户在MainActivity
中按BACK并让它返回StarterActivity
的问题,这显然不是你想要的。您可以通过多种方式解决这个问题,这里有两个例子:
将一个布尔成员变量添加到StarterActivity
。在StarterActivity.onResume()
中,在方法的最后将该变量设置为true
。在onResume()
的开头,检查变量,如果是,则可以假设用户已在MainActivity
中按了BACK,因此您只需拨打finish()
。
在MainActivity
覆盖onBackPressed()
而不是致电super.onBackPressed()
,而是startActivity()
Intent
StarterActivity
再次致电FLAG_ACTIVITY_CLEAR_TOP
命名"退出"和StarterActivity
。这将导致创建StarterActivity.onCreate()
的新实例。在Intent
中,检查是否存在额外的"退出"在MainActivity
中,如果它在那里,则表示用户从finish()
按了BACK。在这种情况下,您只需要致电StarterActivity
以结束您的申请。如果您使用此机制,请确保launchMode
在清单中有标准launchMode="singleTop"
,而不是{{1}}。
答案 2 :(得分:1)
您无需杀死该应用并重新启动它。在清单中使用android:launchMode="singleTop"
进行活动:
<activity
android:name=".StarterActivity"
android:launchMode="singleTop"/>
这将打开相同的活动,而不是创建一个新活动。