通知打开活动,按下后退按钮,主要活动是否打开?

时间:2011-09-30 18:19:30

标签: android notifications android-intent back-button android-pendingintent

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

  1. 在启动时创建通知(使用BroadcastReceiver)。
  2. 我的应用程序主要活动已打开并且按下主页按钮(应用程序仍在后台运行,直到系统关闭它)。
  3. 我按下状态栏并按下之前在启动时创建的通知。
  4. 开始了一些与主要活动不同的活动。
  5. 按下后退按钮,显示主要活动。
  6. 如何防止最后一步?我想要的后退按钮是回到原来的位置,这是主屏幕(包含所有小部件和应用程序图标的桌面)。我的应用程序的主要活动应该是在后台运行,为什么用后退按钮调用它?

    如果相关,我创建通知的代码如下:

    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添加了几个标志组合,但它们都没有解决我的问题...建议?

5 个答案:

答案 0 :(得分:19)

谁仍然可能需要回答。看起来这就是你想要实现的目标:

  

当您从通知中启动Activity时,您必须保留用户的预期导航体验。单击后退应该让用户通过应用程序的正常工作流回到主屏幕,然后单击最近应将活动显示为单独的任务。

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

您的情况是 - Setting up a regular activity 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.根据启动Intent的{​​{1}}创建后台

Activity

答案 1 :(得分:5)

有同样的问题。 对我有用的是在清单中为通知启动的活动设置以下属性:

android:taskAffinity=""

这基本上将通知活动的亲和力与主要活动分开,因此操作系统感觉不需要“返回”主活动,而只是返回之前的那些活动,例如“桌面”。

答案 2 :(得分:3)

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

1.启动完成后创建通知

2.主要活动将在启动时调用

3.按下主页按钮,主要活动将停止,但不会销毁

4.您点击状态栏中的通知,以便application will be resume,以便您已经在后台堆栈中进行了主要活动,并且通知将创建您在问题中提到的新活动NewNoteActivity活动将推送回堆栈.SO在此步骤you have two activities in back stack

5.您按下了按钮,以便last activity will be destroy和您的main activity will be resume但是您想要转到主页屏幕。

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

1.启动完成后创建通知

2.主要活动将在启动时调用

3.按下主页按钮,主要活动将停止,但不会销毁

4.您点击状态栏中的通知,以便application will be resume,以便您已经在后台堆栈中进行了主要活动,并且通知将创建您在问题中提到的新活动NewNoteActivity活动将推送回堆栈.SO在此步骤you have two activities in back stack

5.您按下后退按钮以便last activity will be destroymain activity will be resume但是当您按下NewNoteActivity活动的后退按钮时,您想要打开主页活动。

因此,解决方案是,当您从NewNoteActivityactivity按下后退按钮时,再次使用Intent.FLAG_ACTIVITY_CLEAR_TOP标志启动主要活动,以便您的主要活动将重新创建并接收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();
    }

现在您必须在主要活动中实施onNewIntent()方法

在从NewNoteActivity活动按下的后退按钮上,您的Main活动将调用onNewIntent()方法,因此在此方法中您必须获取从NewNoteActivity活动传递的标志变量。如果您获得标志并且如果它是真的那么就完成主要活动,以便您将获得主屏幕。

修改

您说您已打开A,B或C中的任何活动并按下后退按钮以关闭此活动。如果此时您只有一个活动,那么您的应用程序将是关闭意味着你将进入主屏幕。但是如果你有多个活动并按下后退按钮,你至少有一个活动在堆栈中,现在你点击通知,这样就会打开一个与你的通知相关的新活动,这样就可以了活动将被推到后面的堆栈上。现在,如果您按下后退按钮,如果您没有在该活动中修改onBackPressed()方法,那么您将关闭与您的通知相关联的上一个活动,然后如果有任何活动,它将检查堆栈在后台堆栈中,以便恢复活动或如果后台堆栈中没有活动,那么您的应用程序将被关闭,您将进入主屏幕

答案 3 :(得分:2)

我在我的应用中使用此解决方案。 覆盖onBackPressed(在您从通知路由的活动中)并检查您的应用是否在堆栈中。如果没有,那么开始您的根活动。用户始终可以从根活动导航。这就是我在我的应用程序中所做的事情

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

答案 4 :(得分:0)

它对我有用。试试这个:

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