在不将应用程序带到前台的情况下,从前台服务完成()活动的最佳方法是啥?
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:挂断电话的逻辑已经在CallActivity
的onNewIntent()
方法中完成。
【问题讨论】:
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
。
在BroadcastReceiver
的onReceive()
中,只需调用finish()
。这不会将Activity
带到前台。
【讨论】:
谢谢@David Wasser。该解决方案非常有效。不幸的是,在我获得更多声誉之前,我的支持不会反映出来:( 您可以通过单击答案旁边的绿色复选标记来接受答案。这将帮助其他有类似问题的人。它还会将该问题从未回答的问题列表中删除,并为我提供一些声誉积分。以上是关于在不将应用程序带到前台的情况下,从前台服务完成()活动的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章