Android Intent實現界面跳轉、程序跳轉


 

一個程序往往由多個界面組成,界面之間的跳轉,實質是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值。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM