我有一个跟踪用户位置的服务。当前,服务在应用程序启动时启动,在应用程序终止时停止。不幸的是,如果用户将应用程序保留在后台,则服务永远不会停止并耗尽电池。
当我的应用程序不在前台时,我希望服务停止。我希望Application类能让我覆盖onPause和onResume处理程序,但它没有它们。还有另一种方法可以实现这个目标吗?
答案 0 :(得分:5)
我还没有对此进行测试,但看起来如果使用Context#bindService()
(而不是Context#startService()
),服务应该在没有更多活动绑定时停止。 (见Service lifecycle)。
然后在每个活动中使用onPause()
/ onResume()
来绑定/取消绑定服务。
或者,您可以在服务上添加一对方法,告诉它开始/停止收听位置更新,并从每个活动的onResume()
/ onPause()
中调用它。该服务仍在运行,但位置更新不会耗尽电池。
答案 1 :(得分:1)
阅读以上所有答案我建议只需为每个活动添加一个布尔全局标记&把它放在你的onResume& onPause&同时启动一个像这样的活动
public void onPause()
{
super.onPause();
activity1IsResumed = true;
}
&同样适用于onResume
&安培;同样在启动新活动时
startActivityForResult(myintent ,0);
activity2IsResumed = true;
activity1IsResumed = false;
然后在您的服务中只需检查
if(activity1IsResumed || activity2IsResumed || activity3IsResumed)
{
//your logic
}
else
{
//another logic
//or dont run location tracker
}
&安培;你完成了!
答案 2 :(得分:0)
答案 3 :(得分:0)
我没有尝试过这种方法,但我认为您可以使用KeyEvent.KEYCODE_HOME
覆盖Android设备的主页键,您可以使用stopService(Intent)
来停止服务,当应用程序重新启动时,您可以编写您的Activity的onResume()方法中的startService(Intent)
。
这样我认为只有当用户明确按下主页按钮才能在后台运行应用程序而不是从一个活动切换到另一个活动时,您的服务才会停止。
答案 4 :(得分:0)
我建议覆盖其他人所说的onPause / onReume方法。如果不了解应用程序的流程和活动之间的交互,我无法提供更多的信息,而不是猜测。
但是,如果您的活动是持久的,我的建议是在活动之间切换时更好地利用意图。
例如,每个Activity都应该有一个布尔“过渡”标志。因此,当您从一个Activity移动到下一个Activity时,您将设置一个Intent extra:
intent.putExtra("transition",true);
通过以下方式接收活动:(在onCreate中)
intent.getBooleanExtra("transition",false);
这样,对于每个启动的Activity,您都可以知道它是来自另一个Activity,还是已经从主屏幕启动器启动。因此,如果它得到一个真正的转换,那么onPause不应该停止服务 - 这意味着你将在它返回后返回上一个Activity。如果它没有收到额外的“转换”或错误转换,那么你可以放心地假设它下面没有等待接管当前活动的活动。
在第一个Activity上,如果你要切换到另一个Activity,你只需要停止服务,如果一个Activity从另一个Activity启动,你应该能够以编程方式找出它。
答案 5 :(得分:0)
听起来真正的问题是当你去一个不属于你自己的活动时如何才停止服务?一种方法是在onPause方法中停止活动。为您的所有活动执行此操作。然后覆盖您的startActivity方法。在这里做一个条件测试,以确认你有目的地导航到你自己的一个。如果您将标志设置为true。
现在回到暂停覆盖的方法。如果标志不等于true,则仅停止服务。将标志设置为false。
所有离开的活动都会关闭您的服务。导航到您自己将保持完整。
覆盖所有活动扩展的基类。
写在我的andolroid中。稍后会发布ezaple。
答案 6 :(得分:0)
尝试使用绑定服务技术来实现此目的。
Bound Services | Android Developers
您可以使用绑定服务,以便在没有绑定任何活动时服务将停止。这样,当应用程序不在前台时,服务将不会运行。当用户将应用程序带回前台时,活动将绑定到服务,服务将恢复。
答案 7 :(得分:-1)
在您的Application对象中创建方法registerActivity()
和unRegisterActivity()
,并在所有行为onResume()
中实现第一个方法,在行为onPause()
中实现第二个方法。
第一种方法是向应用对象中的List<Activity>
实例添加活动,unRegisterActivity()
会在每次调用if==0 stopService();
中检查列表大小。