14

我是 Android 编程的新手,所以在选择设计我的应用程序的最佳方式时我面临一些一般性问题。

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

我的问题是,如何根据服务工作流程更新我的活动的 UI(例如,歌曲更改并且我希望显示其名称)?

我想我可以使用本地广播管理器将意图从我的服务发送到我的活动并调用 UI 更新(看起来对吗?)

但是...我希望我的服务在播放音乐时做一些事情(比如查询/更新数据库)。出于这个原因,我正在考虑在不同的进程(或线程?)上运行服务。

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

我希望我能解释我的疑虑......有人可以帮忙吗?

多谢!

4

1 回答 1

15

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

伪例子。

活动

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 -> sendBroadcast 指示更新状态

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

onPostExecute -> sendBroadcast 指示任务结束

于 2012-06-18T12:44:16.490 回答