我是 Android 编程的新手,所以我在选择最佳应用设计方式方面面临一些普遍问题。
我想做的基本上是一个媒体播放器。我希望媒体播放器在服务上运行,因为我希望它在未显示 Activity 时也能播放。
我的问题是,如何根据服务工作流程更新我的 Activity 的 UI(例如,歌曲发生变化并且我希望显示其名称)?
我想我可以使用 Local Broadcast Manager 来将我的服务的 Intent 发送到我的 Activity 并调用 UI 更新(这看起来对吗?)
但是......我希望我的服务在播放音乐时做一些事情(比如查询/更新数据库)。 出于这个原因,我正在考虑在不同的进程(或线程?)上运行该服务。
所以..我想,在不同的进程上运行服务,我将无法使用本地广播管理器(对吗?)。
我希望我解释了我的疑虑...任何人都可以提供帮助吗?
非常感谢!
最佳答案
在您的服务中使用异步任务来处理您需要在后台完成的工作。当您需要更新 UI 时,使用异步任务的 progressUpdate 方法将广播发送回任何感兴趣的 Activity 。
伪例子。
Activity
onCreate -> startService 并创建新的 broadcastReceiver。确保覆盖 onReceive 方法并测试特定 Intent 。
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 指示任务结束
关于android - Android 服务如何更新启动它的 Activity 的 UI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11080141/