我已经构建了一个运行应用程序。它运行Activity
,用户界面显示一个计时器,一个gps监听器,收集坐标和许多其他东西(活动做了很多工作)。
现在我的客户的请求是将所有活动逻辑移到Service
。通过这种方式,当您启动正在运行的会话时,服务将启动并且将显示通知(非常简单,仅使用静态文本)。活动应该跟踪服务中的工作(计时器应该继续,速度应该显示,ecc ...)。点击通知应该调出活动。如果活动关闭或崩溃,服务应继续进行,当您点击通知时,应该启动新的活动,而用户不会注意到任何差异(计时器应该保持正确的时间,平均速度应该理解速度在活动崩溃之前相关,ecc ......)。
我知道有很多方法可以做到这一点。 我要问的是:最好的方法是什么?从哪里开始有这种行为的例子吗?我应该避免哪些常见错误?是否有最佳实践可以遵循?
谢谢
答案 0 :(得分:1)
我开发了一个具有类似服务行为的应用。它还需要一个收集数据的服务和一些显示数据的活动。
对于这些类型的应用程序,您希望保持服务处于活动状态,直到用户手动停止它为止,但如果设备内存不足,它仍然可以杀死该服务。
对于服务 - 活动交互,您需要绑定到服务。这里有一个很好的文档:http://developer.android.com/guide/components/bound-services.html
请务必在服务的START_STICKY
功能中返回onStartCommand
。这将确保在系统恢复服务时intent将为null,并告诉android您明确启动和停止服务。
从活动绑定到服务时,您需要检查服务是否准备就绪(系统未恢复)。这可以通过在服务中添加“就绪”字段来完成,默认情况下为false,如果onStartCommand
intent
不为空,则设置为true。因此,您可以对已恢复的服务做出正确的反应,并从头开始启动应用程序。
要使服务保持高优先级,您需要在服务中调用startForeground
。这还需要显示通知,以便用户知道服务正在后台运行。
答案 1 :(得分:1)
在内部服务中,您可以使用本地广播管理员。
@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
}
};