Android - 构建通知,TaskStackBuilder.addParentStack不能正常工作

Dav*_*ato 55 notifications android

我正在尝试从Android docs说明的通知中启动活动,但是当我打开通知然后按后退按钮时,HomeActivity(父级)不会打开,而是应用程序关闭.我究竟做错了什么?

    Intent resultIntent = new Intent(context, MatchActivity.class);;
    resultIntent.setFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);

    TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);

    // Adds the back stack for the Intent (but not the Intent itself)
    stackBuilder.addParentStack(MainActivity.class);

    stackBuilder.addNextIntent(resultIntent);
Run Code Online (Sandbox Code Playgroud)

Ral*_*gha 93

您需要为要启动的活动添加父堆栈,而不是其父项.

更换:

stackBuilder.addParentStack(MainActivity.class);
Run Code Online (Sandbox Code Playgroud)

有:

stackBuilder.addParentStack( MatchActivity.class );
Run Code Online (Sandbox Code Playgroud)

这假设您已在Manifest(API 16+)中定义了父级:

<activity android:name=".MatchActivity"
    android:parentActivityName=".MainActivity"
    ... />
Run Code Online (Sandbox Code Playgroud)

如果您正在使用API​​ 16进行开发,那么您必须将父级定义为:

<activity android:name=".MatchActivity">
    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value=".MainActivity" />
</activity>
Run Code Online (Sandbox Code Playgroud)

  • 如果仍然无效,请再次卸载并安装 (6认同)
  • 在进一步调查中,它适用于4.1.1手机.使用AOKP 4.1.2,它不起作用. (4认同)
  • TaskStackBuilder仅为具有Honeycomb(3.1)或更高版本的设备创建正确的后备堆栈.在Gingerbread(2.3)及更早版本中,它仅使用顶级Intent来创建PendingIntent. (4认同)

pen*_*Dev 68

如果没有一个解决方案正在运行,并且您确定已经仔细地遵循了所有内容......那么您需要卸载该应用并重新安装它.为我工作!

  • 令人难以置信......这对我来说!谢谢 (14认同)
  • 它也适合我,我一点也不开心.一旦我们发布我们的应用程序,用户会发生什么?卸载和安装应用程序是不可行的,以便完成这项工作.我什么都不懂...... (7认同)
  • 这是Android中记录的错误吗? (6认同)
  • 当你真的不知道是否快乐或疯狂时,它的工作:)>: (5认同)
  • 即使没有即时运行我也遇到了这个问题.首先,我尝试清除数据,但没有任何效果.你*需要*卸载应用程序.只是在这里猜测,但可能是更新不能更改添加parentActivity. (4认同)

Raf*_*ael 10

Intent resultIntent = new Intent(App.getContext(), TargetActivity.class);
Intent backIntent = new Intent(App.getContext(), ParentActivity.class);
backIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
final PendingIntent resultPendingIntent = PendingIntent.getActivities(
                                    App.getContext(), 0, 
               new Intent[]{backIntent, resultIntent}, PendingIntent.FLAG_ONE_SHOT);
mNotifyBuilder.setContentIntent(resultPendingIntent);
Run Code Online (Sandbox Code Playgroud)

这解决了Notification Click上父堆栈的问题

  • 2019 年测试 - 有效。无需重新安装。应该是公认的答案 (2认同)

Ita*_*tto 7

使用TaskStackBuilder并没有解决我的问题,只适用于Honeycomb和更高版本.所以我采取以下解决方案(请不要将我钉在十字架上):

  1. 调用MainActivity而不是MatchActivity传递MatchActivity作为参数(通过Intent).
  2. MainActivity.onCreate,启动MatchActivityif参数是否可用.

新代码:

Intent resultIntent = new Intent(context, MainActivity.class) //
        .putExtra(MainActivity.ACTIVITY_EXTRA, MatchActivity.class.getName()) //
        .putExtra("Pass extras to MatchActivity", "if you want! :)");

PendingIntent pendingIntent = PendingIntent.getActivity(context, visitId, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT);

Notification notification = new NotificationCompat.Builder(context) //
            .setContentIntent(pendingIntent) //
            .build();
Run Code Online (Sandbox Code Playgroud)

MainActivity:

public static final String ACTIVITY_EXTRA = "activity";

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getIntent().getStringExtra(ACTIVITY_EXTRA) != null) {
        startActivity(new Intent(getIntent()).setClassName(this, getIntent().getStringExtra(ACTIVITY_EXTRA)));
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)