【问题标题】:On Notification Click put my app to background在通知单击时将我的应用程序置于后台
【发布时间】:2017-10-28 16:21:57
【问题描述】:

我正在开发一项功能,当用户通过 Google 导航应用程序导航(使用后台服务获取位置更新)时,我会收到 POI(兴趣点)通知。

场景

1) 用户从我的应用中点击导航按钮

2) 他被带到带有数据导航的谷歌导航

3) 现在用户收到Notification 的 POI,然后他点击它并被带到我的应用程序(我的应用程序被带到前台,仍然是 Google Navigation i 在后台)

4) 现在用户正在查看我的应用,现在他点击了相同的通知,在这种情况下,我必须将我的应用置于后台,以便使用现在看到 Google 导航

我尝试了什么

将我的应用程序置于前台已实现,但未实现在通知点击时将我的应用程序置于后台。

moveTaskToBack(true)这是我遇到的,但是我如何在通知点击中实现它

代码

Intent intent = new Intent();
        intent.setComponent(new ComponentName(getPackageName(), B_Activity.class.getName()));
        intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
        intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
        intent.putExtra("toFront", toFront);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

【问题讨论】:

  • moveTaskToBack(boolean bool) 是一个 Actvity 类的方法。所以你只能用活动引用来调用它。我不认为有办法做到这一点。你可以做什么在通知意图中调用一个活动,然后验证活动中的意图(如果它在前台)。
  • moveTaskToBack(true) 提供按主页按钮的体验。即每个应用程序都放在后台。我只希望我的应用在 bg 中,以便用户看到导航应用
  • 我认为 moveTaskToBack(true) 不会为所有应用程序提供按下主页按钮的体验。我刚刚测试了它。它仅适用于调用应用程序。
  • 是的......我还注意到......当我从通知中打开我的应用程序时,如果该活动未打开(用户按下从 B 到 A 的返回按钮),我的应用程序崩溃。
  • 崩溃是怎么回事?

标签: android notifications background-foreground


【解决方案1】:

moveTaskToBack(boolean bool) 是 Activity 类的方法。所以你只能用活动引用来调用它。我不认为有办法做到这一点。您可以在通知意图中发送广播,然后在活动中验证意图(如果它在前台)-> 调用 movetaskBack()。

如果您的 B_Activity 没有 Ui 。然后只需在 Pending Intent 中设置 null 组件。 使用本地广播通知您当前正在运行的活动以调用 moveTaskToBack()。

Intent intent = new Intent();
intent.setAction("com.settaskback");//Your custom action goes here
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);

然后在通知点击时发送广播。接收此广播的 Activity 会将任务置于后台(仅当其处于前台时)

final Intent broadcastIntent = new Intent("com.settaskback");
        PendingIntent intent = PendingIntent.getBroadcast(getApplicationContext(), 0, broadcastIntent, PendingIntent.FLAG_UPDATE_CURRENT);
        notificationBuilder.setContentIntent(intent);
        notification = notificationBuilder.build();
        notification.flags |= Notification.FLAG_AUTO_CANCEL;
        NotificationManager mNotificationManager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        mNotificationManager.notify(1, notification);

您需要在 Activity 中为此操作注册一个本地广播接收器。

@Override
    public void onReceive(Context context, Intent intent) {
          if(somecondition){
              moveTaskToBack(true);
          }
    }

【讨论】:

  • 您创建 PendingIntent 广播的想法让我受益匪浅 .. 谢谢。答案被接受:)
猜你喜欢
  • 2018-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-04
  • 2019-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多