意圖是安卓的一個非常強大的功能,其中有沒有在Java中的任何直接模擬。你想要使用的是一種稱爲隱式意圖的機制。通常,當您從另一個活動啓動一項活動時,您將創建一個意圖並指定要啓動的活動。使用隱含的意圖,您可以提供一個操作(Intent.ACTION_VIEW
)和數據(指向音樂文件的URI)。使用隱式的Intent,您可以事先不知道哪個Activity會處理哪一個數據。
當您將您的意圖傳遞給startActivity()
時,操作系統將嘗試以儘可能最好的方式解析數據,通常會彈出一個可能處理數據的應用程序列表。用戶選擇適當的應用程序,該應用程序處理意圖,播放您的音樂文件。任何註冊爲可以處理數據的服務的應用程序都將顯示在列表中。通過意向後,您的活動將進入後臺,處理意圖的應用程序將進入前臺。
一旦用戶選擇一個應用程序來處理來自您的活動意圖,該應用程序將始終使用您的活動來處理那樣的意圖,直到您刪除了自己的應用程序的數據。
看看在official doc來讓自己開始,然後提出新問題時,你有你試圖解決一個更具體的問題。
這裏是一個演示了一個非常簡單的隱含意圖例如,通過一個URL是不知道該瀏覽器將打開它打開了一個代碼示例:
package com.marsatomic.intentimplicitdemo;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
public class MainActivity extends Activity
{
public final static Uri URI = Uri.parse("http://www.marsatomic.com");
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button buttonConnect = (Button)findViewById(R.id.button_connect);
buttonConnect.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
Intent i = new Intent(Intent.ACTION_VIEW, URI);
startActivity(i);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
感謝您的回答MarsAtomic。是否有可能提前決定目標應用程序而不詢問用戶每次我的應用程序需要播放文件時選擇哪個應用程序?另外,我認爲我有一個相當具體的問題。我希望我的應用程序能夠控制音樂播放器並將內容提供給它。當我的應用程序開始運行時,它應該加載某些音樂文件並將它們排入音樂播放器並啓動音樂播放器。另外,我知道這可以通過讓我的應用成爲一個獨立的音樂播放器來完成。我正在尋找可以避免編寫音樂播放器的替代解決方案。 –
在我的回答中添加了第三段,以便爲您澄清事情。使用隱含的意圖,你絕對可以避免寫一個音樂播放器。如果您的問題得到解答,請將答案標記爲「已接受」,以便未來的讀者獲益,並在新問題中創建更多具體的後續查詢。 – MarsAtomic
該解決方案可以使用音樂播放器打開URI。我也在尋找一種方法來從我的應用程序中控制音樂播放器(播放/暫停/停止等) –