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.setClass(this,TwoActivity.class);
intent.setClassName(this,"com.zzh.day06_intent.TwoActivity");
本程式中啟動其它程式:
(二) 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"));
//調用撥号面闆:
intent.setAction(Intent.ACTION_DIAL);
intent.setAction(I ntent.ACTION_VIEW);
(二)、利用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);
(五)Type屬性
1、Type屬性用于指定Data所指定的Uri對應的MIME類型。MIME隻要符合“abc /xyz”這樣的字元串格式即可。
2、Intent利用Action、Data和Type屬性啟動Android系統内置元件的代碼:
播放視訊:
Uri uri =Uri.parse("file:///sdcard/media.mp4");
intent.setDataAndType(uri,"video/*");
(六)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.setType("vnd.android-dir/mms-sms");
intent.putEx tra("sms_body","資訊内容...");
//發送短資訊
Uri uri =Uri.parse("smsto:13200100001");
intent.setAction(Intent.ACTION_SENDTO);
startActivity( intent );
//發送彩信,裝置會提示選擇合适的程式發送
Uri uri = Uri.parse("content://media/external/images/media/23"); //裝置中的資源(圖像或其他資源)
intent.setAction(Intent. ACTION_SEND );
intent.setType("image/png");
intent.putExtra("sms_body","内容");
intent.putExtra(Intent.EX TRA_STREAM,uri);
startActivity(it);
發送Email:
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, "請選擇郵件發送軟體");
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.setAction(Intent.ACTION_GET_CONTENT);
intent.setType( "video/* " );
//視訊
intent.setType( "video/* ");
startActivityForResult(wrapperI ntent,requestCode);
//錄音
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);
例如:
如果依次啟動了四個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、布局核心代碼:
<code><</code><code>ScrollView</code>
<code> </code><code>android:id</code><code>=</code><code>"@+id/ScrollView1"</code>
<code> </code><code>android:layout_width</code><code>=</code><code>"match_parent"</code>
<code> </code><code>android:layout_height</code><code>=</code><code>"wrap_content"</code> <code>></code>
<code> </code><code><</code><code>LinearLayout</code>
<code> </code><code>android:layout_width</code><code>=</code><code>"match_parent"</code>
<code> </code><code>android:layout_height</code><code>=</code><code>"match_parent"</code>
<code> </code><code>android:orientation</code><code>=</code><code>"vertical"</code> <code>></code>
<code> </code><code><</code><code>Button</code>
<code> </code><code>android:id</code><code>=</code><code>"@+id/Button_main_call "</code>
<code> </code><code>android:layout_width</code><code>=</code><code>"wrap_content"</code>
<code> </code><code>android:layout_height</code><code>=</code><code>"wrap_content"</code>
<code> </code><code>android:onClick</code><code>=</code><code>"clickButton"</code>
<code> </code><code>android:text</code><code>=</code><code>" 直接撥号"</code> <code>/></code>
<code> </code><code>android:id</code><code>=</code><code>"@+id/Button_main_dial"</code>
<code> </code><code>android:text</code><code>=</code><code>" 啟動撥号面闆"</code> <code>/></code>
<code> </code><code>android:id</code><code>=</code><code>"@+id/Button_main_dialer"</code>
<code> </code><code>android:text</code><code>=</code><code>"顯示撥号面闆"</code> <code>/></code>
<code> </code><code>android:id</code><code>=</code><code>"@+id/Button_main_sms"</code>
<code> </code><code>android:onClick</code><code>=</code><code>"clickButton "</code>
<code> </code><code>android:text</code><code>=</code><code>"發送短信"</code> <code>/></code>
<code> </code><code>android:id</code><code>=</code><code>"@+id/Button_main_setting"</code>
<code> </code><code>android:text</code><code>=</code><code>"系統設定"</code> <code>/></code>
<code> </code><code>android:id</code><code>=</code><code>"@+id/Button_main_datesetting"</code>
<code> </code><code>android:text</code><code>=</code><code>" 日期設定"</code> <code>/></code>
<code> </code><code>android:id</code><code>=</code><code>"@+id/Button_main_soundsetting"</code>
<code> </code><code>android:text</code><code>=</code><code>" 聲音設定"</code> <code>/></code>
<code> </code><code>android:id</code><code>=</code><code>"@+id/Button_main_wifisetting"</code>
<code> </code><code>android:text</code><code>=</code><code>" W I F I 設定"</code> <code>/></code>
<code> </code><code>android:id</code><code>=</code><code>"@+id/Button_main_web"</code>
<code> </code><code>android:text</code><code>=</code><code>" 浏覽網頁"</code> <code>/></code>
<code> </code><code>android:id</code><code>=</code><code>"@+id/Button_main_contacts"</code>
<code> </code><code>android:text</code><code>=</code><code>" 檢視聯系人"</code> <code>/></code>
<code> </code><code>android:id</code><code>=</code><code>"@+id/Button_main_showimage"</code>
<code> </code><code>android:text</code><code>=</code><code>" 檢視圖檔"</code> <code>/></code>
<code> </code><code>android:id</code><code>=</code><code>"@+id/Button_main_showtext"</code>
<code> </code><code>android:text</code><code>=</code><code>" 檢視文本"</code> <code>/></code>
<code> </code><code>android:id</code><code>=</code><code>"@+id/Button_main_playvideo"</code>
<code> </code><code>android:text</code><code>=</code><code>" 播放視訊"</code> <code>/></code>
<code> </code><code>android:id</code><code>=</code><code>"@+id/Button_main_playaudio"</code>
<code> </code><code>android:text</code><code>=</code><code>" 播放音頻"</code> <code>/></code>
<code> </code><code>android:id</code><code>=</code><code>"@+id/Button_main_home"</code>
<code> </code><code>android:text</code><code>=</code><code>" H O M E "</code> <code>/></code>
<code> </code><code></</code><code>LinearLayout</code><code>></code>
<code> </code><code></</code><code>ScrollView</code><code>></code>
2 、java核心代碼:
<code>public</code> <code>class</code> <code>MainActivity </code><code>extends</code> <code>Activity</code>
<code>{</code>
<code> </code><code>@Override</code>
<code> </code><code>protected</code> <code>void</code> <code>onCreate(Bundle savedInstanceState)</code>
<code> </code><code>{</code>
<code> </code><code>super</code><code>.onCreate(savedInstanceState);</code>
<code> </code><code>setContentView(R.layout.a);</code>
<code> </code><code>}</code>
<code> </code><code>public</code> <code>void</code> <code>clickButton(View view)</code>
<code> </code><code>Intent intent = </code><code>new</code> <code>Intent();</code>
<code> </code><code>// android.content.intent.ACTION_VIEW</code>
<code> </code><code>intent.setAction(android.content.Intent.ACTION_VIEW);</code>
<code> </code><code>switch</code> <code>(view.getId())</code>
<code> </code><code>{</code>
<code> </code><code>case</code> <code>R.id.Button_main_call:</code>
<code> </code><code>intent.setAction(android.content.Intent.ACTION_CALL);</code>
<code> </code><code>intent.setData(Uri.parse(</code><code>"tel:10086"</code><code>));</code>
<code> </code><code>break</code><code>;</code>
<code> </code><code>case</code> <code>R.id.Button_main_dial:</code>
<code> </code><code>intent.setAction(android.content.Intent.ACTION_DIAL);</code>
<code> </code><code>case</code> <code>R.id.Button_main_dialer:</code>
<code> </code><code>intent.setAction(</code><code>"com.android.phone.action.TOUCH_DIALER"</code><code>);</code>
<code> </code><code>case</code> <code>R.id.Button_main_sms:</code>
<code> </code><code>intent.setAction(android.content.Intent.ACTION_SENDTO);</code>
<code> </code><code>intent.setData(Uri.parse(</code><code>"smsto:10086"</code><code>));</code>
<code> </code><code>intent.putExtra(</code><code>"sms_body"</code><code>, </code><code>"該吃飯了,下課吧!"</code><code>);</code>
<code> </code><code>case</code> <code>R.id.Button_main_setting:</code>
<code> </code><code>intent.setAction(</code><code>"android.settings.settings"</code><code>);</code>
<code> </code><code>case</code> <code>R.id.Button_main_datesetting:</code>
<code> </code><code>intent.setAction(</code><code>"android.settings.DATE_settingS"</code><code>);</code>
<code> </code><code>case</code> <code>R.id.Button_main_soundsetting:</code>
<code> </code><code>intent.setAction(</code><code>"android.settings.SOUND_settingS"</code><code>);</code>
<code> </code><code>case</code> <code>R.id.Button_main_wifisetting:</code>
<code> </code><code>intent.setAction(</code><code>"android.settings.WIFI_settings"</code><code>);</code>
<code> </code><code>case</code> <code>R.id.Button_main_contacts:</code>
<code> </code><code>intent.setAction(</code><code>"com.android.contacts.action.LIST_contacts"</code><code>);</code>
<code> </code><code>case</code> <code>R.id.Button_main_web:</code>
<code> </code><code>intent.setAction(android.content.Intent.ACTION_VIEW);</code>
<code> </code><code>intent.setData(Uri</code>
<code> </code><code>.parse(</code><code>"http://www.baidu.com"</code><code>));</code>
<code> </code><code>case</code> <code>R.id.Button_main_showimage:</code>
<code> </code><code>intent.setDataAndType(</code>
<code> </code><code>Uri.fromFile(</code><code>new</code> <code>File(</code>
<code> </code><code>"mnt/sdcard/Download/landscape.jpg"</code><code>)),</code>
<code> </code><code>"image/*"</code><code>);</code>
<code> </code><code>case</code> <code>R.id.Button_main_showtext:</code>
<code> </code><code>"mnt/sdcard/Download/info.txt"</code><code>)),</code>
<code> </code><code>"text/*"</code><code>);</code>
<code> </code><code>case</code> <code>R.id.Button_main_playaudio:</code>
<code> </code><code>"mnt/sdcard/Download/heavencity.mp3"</code><code>)),</code>
<code> </code><code>"audio/*"</code><code>);</code>
<code> </code><code>case</code> <code>R.id.Button_main_playvideo:</code>
<code> </code><code>"mnt/sdcard/Download/girl.3gp"</code><code>)),</code>
<code> </code><code>"video/*"</code><code>);</code>
<code> </code><code>case</code> <code>R.id.Button_main_home:</code>
<code> </code><code>intent.setAction(</code><code>"android.intent.action.main"</code><code>);</code>
<code> </code><code>intent.addCategory(</code><code>"android.intent.category.HOME"</code><code>);</code>
<code> </code><code>default</code><code>:</code>
<code> </code><code>}</code>
<code> </code><code>startActivity(intent);</code>
<code>}</code>
<code></code>
本文轉自 墨宇hz 51CTO部落格,原文連結:http://blog.51cto.com/zzhhz/1627818