我想通过点击状态栏中的通知来打开上次启动的活动。假设我启动了活动A(我的应用程序的主要活动),此活动会向通知状态栏发送通知。活动A还打开活动B,B打开另一个活动C.从C i按主页按钮。现在我想再次访问我的应用程序,所以从通知栏我点击通知(由A发送)。这里通知应该启动活动C,因为它是上次打开的。
我对此进行了搜索但未找到正确的答案。提前谢谢。
答案 0 :(得分:22)
几天前我为我的问题找到了非常简单的解决方案。我们可以做如下简单的事情,而不是通过recentTasks
迭代并获得我们的任务,然后通过它来获取baseIntent
:
Intent notificationIntent = new Intent(context, MainActivity.class);
notificationIntent.addCategory(Intent.CATEGORY_LAUNCHER);
notificationIntent.setAction(Intent.ACTION_MAIN);
baseIntent
包含与上述Intent
相同的参数。因此,不是从baseIntent
抓取recentTasks
,而是使用上面的代码非常好。
然后,notificationIntent
会传递给pendingIntent
以供进一步使用。
提供:MainActivity
是我们启动应用时的第一个活动,在AndroidManifest.xml中,它必须包含IntentFilters
CATEGORY_LAUNCHER
和ACTION_MAIN
。
答案 1 :(得分: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);
这里的主键是baseIntent,其文档说: 用于启动任务的原始Intent。您可以使用此Intent重新启动 任务(如果它不再运行)或将当前任务带到前面。
FLAG_ACTIVITY_NEW_TASK的文档说:使用此标志时,如果任务已在您正在启动的活动上运行,则不会启动新活动;相反,当前任务将简单地以最后一个状态显示在屏幕的前面。
我首先使用它,但它不起作用,并且有很多问题......
无论如何..直到现在,我发现这种方式很适合将任务带到前面,就像android的主屏幕上的图标一样。
但请告诉我这种方式的缺点,以便我可以改进。
:)
答案 2 :(得分:5)
你试过这个:
final Intent intent = new Intent(context, YourActivity.class)
intent.setAction(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
上述代码指示Android打开最后一个活动,无论是主要活动还是首先用于在通知栏中创建/启动图标的首选活动[当前位于前台]。
ACTION_MAIN
和CATEGORY_LAUNCHER
分别在<action android:name="android.intent.action.MAIN"/>
文件中引用<category android:name="android.intent.category.LAUNCHER"/>
和AndroidManifest.xml
指令。
答案 3 :(得分:2)
一直为我工作。
launchMode="singleTop" #For Launcher activity
never use "singleTask" as a launchMode
set no launchMode for other activities. (if not needed)
Intent notificationIntent = new Intent();
notificationIntent.setClass(this, LaucherActivity.class);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
notificationIntent.setAction(Intent.ACTION_MAIN);
notificationIntent.addCategory(Intent.CATEGORY_LAUNCHER);