【问题标题】:activity and/or service活动和/或服务
【发布时间】:2012-03-20 06:23:51
【问题描述】:

我的应用程序中有一个活动和一个服务组件。

目的是让服务负责准备需要表面支架的SurfaceView 和媒体播放器实例。我的媒体是一个视频文件。

是否可以从我的服务中创建表面视图?

我可以拨打以下电话吗

surface = (MySurfaceView) findViewById(R.id.surface);

在我的服务组件中?

如果我这样做了,我可以将surface.getHolder 分配给播放器实例的setDisplay()

总体目标是从 Activity 发出命令(播放、停止、搜索等)并让服务实现对媒体播放器状态的控制。

我可能可以将所有东西都放在我的活动中,但是当我旋转设备时,我不想拆下表面并在onConfigurationChanged() 中重新创建它。因此,在这里考虑使用该服务来解决我的情况。

高度赞赏任何想法或解决方案。

谢谢。

【问题讨论】:

    标签: android


    【解决方案1】:

    您可以使用AsyncTask 实现而不是服务,然后

    • 所有后台工作都在它的 doInBackground 方法(不同 线程,不会打扰用户 界面),而
    • 可以完成所有与 UI 相关的工作 在onPostExecute 方法中(用户界面 线程)。

    更新
    由于您需要在后台线程中播放您的媒体(没有可能被 gui 进程中断),Service 可能是您的选择。不过,您还需要Activity 来启动、停止和控制您的服务。
    关于如何实现这个设计,你可以查看这个MusicDroid Tutorial part 2

    虽然这不是强制性的,但在这项任务中使用服务,@CommonsWare 的解决方案非常优雅和方便。
    @CommonsWare's streaming video test application,而这个Audio/Video player sample 不要使用服务。

    【讨论】:

    • 我不明白 AsyncTask 可以如何帮助我。在应用程序的整个生命周期中,媒体播放器都应该在后台运行。
    • MediaPlayer 将仅播放音频,如果 Surface 不可用。我不确定您是否可以即时附加/分离/重新附加表面,但在没有表面的情况下播放应该可以正常工作。这意味着您可以将播放器置于服务中,而表面将由活动管理。
    • 我添加了一些有用的帖子链接 - 带有示例 - 引导您完成此任务的不同实现。
    • 嗨 inazaruk,这正是我的问题 - 服务中的玩家需要一个表面,但表面由活动管理。如何将两者联系起来?我可以在调用 startService() 时将表面视图对象传递给服务组件(通过 Intent 的 putExtra)吗?如果是的话,你能指出我如何在意图中发送一个对象吗?我只用它来发送字符串和整数以及其他一些原始类型。
    • 嗨 rekaszeru,我正在查看您的链接。让我看看有没有什么能满足我的需要。感谢您花时间在此处发布链接。
    【解决方案2】:

    如果您想从Activity 开始和停止Service,请尝试使用in this example application 描述的方法。它对我有用。

    演示甚至可以是downloaded。你需要this music file

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-27
      • 1970-01-01
      • 1970-01-01
      • 2020-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多