Intent用於封裝程序的“調用意圖”。兩個Activity之間,可以把需要交換的數據,封裝成Bundle對象,然後使用Intent對象,攜帶數據到另一個Activity中。實現兩個Activity的數據交換。
Intent還是各種應用程序組件之間通信的重要媒介。啓動Activity、Service、BroadcastReceiver,都需要使用Intent。
Intent還有一個好處,如果應用程序只是想啓動具有某種特徵的組件,並不想和某個具體的組件耦合,則可以通過在int ent - filt er 中配置相應的屬性進行處理,與s t uc t s 2 中的MVC框架思路類似
Intent對象大致包括7大屬性:1、Component Name,2、Action,3、Catory,4、data,5、Type,6、Extra,7、Flag。
·Action作爲標識符,代表一個Intent ,當一個Activity 需要外部協助處理時,就會發出一個Intent,如果一個程序能完成相應功能,只要在int ent - filt er 加上這個這個intent 就可以了。
·Data保存需要傳遞的數據格式,比如:tel://
·Extras保存需要傳遞的額外數據。
·Category 表示Intent的種類,從android上啓動Activity 有多種方式,比如 程序列表、桌面圖標、點擊Home激活的桌面等等,Category則用來標識這些Activity的圖標會出現在哪些啓動的上下文環境裏。
(一) ComponentName:明確指定Intent將要啓動哪個組件,因此這種Intent被稱爲顯示Intent,沒有指定ComponentName屬性的Intent被稱爲隱式Intent。隱式Intent沒有明確要啓動哪個組件,應用匯根據Intent指定的規則去啓動符合條件的組件。ComponentName不僅可以啓動本程序中的activity,還可以啓動其它程序的activity。
啓動方式:
Intent intent =new Intent();
ComponentNamecomponent= new ComponentName(this, TwoActivity.class);
intent.setComponent(component);
等價於:
Intent intent =new Intent(this, TwoActivity.class);
startActivity(intent);
等價於:
Intent intent =new Intent();
intent.setClass(this,TwoActivity.class);
startActivity(intent);
等價於:
Intent intent =new Intent();
intent.setClassName(this,"com.zzh.day06_intent.TwoActivity");
startActivity(intent);
本程序中啓動其它程序:
(二) Action、Category 屬性與intent-filter配置:
通常,Action, Category屬性結合使用。定義這兩個屬性都是在主配置文件的<intent-filter>節點中。Intent通過定義Action屬性(其實就是定義一段自定義的字符串),這樣就可以把Intent與具體的某個Activity分離,實現瞭解耦。否則,每次跳轉都有寫成,
(三) data:
1、 用於添加數據。通常是啓動某個系統程序或其他程序,帶給此程序的信息。Data屬性通常用於向Action屬性提供操作的數據。Data屬性的值是個Uri對象。
Uri的格式如下:scheme://host:port /path
2、 系統內置的屬性常量
tel:是固定寫法,是系統內置的屬性常量。
系統內置的幾個Dat a屬性常量:
·tel: //:號碼數據格式,後跟電話號碼。
·mailto: //:郵件數據格式,後跟郵件收件人地址。
·smsto: //:短息數據格式,後跟短信接收號碼。
·content : //:內容數據格式,後跟需要讀取的內容。
·file://:文件數據格式,後跟文件路徑。
·market://search?q=pname:pkgname:市場數據格式,在Google Market裏搜索包名爲pkgname的應用。
·geo: //latitude, longitude:經緯數據格式,在地圖上顯示經緯度所指定的位置。
四、Intent利用Action屬性和Dat a屬性啓動Android系統內置組件的代碼
(一)、撥打電話: Intent intent=new Intent(); intent.setAction(Intent.ACTION_CALL); //intent.setAction("android.intent.action.CALL"); //以下各項皆如此,都有兩種寫法。 intent.setData(Uri.parse("tel:1320010001")); startActivity(intent); //調用撥號面板: Intent intent=new Intent(); intent.setAction(Intent.ACTION_DIAL); intent.setData(Uri.parse("tel:1320010001")); startActivity(intent); //調用撥號面板: Intent intent=new Intent(); intent.setAction(I ntent.ACTION_VIEW); intent.setData(Uri.parse("tel:1320010001")); startActivity(intent); (二)、利用Uri打開瀏覽器、打開地圖等: Uri uri = Uri.parse("https://www.baidu.com");//瀏覽器 Uriuri=Uri.parse("geo:39.899533,116.036476"); //打開地圖定位 Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.setData(uri); startActivity(intent); |
(五)Type屬性
1、Type屬性用於指定Data所指定的Uri對應的MIME類型。MIME只要符合“abc /xyz”這樣的字符串格式即可。
2、Intent利用Action、Data和Type屬性啓動Android系統內置組件的代碼:
播放視頻: Intent intent = new Intent(); Uri uri =Uri.parse("file:///sdcard/media.mp4"); intent.setAction(Intent.ACTION_VIEW); intent.setDataAndType(uri,"video/*"); startActivity(intent); |
(六)Extra屬性
1、通過intent.putExtra(鍵, 值)的形式在多個Activity之間進行數據交換。
2、系統內置的幾個Extra常量
EXTRA_BCC:存放郵件密送人地址的字符串數組。
EXTRA_CC:存放郵件抄送人地址的字符串數組。
EXTRA_EMAIL :存放郵件地址的字符串數組。
EXTRA_SUBJECT:存放郵件主題字符串。
EXTRA_TEXT:存放郵件內容。
EXTRA_KEY_EVENT:以KeyEvent對象方式存放觸發Intent 的按鍵。
EXTRA_PHONE_ NUMBER :存放調用ACTION_CALL 時的電話號碼。
3 、Intent 利用Action、Data和Type、Extra屬性啓動Android系統內置組件的代碼:
調用發送短信的程序 Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.setType("vnd.android-dir/mms-sms"); intent.putEx tra("sms_body","信息內容..."); startActivity(intent); //發送短信息 Uri uri =Uri.parse("smsto:13200100001"); Intent intent = new Intent(); intent.setAction(Intent.ACTION_SENDTO); intent.setData(uri); intent.putEx tra("sms_body","信息內容..."); startActivity( intent ); //發送彩信,設備會提示選擇合適的程序發送 Uri uri = Uri.parse("content://media/external/images/media/23"); //設備中的資源(圖像或其他資源) Intent intent = new Intent(); intent.setAction(Intent. ACTION_SEND ); intent.setType("image/png"); intent.putExtra("sms_body","內容"); intent.putExtra(Intent.EX TRA_STREAM,uri); startActivity(it); 發送Email: Intent intent=new Intent(); intent.setAction(I ntent.ACTION_SEND); String[]tos={"[email protected]"} String[]ccs={"[email protected]"}; intent.putExtra(Intent.EXTRA_EMAIL, tos); intent.putExtra(Intent.EXTRA_CC, ccs); intent.putExtra(Intent.EXTRA_TEX T,"The email body text"); intent.putExtra(Intent.EXTRA_SU BJ ECT,"The email subject text"); intent.setType("message/rfc822"); startActivity(Intent.createChooser(intent,"Choose Email Client")); Intent intent = newIntent(Intent.ACTION_SEND); String[] tos = {"[email protected]"}; intent.putExtra(I ntent.EXTRA_EMAIL, tos); intent.putExtra(I ntent.EXTRA_TEXT,getPhoneParameter()); intent.putExtra(Intent.EXTRA_SUBJECT,"Android日誌"); intent.putEx tra(Intent.EXTRA_STREAM, Uri.fromFile(cacheDir)); intent.setType("message/rfc882"); intent.setType("plain/text"); Intent.createChooser(intent, "請選擇郵件發送軟件"); startActivity(intent); intent.setAction(android.provider.Settings.ACTION_SETTINGS) |
4 、Intent利用Action屬性中的ACTION_GET_CONTENT獲取返回值
//選擇圖片requestCode返回的標識 Intent intent = new I ntent(); intent.setAction(I ntent.ACTION_GET_CONTENT ); intent.setType( "image/* " ); Intent wrapperIntent = Intent.createChooser(intent, null); startActivityForResult(wrapperIntent,requestCode); //添加音頻 Intent intent = new Intent(); intent.setAction(Intent.ACTION_GET_CONTENT); intent.setType( "video/* " ); Intent wrapperIntent = Intent.createChooser(intent, null); startActivityForResult(wrapperIntent,requestCode); //視頻 Intent intent = new Intent(); intent.setAction(Intent.ACTION_GET_CONTENT); intent.setType( "video/* "); Intent wrapperIntent = Intent.createChooser(intent, null); startActivityForResult(wrapperI ntent,requestCode); //錄音 Intent intent = new Intent(); intent.setAction(Intent.ACTION_GET_CONTENT ); intent.setType( "audio/amr" ); intent.setClassName("com.android.soundrecorder","com.android.soundrecorder.SoundRecorder"); startActivityForResult(intent, requestCode); |
(七)、Flags 屬性:Intent 可調用addFlags()方法來爲Intent 添加控制標記。【重要】
1 、FLAG_ ACTIVITY_CLEAR_TOP:(效果同Activity LaunchMode的singleTask)
如果在棧中已經有該Activity的實例,就重用該實例。重用時,會讓該實例回到棧頂,因此在它上面的實例將會被移除棧。如果棧中不存在該實例,將會創建新的實例放入棧中。
2 、FLAG_ACTIVITY_SINGLE_TOP:(效果同Activity L aunchMode的singleTop)
如果在任務的棧頂正好存在該Activity的實例, 就重用該實例,而不會創建新的Activity 對象。
3 、FLAG_ ACTIVITY_NEW_TASK:
【備註:】以下幾個爲了解。
4 、FLAG_ACTIVITY_MULTIPLE_TASK:
5 、FLAG_ACTIVITY_BROUGHT_TO_FRONT:
6 、FLAG_ACTIVITY_RESET_TASK_IF_NEEDED:
示例代碼:
Intent intent = new Intent(this,MainActivity.class); //將Activity棧中處於MainActivity主頁面之上的Activity都彈出。 intent.setFlags(Intent.FLAG_ACTI VI TY_CLEAR_TOP); startActivity(intent); |
例如:
如果依次啓動了四個Activity :A、B、C 、D。
在D Activity 裏,跳到B Activity,同時希望D和C 都finish掉,可以在startActivity (intent )裏的intent 裏添加flags標記,如下所示:
Intent intent = new Intent(this , B.class);
intent .setFlags (Intent .FLAG_ACTIVITY_CLEAR_TOP);
s t ar t Activity(intent );
這樣啓動B Activity的同時,就會把D、C 都finis hed掉。
如果B Activity的launchMode是默認的“st andar d”,則B Activity會首先finis hed掉舊的B頁面,再啓動一個新的Activity B。如果不想重新再創建一個新的B Activity,而是重用之前的B Activity,可以將B Activity的launchMode設置爲“singleTask”。【特別需要注意的是:在部分手機中,如三星手機。即便是singleTask也會產生新的頁面,而不是重用之前的頁面。】
四、利用Intent 屬性調用系統app的示例代碼:
1、佈局核心代碼:
<ScrollView android:id="@+id/ScrollView1" android:layout_width="match_parent" android:layout_height="wrap_content" > <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:id="@+id/Button_main_call " android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="clickButton" android:text=" 直接撥號" /> <Button android:id="@+id/Button_main_dial" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="clickButton" android:text=" 啓動撥號面板" /> <Button android:id="@+id/Button_main_dialer" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="clickButton" android:text="顯示撥號面板" /> <Button android:id="@+id/Button_main_sms" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="clickButton " android:text="發送短信" /> <Button android:id="@+id/Button_main_setting" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="clickButton " android:text="系統設置" /> <Button android:id="@+id/Button_main_datesetting" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="clickButton" android:text=" 日期設置" /> <Button android:id="@+id/Button_main_soundsetting" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="clickButton" android:text=" 聲音設置" /> <Button android:id="@+id/Button_main_wifisetting" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="clickButton" android:text=" W I F I 設置" /> <Button android:id="@+id/Button_main_web" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="clickButton" android:text=" 瀏覽網頁" /> <Button android:id="@+id/Button_main_contacts" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="clickButton" android:text=" 查看聯繫人" /> <Button android:id="@+id/Button_main_showimage" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="clickButton" android:text=" 查看圖片" /> <Button android:id="@+id/Button_main_showtext" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="clickButton" android:text=" 查看文本" /> <Button android:id="@+id/Button_main_playvideo" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="clickButton" android:text=" 播放視頻" /> <Button android:id="@+id/Button_main_playaudio" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="clickButton" android:text=" 播放音頻" /> <Button android:id="@+id/Button_main_home" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="clickButton" android:text=" H O M E " /> </LinearLayout> </ScrollView> |
2 、java核心代碼:
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.a); } public void clickButton(View view) { Intent intent = new Intent(); // android.content.intent.ACTION_VIEW intent.setAction(android.content.Intent.ACTION_VIEW); switch (view.getId()) { case R.id.Button_main_call: intent.setAction(android.content.Intent.ACTION_CALL); intent.setData(Uri.parse("tel:10086")); break; case R.id.Button_main_dial: intent.setAction(android.content.Intent.ACTION_DIAL); intent.setData(Uri.parse("tel:10086")); break; case R.id.Button_main_dialer: intent.setAction("com.android.phone.action.TOUCH_DIALER"); break; case R.id.Button_main_sms: intent.setAction(android.content.Intent.ACTION_SENDTO); intent.setData(Uri.parse("smsto:10086")); intent.putExtra("sms_body", "該吃飯了,下課吧!"); break; case R.id.Button_main_setting: intent.setAction("android.settings.settings"); break; case R.id.Button_main_datesetting: intent.setAction("android.settings.DATE_settingS"); break; case R.id.Button_main_soundsetting: intent.setAction("android.settings.SOUND_settingS"); break; case R.id.Button_main_wifisetting: intent.setAction("android.settings.WIFI_settings"); break; case R.id.Button_main_contacts: intent.setAction("com.android.contacts.action.LIST_contacts"); break; case R.id.Button_main_web: intent.setAction(android.content.Intent.ACTION_VIEW); intent.setData(Uri .parse("http://www.baidu.com")); break; case R.id.Button_main_showimage: intent.setAction(android.content.Intent.ACTION_VIEW); intent.setDataAndType( Uri.fromFile(new File( "mnt/sdcard/Download/landscape.jpg")), "image/*"); break; case R.id.Button_main_showtext: intent.setAction(android.content.Intent.ACTION_VIEW); intent.setDataAndType( Uri.fromFile(new File( "mnt/sdcard/Download/info.txt")), "text/*"); break; case R.id.Button_main_playaudio: intent.setAction(android.content.Intent.ACTION_VIEW); intent.setDataAndType( Uri.fromFile(new File( "mnt/sdcard/Download/heavencity.mp3")), "audio/*"); break; case R.id.Button_main_playvideo: intent.setAction(android.content.Intent.ACTION_VIEW); intent.setDataAndType( Uri.fromFile(new File( "mnt/sdcard/Download/girl.3gp")), "video/*"); break; case R.id.Button_main_home: intent.setAction("android.intent.action.main"); intent.addCategory("android.intent.category.HOME"); break; default: break; } startActivity(intent); } } |