[英]Is it better to register for Location updates in Service or in Activity for Android?
[英]Android Service that constantly updates Activity
我已经建立了一个可以运行的应用程序。 它运行一个带有在用户界面中显示的计时器的Activity
,一个用于收集坐标的gps侦听器以及许多其他内容(该活动完成了大量工作)。
现在,我的客户的要求是将所有活动逻辑移至Service
。 这样,当您启动一个正在运行的会话时,服务将启动,并且将显示通知(非常简单,仅带有静态文本)。 活动应跟踪服务中所做的工作(计时器应继续执行,应显示速度,等等)。 轻按通知将调出活动。 如果活动已关闭或崩溃,则服务应继续运行,当您点击通知时,应调出新的活动,而用户不会注意到任何差异(计时器应始终显示正确的时间,平均速度应理解速度在活动崩溃之前关联,等等)。
我知道有很多方法可以做到这一点。 我要问的是:最好的方法是什么? 有从哪里开始这种行为的例子吗? 我应该避免哪些常见错误? 是否有遵循的最佳做法?
谢谢
我开发了具有类似服务行为的应用程序。 它还需要一个收集数据的服务以及一些用于显示数据的活动。
对于这些类型的应用程序,您想保持该服务有效,直到用户手动停止它为止,但是如果设备内存不足,Android仍然有可能杀死该服务。
对于服务-活动交互,您需要绑定到服务。 此处提供了很好的文档: http : //developer.android.com/guide/components/bound-services.html
确保在服务的onStartCommand
函数中返回START_STICKY
。 当系统恢复服务时,这将确保意图为空,并告诉android您明确启动和停止服务。
从活动绑定到服务时,您需要检查服务是否准备就绪(系统未还原)。 这可以通过在服务内部添加一个“就绪”字段来完成,该字段默认情况下为false,如果onStartCommand
intent
不为null,则设置为true。 因此,您可以对还原的服务做出正确反应,并从头开始启动应用程序。
为了使服务保持较高的优先级,您需要在服务内部调用startForeground
。 这也需要显示一个通知,以便用户知道服务正在后台运行。
在内部服务中,您可以使用本地广播管理器。
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
broadcaster = LocalBroadcastManager.getInstance(this);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
handler.removeCallbacks(sendUpdatesToUI);
handler.postDelayed(sendUpdatesToUI, 1000);
return START_STICKY;
}
private Runnable sendUpdatesToUI = new Runnable() {
public void run() {
DisplayLoggingInfo(); //do watever you want to push
handler.postDelayed(this, 1000); // 10 seconds
}
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.