2011-04-27 78 views
1

我在我的應用程序中有一個活動和一個服務組件。活動和/或服務

意圖是讓服務負責準備SurfaceView和需要表面支架的mediaplayer實例。我的媒體是一個視頻文件。

是否可以從我的服務中創建表面視圖?

我可以調用以下

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

在我的服務組件

如果我這樣做了,我可以將surface.getHolder分配給玩家實例的setDisplay()

總體目標是從活動中發佈命令(播放,停止,尋找等),並讓服務實現對mediaplayer狀態的控制。

我可能會把所有的東西放在我的活動中,但是當我旋轉設備時,我不想拆下表面並在中重新創建它。因此,看看在這裏使用我的情況服務。

任何想法或解決方案高度讚賞。

謝謝。

回答

1

你可以使用一個AsyncTask實現,而不是服務,並做

  • 所有的後臺工作,其 doInBackground方法(不同 線程,不會打擾用戶 接口),而
  • onPostExecute方法(UI 線程)中可以完成所有UI相關工作 。

更新
既然你需要你的媒體在後臺線程播放(不通過GUI進程可能中斷)時,Service可能是你的選擇。您還需要Activity才能啓動,停止並控制您的服務。
要了解如何實施此設計,您可以查看此MusicDroid Tutorial part 2

雖然這不是強制性的,爲此任務使用服務@ @ CommonsWare的解決方案非常優雅和方便。
@CommonsWare's streaming video test application,而這Audio/Video player sample不使用服務。

+0

我看不出AsyncTask如何幫助我。媒體播放器應該在應用程序的整個生命週期中在後臺運行。 – 2011-04-27 21:16:31

+0

如果surface不可用,MediaPlayer將僅播放音頻。我不確定您是否可以隨時附加/拆卸/重新連接表面,但回放應該沒有表面的情況下正常工作。這意味着你可以將你的播放器放在服務中,而曲面將由活動管理。 – inazaruk 2011-04-27 21:37:27

+0

我已經添加了一些有用的鏈接到文章 - 帶有樣本,這將引導您完成此任務的不同實現。 – rekaszeru 2011-04-27 21:45:02