当活动关闭/重新启动时,继续从服务更新Android UI

时间:2013-05-27 21:57:17

标签: android user-interface service handler

试图解决这个问题一段时间。我有一个应用程序在单独的service中运行倒计时,调用startsForeground,显示通知。我从按钮开始倒计时服务:

            Intent i = new Intent(getApplicationContext(),  PomoService.class);
            i.putExtra("EXTRA_MESSENGER", new Messenger(handler));
            startService(i);

我用handler更新了用户界面,它收到了捆绑数据,告诉倒计时剩余多少毫秒,通过onTick()方法中的消息发送:

Messenger messenger = (Messenger)extras.get("EXTRA_MESSENGER");
        Message msg = new Message();
        Bundle b = new Bundle();
        b.putLong("remainingTime", millisUntilFinished);
        msg.setData(b);
        try {
            messenger.send(msg);
        } catch (RemoteException e) {
            Log.i("error", "error");
        }

在活动中:

    private Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        long sentTime = msg.getData().getLong("remainingTime");
        textCountdownMin.setText(String.format("%02d", (sentTime/1000)/60));
        textCountdownSec.setText(":" + String.format("%02d", (sentTime/1000)%60));
    }
};

整个设置工作正常,唯一的问题是,如果用户点击后退按钮或从最近的应用列表中滑出应用,然后从抽屉或正在进行的通知重新打开它,则文本不会更新更多。倒计时仍然在进行中,因为我可以从仍然显示的通知和我使用AlarmManager唤醒屏幕的事实中看到它,并且这已经正确启动。

我应该采取什么措施的任何线索?

2 个答案:

答案 0 :(得分:1)

我解决了使用此问题中概述的LocalBroadcastManager:Android update activity UI from service

答案 1 :(得分:0)

最简单的方法是使用动态广播接收器。在您的活动中创建动态BR,您需要更新UI以及设置意图过滤器和唯一操作。然后当你的服务运行时,在服务内部创建一个新的意图,设置一个设置为意图过滤的动作,然后发送广播。