Android:来自通知时,会在已经打开的活动和内存增加的基础上添加活动

时间:2015-01-13 15:27:21

标签: android

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再次上升。

3 个答案:

答案 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的问题,这显然不是你想要的。您可以通过多种方式解决这个问题,这里有两个例子:

  1. 将一个布尔成员变量添加到StarterActivity。在StarterActivity.onResume()中,在方法的最后将该变量设置为true。在onResume()的开头,检查变量,如果是,则可以假设用户已在MainActivity中按了BACK,因此您只需拨打finish()

  2. 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"/>

这将打开相同的活动,而不是创建一个新活动。