【问题标题】:Return to currently running activity after clicking on notification单击通知后返回当前正在运行的活动
【发布时间】:2015-06-16 17:13:20
【问题描述】:

我有以下问题: 我编写了一个 android 服务——一个音乐播放器——它在后台运行并在启动时启动一个通知。单击此通知会打开允许与此播放器交互的活动 A。这很好用。

问题是当我有第三方活动(例如网络浏览器)正在运行并且我单击通知时。此单击将我带到活动 A,但单击 BACK 按钮 - 这就是问题 - 将我带到主屏幕。相反,我想 恢复之前运行的活动,即网络浏览器。

有人知道怎么做吗?

    private void initNotification(){

    Intent resultIntent = new Intent(this, AudioPlayerActivity.class);
    //resultIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
    stackBuilder.addParentStack(AudioPlayerActivity.class);
    stackBuilder.addNextIntent(resultIntent);

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

    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this);
    mBuilder.setSmallIcon(...);
    mBuilder.setContentTitle("...");
    mBuilder.setContentText("...");
    mBuilder.setContentIntent(resultPendingIntent);


    // create a notification manager that then displays the notification
    NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());
}

【问题讨论】:

    标签: android android-intent android-activity android-notifications android-pendingintent


    【解决方案1】:

    您的问题是TaskStackBuilder 的使用。不幸的是,这个类对你希望如何管理你的应用程序做了很多假设。当您使用TaskStackBuilder 构造PendingIntent 堆栈时,它会将以下标志添加到“根”Intent

     intents[0].addFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
                Intent.FLAG_ACTIVITY_CLEAR_TASK |
                Intent.FLAG_ACTIVITY_TASK_ON_HOME);
    

    (注意:此代码 sn-p 来自 Android 4.1.1 中 TaskStackBuilder 的源代码)

    由于设置了Intent.FLAG_ACTIVITY_TASK_ON_HOME,它会在主屏幕顶部启动您的任务,而不是在用户当前任务的顶部启动它。

    如果您可以避免使用TaskStackBuilder,则可以解决此问题。如果你真的需要构建一个活动栈,你可以使用PendingIntent.getActivities(),在这里你可以控制在每个Intent中设置哪些标志。否则,只需使用PendingIntent.getActivity() 创建您放入NotificationPendingIntent


    注意:编辑以添加示例代码

    试试这个:

    private void initNotification(){
        Intent resultIntent = new Intent(this, AudioPlayerActivity.class);
        resultIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        PendingIntent resultPendingIntent = PendingIntent.getActivity(this, 0, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT);
        NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this);
        mBuilder.setSmallIcon(...);
        mBuilder.setContentTitle("...");
        mBuilder.setContentText("...");
        mBuilder.setContentIntent(resultPendingIntent);
        // create a notification manager that then displays the notification
        NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());
    }
    

    【讨论】:

    • 很棒的信息。以前从未使用过此标志。
    • 嗨大卫!感谢您的回答。我尝试省略 TaskStackBuilder 并使用 PendingIntent.getActivities(),但结果保持不变。您能否简要概述一下——也许用一些伪代码——如何将 taskStackBuilder 与 PendingIntent.getActivities() 结合使用?提前非常感谢。
    【解决方案2】:

    我不认为这是你需要处理的事情。这取决于已经在运行的应用程序。

    我刚刚尝试了两次通知。在第一种情况下,whatsapp 正在运行,然后在打开通知并按下后退按钮时,我被带回了 whatsapp。在第二种情况下,我运行了 chrome,单击通知并返回时,我被带回主屏幕。

    在第二种情况下,chrome 可能会在其当前活动上调用完成(),该活动被破坏,并且后台堆栈中没有更多活动,因此它会将您带回主屏幕。

    【讨论】:

    • 感谢您的快速回复。我在我的设备上使用 Firefox 和来自后台进程(任务管理器)的通知进行了尝试。然后它返回到 Firefox。但是,当我点击我的应用生成的通知时,它会返回到主菜单。
    • 不,这实际上是您可以控制的行为。这完全取决于您在Intent 中设置的标志,您在PendingIntent 中设置的标志,您在Notification 中设置的标志。
    • 再次感谢!明天我会试一试,然后告诉你结果如何。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多