Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Intent及其七大屬性及intent-filter設置

Intent及其七大屬性及intent-filter設置

編輯:關於Android編程

一、知識點回顧:Activity

(一)、如何實現Activity頁面跳轉?

示例代碼:

//第一種方式:

Intentintent = new Intent(MainActivity.this,NextActivity.class);

startActivity(intent);

//第二種方式:

Intentintent = new Intent();

intent.setClass(MainActivity.this, NextActivity.class);

startActivity(intent);

//其實還有很多種Intent實現頁面跳轉的寫法。

二、Intent對象介紹:

(一)、Intent基本介紹:

1、Intent 用於封裝程序的”調用意圖“。兩個Activity之間,可以把需要交換的數據封裝成Bundle對象,然後使用Intent攜帶Bundle對象,實現兩個Activity之間的數據交換;

2、Intent還是各種應用程序組件之間通信的重要媒介。不管想啟動一個Acitivity、Service還是BroadcastReceiver,Android均使用統一的Intent對象來封裝這種”啟動意圖“。很明顯使用Intent提供了一致的編程模型;

3、Intent還有一個好處,如果應用程序只是想啟動具有某種特征的組件,並不想和某個具體的組件耦合,則可以通過在intent-filter中配置相應的屬性進行處理,與struts2中的MVC框架思路類似。

4、Intent對象大致包括7大屬性:ComponentName、 Action、Category、Data 、Type、 Extra、Flag。

(二)、Intent啟動不同組件的方法:

1、啟動Activity:

startActivity()

startActivtyForResult()

2、啟動Service:【後面詳細講】

ComponetName startService()

boolean bindService()

3、啟動BroadcastReceiver:【後面詳細講】

sendBroadcast()

sendOrderedBroadcast()

sendStickyBroadcast()

sendStickyOrderedBroadcast()

三、Intent的七大屬性:【重要】

Intent對象大致包括7大屬性:ComponentName、 Action 、 Category 、 Data 、Type、 Extra 、Flags。

Action作為標識符,代表一個Intent,當一個Activity需要外部協助處理時,就會發出一個Intent,如果一個程序能完成相應功能,只要在intent-filter加上這個這個intent就可以了。

Data保存需要傳遞的數據格式,比如:tel://

Extras保存需要傳遞的額外數據。

Category表示Intent的種類,從android上啟動Activity有多種方式,比如 程序列表、桌面圖標、點擊Home激活的桌面等等,Category則用來標識這些Activity的圖標會出現在哪些啟動的上下文環境裡。

(一)、ComponentName屬性:

1、指定了ComponentName屬性的Intent已經明確了它將要啟動哪個組件,因此這種Intent被稱為顯式Intent,沒有指定ComponentName屬性的Intent被稱為隱式Intent。隱式Intent沒有明確要啟動哪個組件,應用會根據Intent指定的規則去啟動符合條件的組件。

2、示例代碼:

Intent intent = new Intent();

ComponentName cName = new ComponentName(MainActivity.this,NextActivity.class);

intent.setComponent(cName);

startActivity(intent);

//實際上,以上的寫法都被簡化為以下寫法:

Intentintent = new Intent(MainActivity.this,NextActivity.class);

startActivity(intent);

//也就是說,平時我們最常用的Intent頁面跳轉的寫法就調用的是顯式Intent。

此外,ComponentName屬性可以實現一個app跳轉到另一個app。

Intent intent = new Intent();

ComponentName cName = new ComponentName(

"com.steven.testasyncloader.sqlitedata","com.steven.testasyncloader.sqlitedata.MainActivity");

//其中兩個參數的含義:第一個是要跳轉到的app的包名,第二個參數是該包中的要跳轉到app的頁面的class

intent.setComponent(cName);

startActivity(intent);

(二)、Action、Category屬性與intent-filter配置:

