Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android服务如何更新启动它的活动的UI?_Android_Android Intent_Android Activity_Android Service - Fatal编程技术网

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

Android服务如何更新启动它的活动的UI?,android,android-intent,android-activity,android-service,Android,Android Intent,Android Activity,Android Service,我是Android编程新手,所以在选择最佳应用程序设计方式方面,我面临一些普遍问题 我想做的基本上是一个媒体播放器。我希望媒体播放器在服务上运行,因为我希望它在活动未显示时也能播放 我的问题是,如何根据服务工作流程更新活动的UI(例如,歌曲更改,我希望显示其名称) 我想我可以使用本地广播管理器将意图从我的服务发送到我的活动,并调用UI更新(这似乎正确吗?) 但是。。。我希望我的服务在播放音乐时做一些事情(比如查询/更新数据库)。 出于这个原因,我考虑在不同的进程(或线程?)上运行服务 所以。。我

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

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

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

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

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

所以。。我想,在另一个进程上运行服务时,我将无法使用本地广播管理器(是这样吗?)

我希望我能解释我的疑问是什么。。。有人能帮忙吗


非常感谢

在您的服务中使用异步任务来处理您需要在后台完成的工作。当需要更新UI时,请使用async task的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
            } 
        }
    };
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表示任务结束

非常感谢。但是广播信息呢?它们不适合在本地使用吗?@super我编辑了我的答案,加入了一个本地广播使用的例子。如果您的目标是旧api verison,请确保库中包含android-support-v4.jar。“AsyncTasks最好用于短操作(最多几秒钟)。[…]”-