【问题标题】: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()方法中完成。

【问题讨论】:

  • 谢谢@JonGoodwin 但System.exit() 似乎有点苛刻。我尝试了下面@David Wasser 建议的解决方案,似乎效果很好。
  • System.exit() 绝对不是你想要的。 Android 将其解释为“您的应用崩溃了”。

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


【解决方案1】:

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

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

【讨论】:

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