一個程式往往由多個界面組成,這些界面之間的跳轉,其實就是Activity之間的跳轉。 Intent被稱為意圖,常用於組件之間的交互,可用於啟動其它組件,並可以在組件之間傳遞數據。 有2種方式實現Activity之間的跳轉: 1、顯式意圖 2、隱式意圖 ...
一個程式往往由多個界面組成,界面之間的跳轉,實質是Activity之間的跳轉。
從當前程式跳轉到其它程式,實質是啟動了目標程式的入口Activity。
Intent被稱為意圖,常用於組件之間的交互,可用於啟動其它組件、程式,並可以在組件之間傳遞數據。
1、顯式意圖 直接指定要啟動的目標組件
方式一:
1 //參數:package的上下文對象,通常用this表示當前package的。目標Activity的class對象,不用寫全類名 2 Intent intent=new Intent(this,Main2Activity.class); 3 startActivity(intent);
方式二:
1 Intent intent=new Intent(); 2 3 //參數:package的上下文對象,目標Activity的class對象 4 intent.setClass(this,Main2Activity.class); 5 6 //或者用另一個重載函數。package的上下文對象,全類名(String類型)。必須是全類名 7 //intent.setClassName(this,"com.example.test.Main2Activity"); 8 9 startActivity(intent);
以上兩種方式均只能啟動本程式中組件,不能啟動其它程式的組件。(this限定了)
方式三:
1 Intent intent=new Intent(); 2 //包名,全類名。均為String型。只要是String型的類名,都要寫成全類名。
3 intent.setClassName("com.example.test","com.example.test.Main2Activity"); 4 startActivity(intent);
方式四:
1 Intent intent = new Intent(); 2 //創建一個組件對象。包名,全類名,均為String類型。 3 ComponentName comp = new ComponentName("com.example.test","com.example.test.Main2Activity"); 4 //設置Intent的目標組件 5 intent.setComponent(comp); 6 startActivity(intent);
以上2種方式既可以啟動本程式的其他組件,也可以啟動第三方程式(的組件):將包名、全類名設置為其它程式的即可。
如果要啟動第三方程式,全類名要是入口Activity的全類名。
只要參數是String類型的類名,就必須寫成全類名。
2、隱式意圖 並不直接指定要開啟的目標組件,而是指定目標組件的action,系統根據action的映射關係啟動某個組件/程式。
方式一:
1 Intent intent=new Intent(); 2 //指定目標組件的action的name,String類型。我這裡寫的是形參聲明,實際使用時要替換為具體的字元串 3 intent.setAction(String action); 4 startActivity(intent);
方式二:
1 //參數:目標Activity的action的name值,String類型 2 Intent intent = new Intent(String action); 3 startActivity(intent);
啟動action值為指定值的組件。
以上2種方式可以啟動本程式的其它Activity、也可以啟動手機上的其它程式。
啟動本程式中的其他Activity,需要自己在AndroidManifest.xml中給目標組件配置action
在AndroidManifest.xml中為目標組件配置<intent-filter>元素:
1 <activity android:name=".Main2Activity"> 2 <intent-filter> 3 <!--action元素標識此組件的分類,如果此組件是程式的入口Activity,則action元素可標識此程式的分類--> 4 <action android:name="test" /> 5 <!--category的值有2個:一般是DEFAULT,表示這是一個普通的組件;LAUNCHER,表示這是此程式的入口組件--> 6 <category android:name="android.intent.category.DEFAULT"/> 7 </intent-filter> 8 </activity>
在AndroidManifest.xml中設置的Activity的action是Android系統共用的,就是說此action可以被其它程式引用。
action值可以是任意的字元串,但習慣這樣寫: 包名.常量名 ,常量名自己取,全大寫,儘量見名知義。示例:cn.itcast.START_SECOND_ACTIVITY。
action值也可以使用預定義的值,這些預定義的值都是String類型的常量。
action更像是對組件/程式功能的分類,比如action是"瀏覽網頁",現在我們通過隱式意圖啟動action是"瀏覽網頁"的組件/程式:
如果手機上只有一個組件的action是"瀏覽網頁"(即只有一個瀏覽器),則直接打開該瀏覽器。
如果有多個瀏覽器,但設置了預設應用,則直接打開預設瀏覽器。
如果有多個瀏覽器,但未設置預設應用,則會彈出對話框,顯示action是"瀏覽網頁"的所有組件/應用(即顯示所有瀏覽器),讓用戶選一個。
我們可以給本程式的某個Activity指定唯一的action,這樣通過該action可直接啟動該組件。
預定義的action的組件往往是手機通用的功能(系統應用),比如讀取聯繫人、打電話、發簡訊、發郵件、播放多媒體文件、瀏覽器等。預定義的action值往往不能直接像上面的2種方式一樣:指定了action後就 startActivity(intent); 直接啟動,常常要設置一些參數、傳遞一些數據後才能 startActivity(intent); 比如播放媒體文件,要先設置/傳遞 文件類型(audio/mp3)、文件位置。
startActivity()可以開啟一個組件,也可以開啟一堆組件:
startActivity(Intent intent);
startActivity(Intent[] intents);
下一篇隨筆寫如何獲取第三方軟體的包名、入口類名,下下篇隨筆寫如何使用預定義的action值。