在不使应用程序进入前台的情况下完成(从)前台服务完成活动的最佳方法是什么?

时间:2019-03-25 01:31:03

标签: android android-activity android-service android-pendingintent

我正在尝试构建可用于通话的应用程序。 我的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);

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

但是,更重要的问题是,我如何finish() CallActivity并使其无声地从后堆栈弹出,而又没有使其前台。另外,CallActivity停止后,我需要在后台停止CallService。因此,当用户在“最近使用”屏幕中点击该应用程序时,他/他应该在后退堆栈上看到CallActivity之前的活动。

PS:在onNewIntent()中的CallActivity方法中完成了挂断电话的逻辑。

1 个答案:

答案 0 :(得分:0)

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

onReceive()中的BroadcastReceiver中,只需调用finish()。这不会将Activity带到前台。