2012-06-18 51 views
14

我是新来的Android编程,所以我面临着一些选择设计我的应用程序的最佳方式的一般问题。Android服务如何更新启动它的活动的UI?

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

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

我想我可以为了从我的服务意向发送到我的活动,并调用UI更新使用本地广播管理器(它似乎对不对?)

但是...我希望我的服务做的有些东西在播放音乐时(如查询/更新数据库)。 因为这个原因,我想在不同的进程(或线程?)上运行服务。

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

我希望我解释了我的疑惑......任何人都可以提供帮助吗?

非常感谢!

回答

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表明任务结束

+0

非常感谢。但是广播消息呢?他们不是不方便在当地使用吗? – super

+0

@super我编辑了我的答案,包括如何使用本地广播的例子。如果您的目标是旧版api版本,请确保在您的库中包含android-support-v4.jar。 – Mike

+0

非常感谢。我会让你知道它是如何去的;) – super