Android服务如何更新启动它的活动的UI?

sup*_*per 14 android android-intent android-service android-activity

我是Android编程的新手,因此我在选择设计应用程序的最佳方式时遇到了一些常见问题.

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

我的问题是,如何根据服务工作流程更新我的活动用户界面(例如,歌曲更改,我想要显示其名称)?

我想我可以使用本地广播管理器将我的服务中的意图发送到我的活动并调用UI更新(它看起来是否正确?)

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

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

我希望我解释了我的疑虑......任何人都可以帮忙吗?

非常感谢!

Mik*_*ike 15

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

伪示例.

活动

onCreate - > startService并创建新的broadcastReceiver.确保覆盖onReceive方法并测试特定的意图.

    mLocalBroadcastManager = LocalBroadcastManager.getInstance(this);

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

onResume - >注册为广播接收器

    IntentFilter filter = new IntentFilter();
    filter.addAction(yourActionType);
    mLocalBroadcastManager.registerReceiver(broadcastReceiver, filter);
Run Code Online (Sandbox Code Playgroud)

服务

onCreate - >创建广播管理器.

   mLocalBroadcastManager = LocalBroadcastManager.getInstance(this);
Run Code Online (Sandbox Code Playgroud)

onStartCommand - >如有必要,创建并执行新的异步任务.(onStart可以被多次调用)

异步任务

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

onProgressUpdate - > sendBroadcast指示更新状态

    Intent broadcastIntent = new Intent(yourActionType);
    broadcastIntent.putExtra(whateverExtraData you need to pass back);
    mLocalBroadcastManager.sendBroadcast(broadcastIntent);
Run Code Online (Sandbox Code Playgroud)

onPostExecute - > sendBroadcast表示任务已结束

  • "理想情况下,AsyncTasks应该用于短时间操作(最多只需几秒钟.)[...]" - http://developer.android.com/reference/android/os/AsyncTask.html (4认同)