如何从通知状态栏打开上一个活动?

and*_*one 5 notifications android android-activity

我想通过点击状态栏中的通知来打开上次启动的活动.假设我启动了活动A(我的应用程序的主要活动),此活动会向通知状态栏发送通知.活动A还打开活动B,B打开另一个活动C.从C i按主页按钮.现在我想再次访问我的应用程序,所以从通知栏我点击通知(由A发送).这里通知应该启动活动C,因为它是上次打开的.

我对此进行了搜索但未找到正确的答案.提前致谢.

and*_*one 22

几天前我为我的问题找到了非常简单的解决方案.我们可以做如下简单的事情,而不是迭代recentTasks并完成任务然后完成任务.baseIntent

Intent notificationIntent = new Intent(context, MainActivity.class);
notificationIntent.addCategory(Intent.CATEGORY_LAUNCHER);
notificationIntent.setAction(Intent.ACTION_MAIN);
Run Code Online (Sandbox Code Playgroud)

baseIntent包含与上面相同的参数Intent.因此,使用上面的代码非常好,而不是baseIntent从中获取recentTasks.

notificationIntent将被传递到pendingIntent进一步使用.

提供:MainActivity是第一个活动时推出我们的应用程序,并在AndroidManifest.xml中必须包含IntentFiltersCATEGORY_LAUNCHERACTION_MAIN.


and*_*one 7

由于我在搜索之后没有得到任何答案,我停止了尝试,但就在我再次开始尝试之前的几天,我发现了解决方案.:)我把它放在这里.

但首先我只是想重新定义我的问题,它是::"从状态通知栏获取后台任务到前景"即,当我通过按下主页按钮将我的应用程序置于背景然后我使其显示为前景,所有活动应该以与应用程序堆栈相同的顺序出现在前台.

为此,我需要一个Pending Intent,每当被解雇时,我的应用程序都会显示在前台.

在这里,当我的应用程序启动时,状态栏上会显示一条通知,直到我的应用程序在设备上运行.

所以这是我试过的代码::

NotificationManager nm = (NotificationManager) getSystemService(context.NOTIFICATION_SERVICE);
Notification notification = new Notification();
notification.flag = Notification.FLAG_ONGOING_EVENT | Notification.FLAG_NO_CLEAR;

Intent nIntent = new Intent();

final ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);

final List<RecentTaskInfo> recentTaskInfos = am.getRecentTasks(1024,0);
String myPkgNm = getPackageName();

if (!recentTaskInfos.isEmpty()) {
     RecentTaskInfo recentTaskInfo;
     final int size = recentTaskInfo.size();
     for (int i=0;i<size;i++) {
         recentTaskInfo = recentTaskInfos.get(i);
         if (recentTaskInfo.baseIntent.getComponent().getPackageName().equals(myPkgNm)) {
             nIntent = recentTaskInfo.baseIntent;
             nIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         }
     }
 }
 PendingIntent pi = PendingIntent.getActivity(this, 0, nIntent, 0);
 notification.setLatestEventInfo(getContext(), "some Title", "some text", pi);
 nm.notify(0,notification); 
Run Code Online (Sandbox Code Playgroud)

这里的主键是baseIntent,其文档说明: 用于启动任务的原始Intent.您可以使用此Intent重新启动任务(如果它不再运行)或将当前任务置于最前面.

FLAG_ACTIVITY_NEW_TASK的文档说:使用此标志时,如果任务已在您正在启动的活动上运行,则不会启动新活动; 相反,当前任务将简单地以最后一个状态被带到屏幕的前面.

我首先使用它,但它没有工作,因为它说,这有很多问题..

无论如何..直到现在,我发现这种方式很适合将任务带到前面,就像android的主屏幕上的图标一样.

但请告诉我这种方式的缺点,以便我可以改进.

:)


Chu*_*ham 5

你试过这个:

final Intent intent = new Intent(context, YourActivity.class)
intent.setAction(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
Run Code Online (Sandbox Code Playgroud)

以上代码指示Android打开最后一个活动,无论是主要活动还是首先用于在通知栏中创建/启动图标的首选活动[当前位于前台].

ACTION_MAIN并分别在您的文件中CATEGORY_LAUNCHER引用<action android:name="android.intent.action.MAIN"/><category android:name="android.intent.category.LAUNCHER"/>指令AndroidManifest.xml.