您好,登錄后才能下訂單哦!
Intent用于封裝程序的“調(diào)用意圖”。兩個(gè)Activity之間,可以把需要交換的數(shù)據(jù),封裝成Bundle對象,然后使用Intent對象,攜帶數(shù)據(jù)到另一個(gè)Activity中。實(shí)現(xiàn)兩個(gè)Activity的數(shù)據(jù)交換。
Intent還是各種應(yīng)用程序組件之間通信的重要媒介。啟動(dòng)Activity、Service、BroadcastReceiver,都需要使用Intent。
Intent還有一個(gè)好處,如果應(yīng)用程序只是想啟動(dòng)具有某種特征的組件,并不想和某個(gè)具體的組件耦合,則可以通過在int ent - filt er 中配置相應(yīng)的屬性進(jìn)行處理,與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作為標(biāo)識符,代表一個(gè)Intent ,當(dāng)一個(gè)Activity 需要外部協(xié)助處理時(shí),就會(huì)發(fā)出一個(gè)Intent,如果一個(gè)程序能完成相應(yīng)功能,只要在int ent - filt er 加上這個(gè)這個(gè)intent 就可以了。
·Data保存需要傳遞的數(shù)據(jù)格式,比如:tel://
·Extras保存需要傳遞的額外數(shù)據(jù)。
·Category 表示Intent的種類,從android上啟動(dòng)Activity 有多種方式,比如 程序列表、桌面圖標(biāo)、點(diǎn)擊Home激活的桌面等等,Category則用來標(biāo)識這些Activity的圖標(biāo)會(huì)出現(xiàn)在哪些啟動(dòng)的上下文環(huán)境里。
(一) ComponentName:明確指定Intent將要啟動(dòng)哪個(gè)組件,因此這種Intent被稱為顯示Intent,沒有指定ComponentName屬性的Intent被稱為隱式Intent。隱式Intent沒有明確要啟動(dòng)哪個(gè)組件,應(yīng)用匯根據(jù)Intent指定的規(guī)則去啟動(dòng)符合條件的組件。ComponentName不僅可以啟動(dòng)本程序中的activity,還可以啟動(dòng)其它程序的activity。
啟動(dòng)方式:
Intent intent =new Intent();
ComponentNamecomponent= new ComponentName(this, TwoActivity.class);
intent.setComponent(component);
等價(jià)于:
Intent intent =new Intent(this, TwoActivity.class);
startActivity(intent);
等價(jià)于:
Intent intent =new Intent();
intent.setClass(this,TwoActivity.class);
startActivity(intent);
等價(jià)于:
Intent intent =new Intent();
intent.setClassName(this,"com.zzh.day06_intent.TwoActivity");
startActivity(intent);
本程序中啟動(dòng)其它程序:
(二) Action、Category 屬性與intent-filter配置:
通常,Action, Category屬性結(jié)合使用。定義這兩個(gè)屬性都是在主配置文件的<intent-filter>節(jié)點(diǎn)中。Intent通過定義Action屬性(其實(shí)就是定義一段自定義的字符串),這樣就可以把Intent與具體的某個(gè)Activity分離,實(shí)現(xiàn)了解耦。否則,每次跳轉(zhuǎn)都有寫成,
(三) data:
1、 用于添加數(shù)據(jù)。通常是啟動(dòng)某個(gè)系統(tǒng)程序或其他程序,帶給此程序的信息。Data屬性通常用于向Action屬性提供操作的數(shù)據(jù)。Data屬性的值是個(gè)Uri對象。
Uri的格式如下:scheme://host:port /path
2、 系統(tǒng)內(nèi)置的屬性常量
tel:是固定寫法,是系統(tǒng)內(nèi)置的屬性常量。
系統(tǒng)內(nèi)置的幾個(gè)Dat a屬性常量:
·tel: //:號碼數(shù)據(jù)格式,后跟電話號碼。
·mailto: //:郵件數(shù)據(jù)格式,后跟郵件收件人地址。
·smsto: //:短息數(shù)據(jù)格式,后跟短信接收號碼。
·content : //:內(nèi)容數(shù)據(jù)格式,后跟需要讀取的內(nèi)容。
·file://:文件數(shù)據(jù)格式,后跟文件路徑。
·market://search?q=pname:pkgname:市場數(shù)據(jù)格式,在Google Market里搜索包名為pkgname的應(yīng)用。
·geo: //latitude, longitude:經(jīng)緯數(shù)據(jù)格式,在地圖上顯示經(jīng)緯度所指定的位置。
四、Intent利用Action屬性和Dat a屬性啟動(dòng)Android系統(tǒng)內(nèi)置組件的代碼
(一)、撥打電話: Intent intent=new Intent(); intent.setAction(Intent.ACTION_CALL); //intent.setAction("android.intent.action.CALL"); //以下各項(xiàng)皆如此,都有兩種寫法。 intent.setData(Uri.parse("tel:1320010001")); startActivity(intent); //調(diào)用撥號面板: Intent intent=new Intent(); intent.setAction(Intent.ACTION_DIAL); intent.setData(Uri.parse("tel:1320010001")); startActivity(intent); //調(diào)用撥號面板: 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對應(yīng)的MIME類型。MIME只要符合“abc /xyz”這樣的字符串格式即可。
2、Intent利用Action、Data和Type屬性啟動(dòng)Android系統(tǒng)內(nèi)置組件的代碼:
播放視頻: 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(鍵, 值)的形式在多個(gè)Activity之間進(jìn)行數(shù)據(jù)交換。
2、系統(tǒng)內(nèi)置的幾個(gè)Extra常量
EXTRA_BCC:存放郵件密送人地址的字符串?dāng)?shù)組。
EXTRA_CC:存放郵件抄送人地址的字符串?dāng)?shù)組。
EXTRA_EMAIL :存放郵件地址的字符串?dāng)?shù)組。
EXTRA_SUBJECT:存放郵件主題字符串。
EXTRA_TEXT:存放郵件內(nèi)容。
EXTRA_KEY_EVENT:以KeyEvent對象方式存放觸發(fā)Intent 的按鍵。
EXTRA_PHONE_ NUMBER :存放調(diào)用ACTION_CALL 時(shí)的電話號碼。
3 、Intent 利用Action、Data和Type、Extra屬性啟動(dòng)Android系統(tǒng)內(nèi)置組件的代碼:
調(diào)用發(fā)送短信的程序 Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.setType("vnd.android-dir/mms-sms"); intent.putEx tra("sms_body","信息內(nèi)容..."); startActivity(intent); //發(fā)送短信息 Uri uri =Uri.parse("smsto:13200100001"); Intent intent = new Intent(); intent.setAction(Intent.ACTION_SENDTO); intent.setData(uri); intent.putEx tra("sms_body","信息內(nèi)容..."); startActivity( intent ); //發(fā)送彩信,設(shè)備會(huì)提示選擇合適的程序發(fā)送 Uri uri = Uri.parse("content://media/external/p_w_picpaths/media/23"); //設(shè)備中的資源(圖像或其他資源) Intent intent = new Intent(); intent.setAction(Intent. ACTION_SEND ); intent.setType("p_w_picpath/png"); intent.putExtra("sms_body","內(nèi)容"); intent.putExtra(Intent.EX TRA_STREAM,uri); startActivity(it); 發(fā)送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, "請選擇郵件發(fā)送軟件"); startActivity(intent); intent.setAction(android.provider.Settings.ACTION_SETTINGS) |
4 、Intent利用Action屬性中的ACTION_GET_CONTENT獲取返回值
//選擇圖片requestCode返回的標(biāo)識 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 可調(diào)用addFlags()方法來為Intent 添加控制標(biāo)記。【重要】
1 、FLAG_ ACTIVITY_CLEAR_TOP:(效果同Activity LaunchMode的singleTask)
如果在棧中已經(jīng)有該Activity的實(shí)例,就重用該實(shí)例。重用時(shí),會(huì)讓該實(shí)例回到棧頂,因此在它上面的實(shí)例將會(huì)被移除棧。如果棧中不存在該實(shí)例,將會(huì)創(chuàng)建新的實(shí)例放入棧中。
2 、FLAG_ACTIVITY_SINGLE_TOP:(效果同Activity L aunchMode的singleTop)
如果在任務(wù)的棧頂正好存在該Activity的實(shí)例, 就重用該實(shí)例,而不會(huì)創(chuàng)建新的Activity 對象。
3 、FLAG_ ACTIVITY_NEW_TASK:
【備注:】以下幾個(gè)為了解。
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); |
例如:
如果依次啟動(dòng)了四個(gè)Activity :A、B、C 、D。
在D Activity 里,跳到B Activity,同時(shí)希望D和C 都finish掉,可以在startActivity (intent )里的intent 里添加flags標(biāo)記,如下所示:
Intent intent = new Intent(this , B.class);
intent .setFlags (Intent .FLAG_ACTIVITY_CLEAR_TOP);
s t ar t Activity(intent );
這樣啟動(dòng)B Activity的同時(shí),就會(huì)把D、C 都finis hed掉。
如果B Activity的launchMode是默認(rèn)的“st andar d”,則B Activity會(huì)首先finis hed掉舊的B頁面,再啟動(dòng)一個(gè)新的Activity B。如果不想重新再創(chuàng)建一個(gè)新的B Activity,而是重用之前的B Activity,可以將B Activity的launchMode設(shè)置為“singleTask”?!咎貏e需要注意的是:在部分手機(jī)中,如三星手機(jī)。即便是singleTask也會(huì)產(chǎn)生新的頁面,而不是重用之前的頁面?!?/span>
四、利用Intent 屬性調(diào)用系統(tǒng)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=" 啟動(dòng)撥號面板" /> <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="發(fā)送短信" /> <Button android:id="@+id/Button_main_setting" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="clickButton " android:text="系統(tǒng)設(shè)置" /> <Button android:id="@+id/Button_main_datesetting" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="clickButton" android:text=" 日期設(shè)置" /> <Button android:id="@+id/Button_main_soundsetting" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="clickButton" android:text=" 聲音設(shè)置" /> <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 設(shè)置" /> <Button android:id="@+id/Button_main_web" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="clickButton" android:text=" 瀏覽網(wǎng)頁" /> <Button android:id="@+id/Button_main_contacts" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="clickButton" android:text=" 查看聯(lián)系人" /> <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); } } |
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。