在不将应用程序带到前台的情况下从前台服务完成 () activity 的最佳方法是什么?

What is the best way to finish() an activity from a foreground service without bringing the app to the foreground?

我正在尝试构建一个可用于通话的应用程序。 我的 CallActivity 在清单文件中声明为 singleTop。我有一个前台服务 (CallService),它会在用户通话时应用程序进入后台后立即启动,因为设备在通话期间不能休眠。

我的 CallService 的通知允许用户恢复通话或挂断电话。我的目标是让用户按下通知上的按钮并挂断正在进行的通话,而不会将应用程序带到前台。

我曾尝试使用 PendingIntent.getActivity() 在应用程序处于后台后从 CallService 启动 CallActivity。但我还没能挂断电话。这是一些代码...

 Intent returnToCallIntent = new Intent(this, CallActivity.class);
 PendingIntent returnPendingIntent = PendingIntent.getActivity(this, 0, returnToCallIntent, 0);

 Intent hangUpCallIntent = new Intent(this, CallActivity.class);
 hangUpCallIntent.putExtra("ACTION_FINISH_ACTIVITY", true);
 PendingIntent hangUpPendingIntent = PendingIntent.getActivity(this, 0, hangUpCallIntent, PendingIntent.FLAG_UPDATE_CURRENT);

现在,两个待处理的意图都解析为相同的操作,即挂断电话,同时将应用程序带到前台。我发现发生这种情况是因为这两个意图仅在它们的附加功能上有所不同,因此 android 无法区分它们,即 intent#filterEquals() 看不出它们之间有任何区别。

但更重要的问题是我怎样才能 finish() CallActivity 并让它静静地从后台弹出,而不将其带到前台。另外,在 CallActivity 停止后,我需要在后台停止 CallService 。因此,当用户在最近屏幕中点击应用程序时,she/he 应该会在后台堆栈中看到 CallActivity 之前的 activity。

PS: 挂断电话的逻辑已经在CallActivity.

onNewIntent()方法中完成

您可以让您的 Activity 注册一个匿名 BroadcastReceiver 来侦听特定广播 Intent。当您的 Service 想要完成 Activity 时,它可以发送 Activity 正在监听的广播 Intent

BroadcastReceiveronReceive()中调用finish()即可。这不会将 Activity 带到前台。