Notification中PendingIntent的跳转问题记录

1,666 阅读3分钟

Android官网Notification关于PendingIntent示例

Android 官网文档有关Notification通知点击启动Activity,在构建PendingIntent的示例代码:

构建包含返回堆栈的 PendingIntent

网络上查找的有关 TaskStackBuilder 的知识点

官网代码示例如下:

    <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>
    <!-- MainActivity is the parent for ResultActivity -->
    <activity
        android:name=".ResultActivity"
        android:parentActivityName=".MainActivity" />
        ...
    </activity>
    // Create an Intent for the activity you want to start
    Intent resultIntent = new Intent(this, ResultActivity.class);
    // Create the TaskStackBuilder and add the intent, which inflates the back stack
    TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
    stackBuilder.addNextIntentWithParentStack(resultIntent);
    // Get the PendingIntent containing the entire back stack
    PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);

项目中出现的问题

这种写法是为了让由通知启动的Activity,点击返回键后会显示堆栈中已存在的Activity

这两处的代码基本一致,我在自己的app中也是将PendingIntent按照这种写法,结果出现了错误,本app中有关Notification的代码是写在Service中的,也不知道以上的写法是不是跟这个有关系,出错的表现为:

  1. 当通知合并成组的样式,点击通知组,会启动默认的LauncherActivity(我需要的是将通知组展开)
  2. 通知组展开后,点击单独的通知会将所有已经存在堆栈的Activity全部出栈,并启动PendingIntent中的Activity ,再点击返回会启动在清单文件中添加了android:parentActivityName的Activity。(即使此Activity之前不在栈顶,也会被调起)

Android示例 解决问题

后来到官网中下载Android在Github中的示例项目Android通知示例,在示例代码中看到如下写法(英文注释做了机翻)

// 3. 设置通知的主要意图。
Intent mainIntent = new Intent(this, BigPictureSocialMainActivity.class);

// 当你创建你的Intent时,你需要考虑回退状态,即,当你的Activity启动和用户按下后退按钮后发生了什么。
// 有两种选择:
//      1. 常规活动——你正在启动一个activity,它是应用程序正常工作流程的一部分。

//      2. 特殊活动-用户只看到这个活动,如果它是从一个通知开始的。
//      在某种意义上,Activity通过提供难以在通知本身中显示的信息扩展了通知。

// 即使这个示例的MainActivity没有链接到这个Activity,这个Notification直接启动,
// 也就是说,它不是正常工作流程的一部分,一个社交应用通常都会链接到作为应用流程一部分的单个帖子,所以我们将遵循选项1。
// 关于选项2的示例,请查看BIG_TEXT_STYLE示例。

// 更多信息,请查看我们的开发文章:
// https://developer.android.com/training/notify-user/navigation.html

TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
// 添加back堆栈。
stackBuilder.addParentStack(BigPictureSocialMainActivity.class);
// 将Intent添加到堆栈顶部。
stackBuilder.addNextIntent(mainIntent);
// 获取包含整个back堆栈的PendingIntent。
PendingIntent mainPendingIntent = PendingIntent.getActivity(this, 0, mainIntent, PendingIntent.FLAG_UPDATE_CURRENT);

修改后,程序正常。

随后测试了如下写法:

stackBuilder.addParentStack(MessageDetailNewActivity.class);
stackBuilder.addNextIntent(messageIntent);
//这个方法内部就是调用了上两行,所以效果是一致的
//stackBuilder.addNextIntentWithParentStack(messageIntent);

关键是项目原先是使用了这个方法

PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);

在我的app中使用这种写法出现了上述的错误,但是看官网文档和网友的文章里,都是使用了TaskStackBuilder.getPendingIntent()方法的,不知道是不是我的通知是在service种创建的缘故,能正常调用的只有使用PendingIntent.getActivity(),由于项目时间原因,就没有在Activity中创建通知的来测试这种情况,这里就记录下,以后再写demo测试。