Android服务如何更新启动它的活动的用户界面?

14

我是Android编程的新手,所以我在选择最佳设计应用程序的方法方面遇到了一些问题。

我想要做的基本上是一个媒体播放器。我希望媒体播放器在服务上运行,因为我希望在活动未显示时它也能播放。

我的问题是,如何根据服务工作流更新我的活动界面(例如,歌曲更改后,我希望其名称显示出来)?

我想我可以使用本地广播管理器来从我的服务发送意图到我的活动,并调用UI更新(这样做好像正确吗?)

但是,当播放音乐时,我将希望我的服务执行一些操作(例如查询/更新数据库)。出于这个原因,我考虑在不同的进程(或线程?)上运行服务。

所以...我猜想,如果在不同的进程上运行服务,我将无法使用本地广播管理器(这是对的吗?)

我希望我解释清楚了我的疑惑...有人可以帮忙吗?

非常感谢!

1个回答

15

在你的服务中使用异步任务来处理后台工作。当需要更新UI时,使用异步任务的progressUpdate方法向任何感兴趣的活动发送广播。

伪代码示例。

Activity

onCreate -> startService并创建新的广播接收器。确保重写onReceive方法并测试特定的意图。

    mLocalBroadcastManager = LocalBroadcastManager.getInstance(this);

    broadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if(intent.getAction().equals(yourActionType)) {
                //do work here
            } 
        }
    };

在onResume()中注册广播接收器

    IntentFilter filter = new IntentFilter();
    filter.addAction(yourActionType);
    mLocalBroadcastManager.registerReceiver(broadcastReceiver, filter);

服务

onCreate -> 创建广播管理器。

   mLocalBroadcastManager = LocalBroadcastManager.getInstance(this);

如果需要,onStartCommand会创建并执行一个新的异步任务。(onStart可能会被调用多次)

异步任务

doInBackground -> 启动所需的任何后台任务。在这种情况下是播放音乐。 定期调用publishProgress。

onProgressUpdate -> 发送广播指示更新状态。

    Intent broadcastIntent = new Intent(yourActionType);
    broadcastIntent.putExtra(whateverExtraData you need to pass back);
    mLocalBroadcastManager.sendBroadcast(broadcastIntent);

在onPostExecute方法中发送广播,表示任务已经结束。


非常感谢。但广播消息怎么办?在本地使用它们不方便吗? - super
@super 我编辑了我的答案,包括如何使用本地广播的示例。如果你的目标是旧的API版本,请确保在你的库中包含android-support-v4.jar。 - Mike
4
异步任务(AsyncTasks)应该理想地用于短时间操作(最多几���钟)。[...] - http://developer.android.com/reference/android/os/AsyncTask.html - Paolo Rovelli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接