Android 根据应用程序状态停止和启动服务

Android 根据应用程序状态停止和启动服务,android,service,battery,Android,Service,Battery,我有一个跟踪用户位置的服务。目前,服务在应用程序启动时启动,在应用程序终止时停止。不幸的是,如果用户将应用程序保留在后台,服务将永远不会停止并耗尽电池电量 当我的应用程序不在前台时,我希望服务停止。我希望应用程序类能让我重写onPause和onResume处理程序,但它没有。是否有其他方法可以完成此任务?您应该覆盖您的计算机上的和方法。如果您有多个活动,您可能希望为它们创建一个公共基类,并将启动/停止逻辑放入基类。我还没有测试过这一点,但如果您使用上下文#bindService()(而不是上下文

我有一个跟踪用户位置的服务。目前,服务在应用程序启动时启动,在应用程序终止时停止。不幸的是,如果用户将应用程序保留在后台,服务将永远不会停止并耗尽电池电量


当我的应用程序不在前台时,我希望服务停止。我希望应用程序类能让我重写onPause和onResume处理程序,但它没有。是否有其他方法可以完成此任务?

您应该覆盖您的计算机上的和方法。如果您有多个活动,您可能希望为它们创建一个公共基类,并将启动/停止逻辑放入基类。

我还没有测试过这一点,但如果您使用
上下文#bindService()
(而不是
上下文#startService()
),则在没有更多活动绑定到服务时,服务应该停止。(见附件)

然后在每个活动中使用
onPause()
/
onResume()
绑定/解除绑定服务


或者,您可以在服务上添加一对方法,告诉它开始/停止侦听位置更新,并从每个活动的
onResume()
/
onPause()
调用它。该服务仍在运行,但位置更新不会耗尽电池。

我没有尝试过这种方法,但我认为您可以使用
KeyEvent.KEYCODE\u home
覆盖android设备的home键,并且您可以使用
stopService(Intent)
停止服务,当应用程序再次恢复时,您可以在活动的onResume()方法中编写
startService(Intent)


这样,我认为只有当用户明确按下home按钮在后台获取应用程序时,您的服务才会停止,而不是当他从一个活动切换到另一个活动时。

创建方法
注册活动()
取消注册活动()
在应用程序对象中,并在所有操作中实现第一个方法
onResume()
和第二个操作
onPause()


第一种方法是将活动添加到应用程序对象的
列表
实例中,
取消注册活动()
检查每次调用中列表的大小
如果==0 stopService()

阅读以上所有答案,我建议只需为每个活动添加一个布尔全局标志,并将其放在您的onResume和onPause中,同时启动类似的活动

public void onPause()
{
super.onPause();
activity1IsResumed = true;
}
&简历上也一样

&同样,在启动新活动时

startActivityForResult(myintent ,0);
activity2IsResumed = true;
activity1IsResumed = false;
然后在您的服务中,只需检查

if(activity1IsResumed || activity2IsResumed || activity3IsResumed)
{
//your logic
}
else
{
//another logic
//or dont run location tracker
}

&你完了

我的建议是像其他人所说的那样覆盖onPause/onReume方法。如果不了解更多关于应用程序流程和活动之间交互的信息,我就无法提供更多的信息,除了猜测

但是,如果您的活动是持续的,我的建议是在活动之间切换时更好地利用意图

例如,每个活动都应该有一个布尔“转换”标志。因此,当您从一个活动移动到下一个活动时,您设置了一个额外的意图:

intent.putExtra("transition",true);
在接收活动中后跟:(在onCreate中)

这样,对于启动的每个活动,您可以知道它是来自另一个活动,还是来自主屏幕启动器。因此,如果它得到了一个真正的转换,那么onPause不应该停止服务——这意味着在它返回后,您将返回到上一个活动。如果它没有收到任何额外的“转换”或错误的转换,那么您可以安全地假设它下面没有等待接管当前转换的活动


在第一个活动中,如果您切换到另一个活动,您只需停止服务,您应该能够通过编程确定一个活动是从另一个活动开始的。

听起来真正的问题是如何仅在您转到非您自己的活动时停止服务?一种方法是使用onPause方法停止活动。在你所有的活动中都这样做。然后覆盖startActivity方法。在这里做一个条件测试来确认你是有目的地导航到你自己的一个。如果已将标记设置为true

现在回到暂停覆盖方法。并且只有当标志不等于true时才停止服务。将标志设置为false

所有导航离开的事件都将关闭您的服务。导航到您自己的将保持它完好无损

在所有活动都扩展的基类中执行重写


写在我的安德洛伊德。稍后将发布ezaple

尝试使用绑定服务技术来实现这一点


您可以使用绑定服务,使服务在没有任何活动绑定到它时停止。这样,当应用程序不在前台时,服务将不会运行。当用户将应用程序带回到前台时,活动将绑定到服务,服务将恢复。

那么您希望我的位置服务在每次进入新屏幕时停止并启动吗?我不认为这是我想要的。你可以在自己的应用程序中启动活动时设置一个标志,并且只有在启动自己的活动标志未设置时才停止服务。当你说“你的应用程序不在前台”时,你指的是与你的服务不同的活动吗(虽然是同一个应用程序的一部分,我敢肯定)?在服务的永无止境的循环中,添加一个检查以查看应用程序是否在前台。但这会使您失去清单中的“获取任务”权限。有趣的是,onPause/onResume方法的唯一问题是,在启动新活动时,当前活动会在新活动恢复之前暂停。因此,启动新活动将停止该服务。您的第二个建议可能会
intent.getBooleanExtra("transition",false);