从服务打开系统设置

时间:2011-08-02 00:03:13

标签: android android-service

当我的应用程序在前台运行时,我正在编写一个服务来收集位置读数。在LocationListener中,我想使用onProviderDisabled()方法打开一个对话框,告诉用户该位置提供程序已被禁用,并在对话框上有一个按钮,用于启动系统的位置设置面板,允许用户在选择时启用位置提供程序。如果这是一项活动,我会使用startActivityforResult()启动系统设置,但我只能使用服务中的startActivity

我的问题是:有没有办法可以从服务中打开设置,关闭这个新活动并在用户更改设置后返回我的应用程序?

编辑我想要实现的是Service从应用程序打开到关闭并收集位置读数的时间点运行,保持最佳的位置估计值以供使用应用程序。如果服务中的LocationListener已调用onProviderDisabled,我希望这会打开一个对话框,让用户可以选择进入系统设置并启用位置提供程序(或取消并继续,虽然某些应用程序的功能在没有位置的情况下不起作用)。我同意Service可能不是进行对话/活动启动部分的地方,因为它是一个没有UI的后台组件,但我不确定这个代码应该去哪里。

3 个答案:

答案 0 :(得分:1)

从编辑到你的问题以及评论到Sam的答案,我基本上都会检查应用程序的活动(或所有活动)并从那里启动对话框和后续的“设置”页面(如果是用户)选择转到设置)。

基本上,让服务根据主Activity遇到的当前环境(提供程序已禁用/已启用)执行所需的操作。如果您的服务将在没有用户前端的情况下运行,那么请相应地补偿并减少其“职责”。<​​/ p>

此外,在这种情况下,Sam的使用通知(这反过来可能会导致设置被打开)的想法是一个很好的中间地带。

编辑进一步解释。采取像电子邮件应用程序一样简单的事情这有两个方面......

首先是一个用户界面 - 当用户打开他们的电子邮件应用程序时,如果“网络”被禁用,则会通过一个对话框告知用户,并选择进入网络设置以启用网络。按BACK(来自“设置”)将返回到电子邮件应用程序,它将尝试下载任何新电子邮件。如果用户决定不启用网络,他们仍然可以查看以前下载的电子邮件(类似于您的部分功能)。

其次有一个后台服务,即使UI关闭,也会定期(每15分钟,30分钟,1小时等)尝试下载任何新电子邮件。如果网络被禁用,它将只是进入休眠状态(直到下一次下载时间)。

理论上,如果用户禁用网络,后台电子邮件服务“可以”提供一个对话框或通知,说“您确实意识到我现在无法工作吗?”......这就是您想要做的事情但是,如果服务还有其他事情要做,那么它可以简单地执行这些操作并忽略任何与网络相关的任务。下次用户启动活动时,他们会出现一个对话框,其中包含启用网络的选项。

这更有意义吗?

答案 1 :(得分:0)

是的,服务使用ContextWrapper.startActivity()方法打开所需的“设置”菜单。用户将选择他们想要启用的内容,然后触摸返回以返回您的活动。返回您的活动后,您可以查看LocationManager.isProviderEnabled()。不幸的是,服务无法获取活动结果。

答案 2 :(得分:0)

只是好奇。即使用户没有看到屏幕,甚至可能关闭屏幕,服务也可能会运行。是一个好主意,从服务中显示一个对话框。

无论如何,既然你知道如何展示一个活动,那么在onCreate中激活设置的意图并在你到达onActivityResult后完成它。

确定这是一个简单的黑客攻击。

编辑:如果您不确定应该去哪里。我能想到的最好的,甚至在某些应用程序中看到的是通知区域。