Intent用於封裝程序的「調用意圖」。兩個Activity之間,能夠把須要交換的數據,封裝成Bundle對象,而後使用Intent對象,攜帶數據到另外一個Activity中。實現兩個Activity的數據交換。java
Intent仍是各類應用程序組件之間通訊的重要媒介。啓動Activity、Service、BroadcastReceiver,都須要使用Intent。android
Intent還有一個好處,若是應用程序只是想啓動具備某種特徵的組件,並不想和某個具體的組件耦合,則能夠經過在int ent - filt er 中配置相應的屬性進行處理,與s t uc t s 2 中的MVC框架思路相似git
Intent對象大體包括7大屬性:1、Component Name,2、Action,3、Catory,4、data,5、Type,6、Extra,7、Flag。web
·Action做爲標識符,表明一個Intent ,當一個Activity 須要外部協助處理時,就會發出一個Intent,若是一個程序能完成相應功能,只要在int ent - filt er 加上這個這個intent 就能夠了。數組
·Data保存須要傳遞的數據格式,好比:tel://瀏覽器
·Extras保存須要傳遞的額外數據。app
·Category 表示Intent的種類,從android上啓動Activity 有多種方式,好比 程序列表、桌面圖標、點擊Home激活的桌面等等,Category則用來標識這些Activity的圖標會出如今哪些啓動的上下文環境裏。框架
(一) ComponentName:明確指定Intent將要啓動哪一個組件,所以這種Intent被稱爲顯示Intent,沒有指定ComponentName屬性的Intent被稱爲隱式Intent。隱式Intent沒有明確要啓動哪一個組件,應用匯根據Intent指定的規則去啓動符合條件的組件。ComponentName不只能夠啓動本程序中的activity,還能夠啓動其它程序的activity。ide
啓動方式:佈局
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:
一、 用於添加數據。一般是啓動某個系統程序或其餘程序,帶給此程序的信息。Data屬性一般用於向Action屬性提供操做的數據。Data屬性的值是個Uri對象。
Uri的格式以下:scheme://host:port /path
二、 系統內置的屬性常量
tel:是固定寫法,是系統內置的屬性常量。
系統內置的幾個Dat a屬性常量:
·tel: //:號碼數據格式,後跟電話號碼。
·mailto: //:郵件數據格式,後跟郵件收件人地址。
·smsto: //:短息數據格式,後跟短信接收號碼。
·content : //:內容數據格式,後跟須要讀取的內容。
·file://:文件數據格式,後跟文件路徑。
·market://search?q=pname:pkgname:市場數據格式,在Google Market裏搜索包名爲pkgname的應用。
·geo: //latitude, longitude:經緯數據格式,在地圖上顯示經緯度所指定的位置。
4、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/p_w_picpaths/media/23"); //設備中的資源(圖像或其餘資源) Intent intent = new Intent(); intent.setAction(Intent. ACTION_SEND ); intent.setType("p_w_picpath/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={"android1@163.com"} String[]ccs={"you@yahoo.com"}; 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 = {"mobileservice@ablesky.com"}; 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( "p_w_picpath/* " ); 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也會產生新的頁面,而不是重用以前的頁面。】
4、利用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_showp_w_picpath" 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_showp_w_picpath: intent.setAction(android.content.Intent.ACTION_VIEW); intent.setDataAndType( Uri.fromFile(new File( "mnt/sdcard/Download/landscape.jpg")), "p_w_picpath/*"); 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); } } |