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

Posted

技术标签:

【中文标题】在不将应用程序带到前台的情况下,从前台服务完成()活动的最佳方法是啥?【英文标题】:What is the best way to finish() an activity from a foreground service without bringing the app to the foreground?在不将应用程序带到前台的情况下,从前台服务完成()活动的最佳方法是什么? 【发布时间】:2019-08-15 05:59:04 【问题描述】:

我正在尝试构建一个可用于通话的应用。 我的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 个 Intent 仅在它们的附加内容上有所不同,因此 android 无法区分它们,即intent#filterEquals() 看不出它们之间有任何区别。

但更重要的问题是我如何finish() CallActivity 并让它默默地从后台弹出,而不是将其带到前台。另外,在停止CallActivity 之后,我需要在后台停止CallService。因此,当用户在最近的屏幕中点击应用程序时,她/他应该会在后台看到CallActivity 之前的活动。

PS:挂断电话的逻辑已经在CallActivityonNewIntent()方法中完成。

【问题讨论】:

System.exit(1); 见How to exit an Android app programmatically? 谢谢@JonGoodwin 但System.exit() 似乎有点苛刻。我尝试了下面@David Wasser 建议的解决方案,似乎效果很好。 System.exit() 绝对不是你想要的。 Android 将其解释为“您的应用崩溃了”。 【参考方案1】:

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

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

【讨论】:

谢谢@David Wasser。该解决方案非常有效。不幸的是,在我获得更多声誉之前,我的支持不会反映出来:( 您可以通过单击答案旁边的绿色复选标记来接受答案。这将帮助其他有类似问题的人。它还会将该问题从未回答的问题列表中删除,并为我提供一些声誉积分。

以上是关于在不将应用程序带到前台的情况下,从前台服务完成()活动的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

将应用程序带到前台时获取准确的坐标

UILocalNotification 触发时自动将应用程序从后台带到前台?

iOS10:从本地通知中点击操作不会将应用程序带到前台

iOS 私有 API 调用将应用程序带到前台

如何在 OS X 上将进程窗口置于前台?

在 Android 11 上,如何在不实际点击通知的情况下从通知更新启动 Activity