天天看點

android之Intent的七大屬性

    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>&lt;</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>&gt;</code>

<code>      </code><code>&lt;</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>&gt;</code>

<code>          </code><code>&lt;</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>/&gt;</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>/&gt;</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>/&gt;</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>/&gt;</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>/&gt;</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>/&gt;</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>/&gt;</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>/&gt;</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>/&gt;</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>/&gt;</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>/&gt;</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>/&gt;</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>/&gt;</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>/&gt;</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>/&gt;</code>

<code>      </code><code>&lt;/</code><code>LinearLayout</code><code>&gt;</code>

<code>  </code><code>&lt;/</code><code>ScrollView</code><code>&gt;</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

繼續閱讀