繁体   English   中英

不断更新活动的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM