通知打开活动,后退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议?

  • 不显示在recyclerview上的浮动操作button(位于DrawerLayout内部)
  • 浮动的行动button和白色背景
  • 如何在代码中创build真正的小button?
  • 浮动动作button边框颜色不变
  • Android Button的背景与阴影一样
  • 可以在buttonxml中添加参数?
  • 如何启用/禁用FloatingActionButton行为
  • 我怎样才能调整imageButton?
  • 你的问题是在以下步骤,因为我知道你的问题是

    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);