【问题标题】:Android - Build a notification, TaskStackBuilder.addParentStack not workingAndroid - 构建通知,TaskStackBuilder.addParentStack 不起作用
【发布时间】:2012-11-29 18:39:20
【问题描述】:

我正在尝试从 Android 文档解释的通知中启动一个活动,但是当我打开通知然后按后退按钮时,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);

【问题讨论】:

  • 对于任何想知道的人来说,接受的答案有效,但 Android 文档中不存在 resultIntent.setFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK)。它给了我地狱。

标签: android notifications


【解决方案1】:

您需要为要启动的 Activity 添加父堆栈,而不是它的父堆栈。

替换:

stackBuilder.addParentStack(MainActivity.class);

与:

stackBuilder.addParentStack( MatchActivity.class );

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

<activity android:name=".MatchActivity"
    android:parentActivityName=".MainActivity"
    ... />

如果您在 API 16 下进行开发,则必须将父级定义为:

<activity android:name=".MatchActivity">
    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value=".MainActivity" />
</activity>

【讨论】:

  • 它仅适用于 API 级别 16 及更高级别。如果您低于此值,则必须使用清单中的元标记。抱歉,我必须运行,目前无法获得比这更详细的信息。
  • 没问题,谢谢 :) 我这样做了: 但还是不行...
  • 经过进一步调查,它适用于库存 4.1.1 手机。使用 AOKP 4.1.2,但它不起作用。
  • TaskStackBuilder 仅为具有 Honeycomb(3.1) 或更高版本的设备创建正确的后台堆栈。在 Gingerbread(2.3) 及更早版本中,它仅使用顶部 Intent 来创建 PendingIntent。
  • 如果还是不行,卸载重新安装
【解决方案2】:

如果所有解决方案都不起作用,并且您确定您已仔细遵循所有操作...那么您需要卸载该应用程序并重新安装它。 为我工作!

【讨论】:

  • 难以置信...这就是给我的!谢谢
  • 当你真的不知道该高兴还是该生气的时候它奏效了:) >:|
  • 它也对我有用,我一点也不开心。一旦我们发布我们的应用程序,那里的用户会发生什么?为了完成这项工作,卸载并安装应用程序是不可行的。我什么都不懂……
  • 即使没有即时运行,我也遇到了这个问题。首先我尝试清除数据,但没有任何效果。您确实需要卸载该应用程序。只是在这里猜测,但可能是添加 parentActivity 不能通过更新来更改。
  • 这是 Android 中记录的错误吗??
【解决方案3】:
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);

这解决了我在通知点击时的父堆栈问题

【讨论】:

  • 在 2019 年测试 - 有效。无需重新安装。应该是公认的答案
  • 在 2020 年测试并有效。在所有答案中,这是唯一对我有用的答案
  • 在 2020 年测试过,对我不起作用...您是否做了其他任何事情来使它起作用,例如在活动清单中设置一些东西?
  • 2021 年测试仍然有效。更重要的是,它比其他解决方案更快地打开父活动。谢谢!
【解决方案4】:

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

  1. 调用 MainActivity 而不是 MatchActivity,将 MatchActivity 作为参数传递(通过 Intent)。
  2. MainActivity.onCreate 中,如果参数可用,则启动MatchActivity

新代码:

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

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

【讨论】:

  • @walkmn 这不是解决方案。这是拐杖!尝试在 backstack 中进行 4-5 个活动;)想看看你的简单解决方案:D
【解决方案5】:

对我来说,stackBuilder.addParentStack 不起作用。

我最终这样做了,希望这可以帮助你。

    Intent intent = new Intent(context, MatchActivity.class);

    TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
    // Adds the back stack for the Intent
    stackBuilder.addNextIntentWithParentStack(new Intent(context, MainActivity.class));
    stackBuilder.addNextIntent(intent);
    PendingIntent pendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);

【讨论】:

    【解决方案6】:

    您是否查看过 Android 文档,特别是 Notifications API 指南。它详细描述了如何执行此操作。

    请注意,如果您从通知启动的 Activity 不是正常 Activity 流程的一部分,那么它应该进入应用的起始页;相反,它应该转到主屏幕。

    【讨论】:

      【解决方案7】:

      您应该将其添加到 AndroidManifest 上的 MainActivity:

      <activity
         android:name=".MainActivity"
         android:allowTaskReparenting="true" />
      

      【讨论】:

        【解决方案8】:

        如其他答案所述,TaskStackBuilder 不适用于 Honeycomb 以下的版本。

        我的解决方案是覆盖活动的onBackPressed() 方法。

        @Override
        public void onBackPressed() {
            NavUtils.navigateUpFromSameTask(this);
        }
        

        显然,如果您打算以其他方式完成活动,您也必须处理该问题。 (虽然我认为覆盖 finish() 会产生一些意想不到的行为)。

        【讨论】:

        • @Hesam 它要求您已经说明了父活动,如 Ralgha 的回答中所示
        【解决方案9】:

        我遇到了同样的问题!解决:

        切换到

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

        【讨论】:

          【解决方案10】:

          如果您在项目中使用代码生成(如 Dagger),则应将 MainActivity.class 替换为 MainActivity_.class(或任何您的父活动名称)。我花了一整天才弄清楚这一点。希望这可以挽救某人的一天。

          【讨论】:

            【解决方案11】:

            如果清单中的 activiti 具有下一个 launchMode,也会发生这种情况:

            <activity android:name=".SecondActivity"
                 ...
                     android:launchMode="singleInstance"
                     android:parentActivityName=".MainActiviy"
                ...
            />
            

            【讨论】:

              猜你喜欢
              • 2018-08-05
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多