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

最佳答案

您的体系结构不适合解决此问题。正如您在一些评论中提到的,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()的开头,检查变量,如果为true,则可以假定用户已按下MainActivity中的BACK,因此可以仅调用finish()
MainActivity覆盖onBackPressed()中,而不是调用super.onBackPressed(),而是用startActivity()代替Intent调用StarterActivity,并带有一个额外的名为“ exit”和FLAG_ACTIVITY_CLEAR_TOP的名称。这将导致创建StarterActivity的新实例。在StarterActivity.onCreate()中,检查Intent中是否存在多余的“退出”,如果存在,则表示用户已按下MainActivity中的BACK。在这种情况下,您只想调用finish()结束您的应用程序。如果使用此机制,请确保StarterActivity在清单中而不是launchMode中具有标准的launchMode="singleTop"

关于android - Android:在收到通知时, Activity 会添加到已打开的 Activity 的上方,并增加内存,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27925598/

10-11 07:01