从通知中恢复应用程序和堆栈

我想从状态栏通知中恢复我的应用程序,就像用户在启动器中点击它的图标一样。

那就是:我希望堆栈处于与用户离开之前相同的状态。

在通知上设置未决意图时,问题总是针对特定的活动。 我不想要这个 我需要像启动程序那样恢复应用程序。

因此,如果用户在活动A中,我想恢复活动A,如果他已经从活动A启动了活动B,那么当用户点击通知时要显示B,并且要恢复堆栈以便A当用户点击B中的后退button时恢复。

还有其他几个类似标题的问题,但没有解决我的问题。

只需使用与Android在启动应用程序时使用的相同的意图filter:

final Intent notificationIntent = new Intent(context, YourActivity.class); notificationIntent.setAction(Intent.ACTION_MAIN); notificationIntent.addCategory(Intent.CATEGORY_LAUNCHER); notificationIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

由于您在通知栏中创build的用于打开ActivityIntent与用于启动应用程序的Android相同,因此将显示之前打开的“ Activity而不是创build新的“活动”。

对于您不想/不能硬编码启动器活动的情况,此解决scheme可以工作

 Intent i = getPackageManager() .getLaunchIntentForPackage(getPackageName()) .setPackage(null) .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, i, 0); return new NotificationCompat.Builder(context) ... .setContentIntent(pendingIntent) .build(); 

setPackage(null)部分在我的情况下是关键的 ,因为没有它的应用程序不会恢复到以前的任务。 我把我的意图与Android启动器的意图进行了比较,并注意到pkg没有在那里设置,所以这就是我从意图去除包名的方式。

我的具体情况是,通知是在图书馆里创build的,所以我不知道启动器的活动是什么。

我也有同样的问题,并尝试解决这个问题,如@ GrAnd的答案:

 final Intent notificationIntent = new Intent(context,YourActivity.class); Intent intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_LAUNCHER); 

这工作,毫无疑问,但问题是当你的意图设置为ACTION_MAIN。 那么你将无法设置任何捆绑的意图。 我的意思是,您的原始数据不会从目标活动接收,因为ACTION_MAIN不能包含任何额外的数据。

除此之外,您可以将活动设置为singleTask并正常调用您的意图,而不设置ACTION_MAIN并从目标活动的onNewIntent()方法接收意图。

但是请注意,如果你打电话,super.onNewIntent(intent); 那么该活动的第二个实例将被创build。

创build一个活动,然后设置类别和一个相应的标志…这是这样的工作方式,我必须这样做,因为我这样做,以支持Api lvl 8

 intent.addCategory(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_LAUNCHER); intent.setClass(this, YourActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT| Intent.FLAG_ACTIVITY_SINGLE_TOP); PendingIntent pi = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 

并在AndroidManifest

 android:launchMode="singleTask" 

那么诀窍是Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT以及在清单中设置的行。

希望对其他人有所帮助。

这是非常简单的打开你的清单文件,并在你的activity属性中设置属性Launch mode singleTop

 <uses-permission android:name="android.permission.GET_TASKS" /> <uses-permission android:name="android.permission.REORDER_TASKS" /> private void bringApplicationToForeground(){ ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { List<ActivityManager.AppTask> tasksList = am.getAppTasks(); for (ActivityManager.AppTask task : tasksList){ task.moveToFront(); } }else{ List<ActivityManager.RunningTaskInfo> tasksList = am.getRunningTasks(Integer.MAX_VALUE); if(!tasksList.isEmpty()){ int nSize = tasksList.size(); for(int i = 0; i < nSize; i++){ if(tasksList.get(i).topActivity.getPackageName().equals(getPackageName())){ am.moveTaskToFront(tasksList.get(i).id, 0); } } } } } 

可能有一个更简单的方法,但你可以将数据存储在sqlite数据库中,每当你重新启动应用程序,无论你已经保存到数据库的状态,你可以检索并设置你的值到他们需要的。