不断更新活动的Android服务

时间:2015-05-20 09:08:34

标签: android service android-service

我已经构建了一个运行应用程序。它运行Activity,用户界面显示一个计时器,一个gps监听器,收集坐标和许多其他东西(活动做了很多工作)。

现在我的客户的请求是将所有活动逻辑移到Service。通过这种方式,当您启动正在运行的会话时,服务将启动并且将显示通知(非常简单,仅使用静态文本)。活动应该跟踪服务中的工作(计时器应该继续,速度应该显示,ecc ...)。点击通知应该调出活动。如果活动关闭或崩溃,服务应继续进行,当您点击通知时,应该启动新的活动,而用户不会注意到任何差异(计时器应该保持正确的时间,平均速度应该理解速度在活动崩溃之前相关,ecc ......)。

我知道有很多方法可以做到这一点。 我要问的是:最好的方法是什么?从哪里开始有这种行为的例子吗?我应该避免哪些常见错误?是否有最佳实践可以遵循?

谢谢

2 个答案:

答案 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
        }
    };