6

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

当我的应用程序不在前台时,我希望服务停止。我希望 Application 类能让我覆盖 onPause 和 onResume 处理程序,但它没有它们。还有另一种方法可以做到这一点吗?

4

8 回答 8

5

我还没有对此进行测试,但看起来如果您使用Context#bindService()(而不是Context#startService()),服务应该在没有更多活动绑定到它时停止。(请参阅服务生命周期)。

然后在每个活动中使用onPause()/onResume()来绑定/取消绑定服务。

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

于 2010-12-04T05:26:46.387 回答
1

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

public void onPause()
{
super.onPause();
activity1IsResumed = true;
}

&same for onResume

& 同样在启动新活动时

startActivityForResult(myintent ,0);
activity2IsResumed = true;
activity1IsResumed = false;

然后在您的服务中简单地检查

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

&你完成了!

于 2010-12-08T10:18:03.773 回答
0

我没有尝试过这种方法,但我认为您可以通过使用覆盖 android 设备的主页键,KeyEvent.KEYCODE_HOME您可以使用它stopService(Intent)来停止您的服务,当应用程序再次恢复时,您可以startService(Intent)在 Activity 的 onResume() 方法中编写。

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

于 2010-12-04T07:06:49.317 回答
0

听起来真正的问题是如何仅在您进行不属于您自己的活动时才停止服务?一种方法是在您的 onPause 方法中停止活动。为您的所有活动执行此操作。然后覆盖您的 startActivity 方法。并在这里做一个条件测试,以确认你是有目的地导航到你自己的。如果您将标志设置为true。

现在回到你的暂停覆盖方法。并且仅在标志不等于 true 时才停止您的服务。将标志设置为假。

所有离开的事件都将关闭您的服务。导航到您自己的将保持原样。

在所有活动都扩展的基类中进行覆盖。

写在我的安卓里。稍后将发布ezaple。

于 2010-12-10T21:48:07.310 回答
0

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

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

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

intent.putExtra("transition",true);

在接收 Activity 中跟随:(在 onCreate 中)

intent.getBooleanExtra("transition",false);

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

在第一个 Activity 上,如果您要切换到另一个 Activity,您只需停止服务,您应该能够以编程方式确定一个 Activity 是否从另一个 Activity 启动。

于 2010-12-09T19:33:44.853 回答
0

尝试使用绑定服务技术来完成此操作。

绑定服务 | 安卓开发者

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

于 2014-03-24T15:11:10.123 回答
0

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

于 2010-10-28T17:31:05.927 回答
-1

在您的 Application 对象中创建方法registerActivity()并在您的所有操作中实现第一个方法,并在您的所有操作中实现第二个方法。unRegisterActivity()onResume()onPause()

第一种方法将活动添加到List<Activity>您的应用程序对象中的实例,unRegisterActivity()检查每次调用中列表的大小if==0 stopService();

于 2010-12-07T03:29:53.897 回答