Android常规GPS轮询服务,最大限度延长电池寿命

Android常规GPS轮询服务,最大限度延长电池寿命,第1张

概述我正在尝试编写一项服务,每隔X分钟就会尝试获取设备的GPS位置,即使应用程序没有聚焦,也可以在后台运行和录制. 所以,是时候创建一个服务了. 我创建了一个服务,设置了locationListener,获得了位置管理器和requestLocationUpdates ……所有这些都是对世界的好…基本的骨架工作. 现在,我不希望GPS不断运行,因为这会杀死电池,我想要发生的是服务,启动GPS,要求更新, 我正在尝试编写一项服务,每隔X分钟就会尝试获取设备的GPS位置,即使应用程序没有聚焦,也可以在后台运行和录制.

所以,是时候创建一个服务了.

我创建了一个服务,设置了locationListener,获得了位置管理器和requestLocationUpdates ……所有这些都是对世界的好…基本的骨架工作.

现在,我不希望GPS不断运行,因为这会杀死电池,我想要发生的是服务,启动GPS,要求更新,然后关闭(至少它对gps位置的兴趣) )然后5或10分钟后再做一次..

很简单,在我的侦听器的onLocationChanged()方法中,我添加了行LocationManager(removeUpdates(locationListener))..所以当我的服务要求更新时,它只获得一个,然后关闭.

我决定添加一个while循环,有效地注册我的位置监听器,并睡眠X分钟.从逻辑上讲,它应该注册它需要信息,然后睡觉……更新进来,我在onLocationChange中得到更新,并在事件中取消注册它的intereste,关闭GPS直到下一次执行循环.

现在,我有2个问题1)这在逻辑上看起来没问题吗?还是有更优雅的方式?请记住,我希望这能记录启动应用程序是否成为焦点的信息,老实说,即使启动应用程序被杀,也希望服务能够继续运行,但这是我尚未完全做出的设计决策.

第二个问题是,我需要把这个LOOP放在一个线程中,因为它在oncreate中,导致服务最终被杀死,因为它花了太长时间从oncreate回来,所以最好的方法是什么这样做? AsyncTask是一个选项,但这是一个理论上永远不会完成的任务.Handler也似乎有点傻,因为没有真正的回调,它只是注册GPS更新,而不感兴趣的代码在LocationListener中onLocationChange().

一旦实例化,就不会有来自这个线程的真实通信,尽管当某个用户交互关闭服务时需要通知它死/结束…

那么我应该只使用一个基本线程?使用AsyncTask即使它永远不会真的回来?或者使用Handler是更好的选择?或者我的模型是完全坏的形式出门?

解决方法 我认为拥有管理GPS的服务是明智之举,特别是如果您有多个可能需要位置信息的活动.我在我的应用程序中采用了这种方法.

首先,我在服务中使用了Ibinder,并从活动中绑定了它

bindService (new Intent(....),mServconn,Context.BIND_auto_CREATE);

在onStart()

和unbindService(mServconn);在每个活动的onStop()中

我有服务使用sendbroadcast()到在活动中注册的broadcastReceivers.位置数据通过广播意图中的附加内容传递.

我在服务中使用状态机,有3种状态,IDLE,SEEKING和GOT_A_FIX_Now_SLEEPing.休眠时间通过在服务的公共方法中公开的“changeGPSParameters”方法传递.另一个参数是所需的准确度,即在您获得比所需精度更好的修复之前不要广播消息,然后您就可以睡觉.睡眠意味着关闭GPS直到时间结束.

时间由Runnable管理,Handler将消息发送给它,代码如下

mHandler.postDelayed(this,mSleepTime );

我发现这很有效.当没有活动绑定到服务时,onUnbind()将在服务中运行.在该方法中,您只需确保停止位置侦听器并使用mHandler.removeCallbacks停止计时器

UPDATE

下面是一个Runnable的简单示例,您可以通过main.xml中的两个按钮来启动/停止,这两个按钮应该有一个textvIEw来显示计时器状态:

import androID.app.Activity;import androID.os.Bundle;import androID.os.Handler;import androID.vIEw.VIEw;import androID.Widget.TextVIEw;public class TimerLoopActivity extends Activity {    private Handler mHandler = new Handler();    private int mSleepTime  = 2; //seconds    private int mLoopCount = 0;    private Runnable mUpdateTiMetask = new Runnable() {        public voID run() {            // Code here for when timer completes            mLoopCount++;            setTextBoxMsg("Running - count = " + mLoopCount);            mHandler.removeCallbacks(this);            mHandler.postDelayed(this,mSleepTime * 1000); // keep looPing        }    };    @OverrIDe    public voID onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentVIEw(R.layout.main);        setTextBoxMsg("Timer IDle");    }    private voID setTextBoxMsg(String string) {        TextVIEw tv = (TextVIEw) findVIEwByID(R.ID.textVIEw1);        tv.setText(string);    }    public voID myClickHandler(VIEw target) {        switch (target.getID()) {            case R.ID.startbutton:                setTextBoxMsg("Starting timer");                startTimer();                break;            case R.ID.stopbutton:                setTextBoxMsg("StopPing timer");                mLoopCount = 0;                stopTimer();                break;        }    }    private voID stopTimer() { mHandler.removeCallbacks(mUpdateTiMetask); }    private voID startTimer() { mHandler.postDelayed(mUpdateTiMetask,mSleepTime * 1000);}}

您可以根据自己的需要进行调整.

总结

以上是内存溢出为你收集整理的Android常规GPS轮询服务,最大限度延长电池寿命全部内容,希望文章能够帮你解决Android常规GPS轮询服务,最大限度延长电池寿命所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/web/1127053.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-30
下一篇 2022-05-30

发表评论

登录后才能评论

评论列表(0条)

保存