所以,是时候创建一个服务了.
我创建了一个服务,设置了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轮询服务,最大限度延长电池寿命所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)