通常,Action、Category屬性結合使用,定義這兩個屬性都是在配置文件的節點中。Intent通過定義Action屬性(其實就是一段自定義的字符串),這樣就可以把Intent與具體的某個Activity分離,實現了解耦。否則,每次跳轉,都要寫成類似new Intent(MainActivity.this,NextActivity.class)這樣的形式,也就是說必須將要跳轉的目標Activity的名字寫出來,這樣的編碼其實是“硬編碼”,並沒有實現松耦合。調用Intent對象的setAction()方法實現頁面跳轉雖然略微復雜(需要在AndroidManifest.xml文件中配置),但是實現了解耦。

1、示例代碼:

Intent intent = new Intent();

intent.setAction("com.steven.android06lifecycle.nextactivity");

startActivity(intent);

//在配置文件中注冊Activity的時候需要聲明:

//當某個頁面是默認啟動頁面時,需要定義Action、Category的屬性必須為以下字符串:【設置任務入口】

2、常用Action屬性常量:

Intent對象不僅可以啟動本應用內的程序組件,也可以啟動Android系統的其他應用的組件,包括系統內置的程序組件(需要設置權限)。

ACTION_MAIN:(android.intent.action.MAIN)Android程序入口。

每個Android應用必須且只能包含一個此類型的Action聲明。【如果設置多個,則哪個在前,執行哪個。】

ACTION_VIEW: (android.intent.action.VIEW)顯示指定數據。

ACTION_EDIT: (android.intent.action.EDIT)編輯指定數據。

ACTION_DIAL: (android.intent.action.DIAL)顯示撥號面板。

ACTION_CALL: (android.intent.action.CALL)直接呼叫Data中所帶的號碼。

ACTION_ANSWER: (android.intent.action.ANSWER)接聽來電。

ACTION_SEND: (android.intent.action.SEND)向其他人發送數據(例如:彩信/email)。

ACTION_SENDTO: (android.intent.action.SENDTO)向其他人發送短信。

ACTION_SEARCH: (android.intent.action.SEARCH)執行搜索。

ACTION_GET_CONTENT: (android.intent.action.GET_CONTENT)讓用戶選擇數據,並返回所選數據。

(三)、Category 屬性:

Category屬性為Action增加額外的附加類別信息。CATEGORY_LAUNCHER意味著在加載程序的時候Acticity出現在最上面,而CATEGORY_HOME表示頁面跳轉到HOME界面。

1、實現頁面跳轉到HOME界面的代碼:【記憶】

Intent intent = new Intent();

intent.setAction(Intent.ACTION_MAIN);

intent.addCategory(Intent.CATEGOTY_HOME);

startActivity(intent);

2、常用Category屬性常量:

CATEGORY_DEFAULT: (android.intent.category.DEFAULT)Android系統中默認的執行方式,按照普通Activity的執行方式執行。

CATEGORY_HOME: (android.intent.category.HOME)設置該組件為Home Activity。

CATEGORY_PREFERENCE: (android.intent.category.PREFERENCE)設置該組件為Preference。

CATEGORY_LAUNCHER: (android.intent.category.LAUNCHER)設置該組件為在當前應用程序啟動器中優先級最高的Activity,通常與入口ACTION_MAIN配合使用。

CATEGORY_BROWSABLE: (android.intent.category.BROWSABLE)設置該組件可以使用浏覽器啟動。

(四)、Data屬性:

1、Data屬性通常用於向Action屬性提供操作的數據。Data屬性的值是個Uri對象。

Uri的格式如下:scheme://host:port/path

2、系統內置的幾個Data屬性常量:

tel://:號碼數據格式,後跟電話號碼。

mailto://:郵件數據格式,後跟郵件收件人地址。

smsto://:短息數據格式,後跟短信接收號碼。

content://:內容數據格式,後跟需要讀取的內容。

file://:文件數據格式,後跟文件路徑。

market://search?q=pname:pkgname:市場數據格式,在Google Market裡搜索包名為pkgname的應用。

geo://latitude, longitude:經緯數據格式,在地圖上顯示經緯度所指定的位置。

3、Intent利用Action屬性和Data屬性啟動Android系統內置組件的代碼:【不需要記憶,用到的時候查找資料】

(一)、撥打電話:

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(Intent.ACTION_VIEW);

