当我的应用程序在前台运行时,我正在编写一个服务来收集位置读数。在LocationListener
中,我想使用onProviderDisabled()
方法打开一个对话框,告诉用户该位置提供程序已被禁用,并在对话框上有一个按钮,用于启动系统的位置设置面板,允许用户在选择时启用位置提供程序。如果这是一项活动,我会使用startActivityforResult()
启动系统设置,但我只能使用服务中的startActivity
。
我的问题是:有没有办法可以从服务中打开设置,关闭这个新活动并在用户更改设置后返回我的应用程序?
编辑我想要实现的是Service
从应用程序打开到关闭并收集位置读数的时间点运行,保持最佳的位置估计值以供使用应用程序。如果服务中的LocationListener
已调用onProviderDisabled
,我希望这会打开一个对话框,让用户可以选择进入系统设置并启用位置提供程序(或取消并继续,虽然某些应用程序的功能在没有位置的情况下不起作用)。我同意Service
可能不是进行对话/活动启动部分的地方,因为它是一个没有UI的后台组件,但我不确定这个代码应该去哪里。
答案 0 :(得分:1)
从编辑到你的问题以及评论到Sam的答案,我基本上都会检查应用程序的活动(或所有活动)并从那里启动对话框和后续的“设置”页面(如果是用户)选择转到设置)。
基本上,让服务根据主Activity遇到的当前环境(提供程序已禁用/已启用)执行所需的操作。如果您的服务将在没有用户前端的情况下运行,那么请相应地补偿并减少其“职责”。</ p>
此外,在这种情况下,Sam的使用通知(这反过来可能会导致设置被打开)的想法是一个很好的中间地带。
编辑进一步解释。采取像电子邮件应用程序一样简单的事情这有两个方面......
首先是一个用户界面 - 当用户打开他们的电子邮件应用程序时,如果“网络”被禁用,则会通过一个对话框告知用户,并选择进入网络设置以启用网络。按BACK(来自“设置”)将返回到电子邮件应用程序,它将尝试下载任何新电子邮件。如果用户决定不启用网络,他们仍然可以查看以前下载的电子邮件(类似于您的部分功能)。
其次有一个后台服务,即使UI关闭,也会定期(每15分钟,30分钟,1小时等)尝试下载任何新电子邮件。如果网络被禁用,它将只是进入休眠状态(直到下一次下载时间)。
理论上,如果用户禁用网络,后台电子邮件服务“可以”提供一个对话框或通知,说“您确实意识到我现在无法工作吗?”......这就是您想要做的事情但是,如果服务还有其他事情要做,那么它可以简单地执行这些操作并忽略任何与网络相关的任务。下次用户启动活动时,他们会出现一个对话框,其中包含启用网络的选项。
这更有意义吗?
答案 1 :(得分:0)
是的,服务使用ContextWrapper.startActivity()方法打开所需的“设置”菜单。用户将选择他们想要启用的内容,然后触摸返回以返回您的活动。返回您的活动后,您可以查看LocationManager.isProviderEnabled()。不幸的是,服务无法获取活动结果。
答案 2 :(得分:0)
无论如何,既然你知道如何展示一个活动,那么在onCreate中激活设置的意图并在你到达onActivityResult后完成它。
确定这是一个简单的黑客攻击。编辑:如果您不确定应该去哪里。我能想到的最好的,甚至在某些应用程序中看到的是通知区域。