通知打开活动,后退button被按下,主要活动被打开?

我能描述我的问题的最好方法是这样的:

  1. 通知在启动时创build(使用BroadcastReceiver )。
  2. 我的应用程序的主要活动打开,并按下主页button(应用程序仍然在后台运行,直到系统closures它)。
  3. 我拉下状态栏并按下之前在启动时创build的通知。
  4. 一些与主要活动不同的活动开始。
  5. 我按下后退button,显示主要活动。

我怎样才能防止最后一步? 我想要的后退button是回到我的位置,这是主屏幕(包含所有小部件和应用程序图标的桌面)。 我的应用程序的主要活动应该是在后台运行,为什么用后退button调用?

如果它是相关的,我的代码来创build一个通知是这样的:

 public void createNotification(int notifyId, int iconId, String contentTitle, String contentText) { Intent intent = new Intent(mContext, NewNoteActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.putExtra(AgendaNotesAdapter.KEY_ROW_ID, (long)notifyId); PendingIntent contentIntent = PendingIntent.getActivity(mContext, notifyId, intent, 0); Notification notification = new Notification(iconId, contentTitle, 0); notification.setLatestEventInfo(mContext, contentTitle, contentText, contentIntent); mNotificationManager.notify(notifyId, notification); 

我试图添加一些更多的标志组合intent但他们都没有解决我的问题…build议?

Solutions Collecting From Web of "通知打开活动,后退button被按下,主要活动被打开?"

你的问题是在以下步骤,因为我知道你的问题是

1.开机后build立通知完成

主要活动将启动

3.你按回家的button,所以主要活动将停止,但不会破坏

4.点击状态栏中的通知,你的application will be resume这样你的后台堆栈中就已经有了主要的活动,并且通知将会像你在你的问题中提到的那样创build新的活动NewNoteActivity活动将被推回stack.SO一步you have two activities in back stack

5.您按下button,使last activity will be destroy ,您的main activity will be resume但您想要进入主页屏幕。

所以你的问题是在以下步骤,因为我知道你的问题是

1.开机后build立通知完成

主要活动将启动

3.你按回家的button,所以主要活动将停止,但不会破坏

4.点击状态栏中的通知,你的application will be resume这样你的后台堆栈中就已经有了主要的活动,并且通知将会像你在你的问题中提到的那样创build新的活动NewNoteActivity活动将被推回stack.SO一步you have two activities in back stack

5.您按下了button,以便last activity will be destroy并且您的main activity will be resume但是您想要在从NewNoteActivity活动中按下返回button时打开主页活动。

所以解决的办法是,当你从你的NewNoteActivityactivity中按下button时,你再次用Intent.FLAG_ACTIVITY_CLEAR_TOP标志启动主要活动,这样你的主要活动就会重新创build,并且会接收到onNewIntent()方法,这样你就可以得到标志,你可以完成主要活动

例如

 @Override public void onBackPressed() { Intent i = new Intent(this, Main.class); i.putExtra("exit", true); i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(i); super.onBackPressed(); } 

现在你必须在你的Main活动中实现onNewIntent()方法

在从NewNoteActivity活动中按下后退button时,您的主要活动将调用onNewIntent()方法,因此在此方法中,您必须从NewNoteActivity活动中获取传递的标志variables。如果获得标志,并且如果为true,则完成主要活动,你会得到主屏幕。

编辑

你说你有任何A,B,C中的任何一个活动都被打开了,你按下了这个button,这样这个活动就会被closures。如果你当时只有一个活动,那么你的申请将被closures,这意味着你将获得主屏幕。但是,如果您有多个活动,并且您按下了button,则至less有一个活动在堆栈中,现在您单击通知,以便打开与您的通知关联的新活动,以便此活动将现在如果你按下回退button,如果你没有修改该活动中的onBackPressed()方法,那么与通知关联的最后一个活动将被closures,然后如果在后一个栈中有任何活动这样活动将会恢复,或者如果回退堆栈中没有任何活动,那么您的应用程序将被closures,您将获得主屏幕

谁仍然可能需要回答。 看起来这是你想要达到的目的:

当您从通知开始Activity ,您必须保留用户的预期导航体验。 单击“ 返回”应该使用户通过应用程序的正常工作stream回到主屏幕,然后单击“ 最近”应将“活动”显示为单独的任务。

http://developer.android.com/guide/topics/ui/notifiers/notifications.html#NotificationResponse

你的情况是 – build立一个定期活动PendingIntent

请参阅链接中的完整步骤。 基本上你需要:
1.在AndroidManifest.xml中定义Activity层次结构

 <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".ResultActivity" android:parentActivityName=".MainActivity"> <meta-data android:name="android.support.PARENT_ACTIVITY" android:value=".MainActivity"/> </activity> 

2.根据启动ActivityIntent创build一个后退堆栈

 ... Intent resultIntent = new Intent(this, ResultActivity.class); TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); // Adds the back stack stackBuilder.addParentStack(ResultActivity.class); // Adds the Intent to the top of the stack stackBuilder.addNextIntent(resultIntent); // Gets a PendingIntent containing the entire back stack PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); ... NotificationCompat.Builder builder = new NotificationCompat.Builder(this); builder.setContentIntent(resultPendingIntent); NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); mNotificationManager.notify(id, builder.build()); 

有同样的问题。 对我来说有效的是在清单中设置通知发起的活动的以下属性:

android:taskAffinity=""

这基本上将通知活动与主要活动的亲和力分开,因此操作系统不需要“返回”主要活动,而是简单地返回到之前的任何情况,例如“桌面”。

我在我的应用中使用这个解决scheme。 覆盖onBackPressed(在你的活动路由通知),并检查你的应用程序是否在堆栈中。 如果没有,那么开始你的根活动。 用户可以随时根据您的根活动进行导航。 这是我在我的应用程序中所做的

 @Override public void onBackPressed() { if (isTaskRoot()) { Intent intent = new Intent(this,YourMainActivity.class); startActivity(intent); super.onBackPressed(); }else { super.onBackPressed(); } } 

这个对我有用。 尝试这个:

 notifyIntent.setAction(Intent.ACTION_MAIN); notifyIntent.addCategory(Intent.CATEGORY_LAUNCHER);