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/