intent.setData(Uri.parse("tel:1320010001"));

startActivity(intent);

(二)、利用Uri打開浏覽器、打開地圖等:

Uri uri = Uri.parse("http://www.google.com"); //浏覽器

Uri uri=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.putExtra("sms_body", "信息內容...");

startActivity(intent);

//發送短信息

Uri uri = Uri.parse("smsto:13200100001");

Intent intent= new Intent();

intent.setAction(Intent.ACTION_SENDTO);

intent.setData(uri);

intent.putExtra("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.EXTRA_STREAM, uri);

startActivity(it);

(五)、發送Email:

Intent intent=new Intent();

intent.setAction(Intent.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_TEXT, "The email body text");

intent.putExtra(Intent.EXTRA_SUBJECT, "The email subject text");

intent.setType("message/rfc822");

startActivity(Intent.createChooser(intent, "Choose Email Client"));

Intent intent = new Intent(Intent.ACTION_SEND);

String[] tos = { "[email protected]" };

intent.putExtra(Intent.EXTRA_EMAIL, tos);

intent.putExtra(Intent.EXTRA_TEXT, getPhoneParameter());

intent.putExtra(Intent.EXTRA_SUBJECT, "Android日志");

intent.putExtra(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 Intent();

intent.setAction(Intent.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(wrapperIntent, 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_SINGLE_TOP:(效果同Activity LaunchMode的singleTop)

如果在任務的棧頂正好存在該Activity的實例, 就重用該實例,而不會創建新的Activity對象。

2、FLAG_ACTIVITY_CLEAR_TOP:(效果同Activity LaunchMode的singleTask)

如果在棧中已經有該Activity的實例,就重用該實例。重用時,會讓該實例回到棧頂,因此在它上面的實例將會被移除棧。如果棧中不存在該實例,將會創建新的實例放入棧中。

3、FLAG_ACTIVITY_NEW_TASK:(效果類似Activity LaunchMode的singleInstance)

【備注:】

使用Intent的setFlags()方法設置窗口的啟動模式。常用的有:

Intent.FLAG_ACTIVITY_SINGLE_TOP

Intent.FLAG_ACTIVITY_CLEAR_TOP

Intent.FLAG_ACTIVITY_NEW_TASK

Intent.FLAG_ACTIVITY_CLEAR_TASK

Intent.FLAG_ACTIVITY_REORDER_TO_FRONT

Intent.FLAG_ACTIVITY_SINGLE_TOP:與在launchMode設置singleTop是完全一樣的。

Intent.FLAG_ACTIVITY_CLEAR_TOP:

當跳轉到一個單獨使用Intent.FLAG_ACTIVITY_CLEAR_TOP的Activity時,會檢測回退棧是否已經有該窗口了,如果有就會清空壓在上面的窗口和自己本身,然後在新建一個新的窗口壓入回退棧。

例如:如果窗口A跳轉到B,B跳轉到C,C又調轉到B(跳轉時給Intent設置了Intent.FLAG_ACTIVITY_CLEAR_TOP),此時回退棧順序為:A-B,並且會執行B的onCreate方法。

當Intent.FLAG_ACTIVITY_CLEAR_TOP與Intent.FLAG_ACTIVITY_SINGLE_TOP同時使用,就與在launchMode設置singleTask,並跳轉到程序內部的窗口的作用是一樣的。

示例代碼:

Intent intent = new Intent(this, MainActivity.class); //將Activity棧中處於MainActivity主頁面之上的Activity都彈出。 intent.setFlags(Intent.FLAG_ACTIVITY_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);

startActivity(intent);

這樣啟動B Activity的同時,就會把D、C都finished掉。

如果B Activity的launchMode是默認的“standard”,則B Activity會首先finished掉舊的B頁面,再啟動一個新的Activity B。 如果不想重新再創建一個新的B Activity,而是重用之前的B Activity,可以將B Activity的launchMode設置為“singleTask”。【特別需要注意的是:在部分手機中,如三星手機。即便是singleTask也會產生新的頁面,而不是重用之前的頁面。】


  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved