Android笔记一.深入理解Intent和IntentFilters(一)
也就是說,發送"意圖"的組件通過Intent對象所包括的內容。來啟動指定的(即Component屬性)或通過篩選(
即Action&Category屬性)的某(些)組件,然后實施對應的動作(即Action屬性)并傳遞對應的數據(即Data屬性)以便完畢對應的動作。 二、Intent是怎樣實現組件間相互調用? 1.Intent實現 ? ? ? ? ??上圖請求一個Activity組件的簡單的實現流程圖,算是用的最多的Intent解析實例。 ? ?首先,發出"意圖"的組件,通過調用Context.startActivity(intent)開始啟動組件:發出"意圖"的組件傳入已經構好的Intent對象(為一組信息,它決定了是否可以成功的啟動還有一個組件); ? ?然后,調用"動作"實際的執行著Instrumentation對象。它是整個應用激活的Activity管理者。集中負責應用內全部Activity的執行。它有一個隱藏的方法execStartActivity方法。就是負責依據Intent啟動Activity。該方法去掉一些細節。它做得最重要的事情,就是將此調用,通過RPC的方式。傳遞到ActivityManagerService。 ? ?最后,ActivityManagerService會將這些關鍵信息遞交給還有一個服務PackageManagerService,此服務掌握整個軟件包及其各組件的信息。它會將傳遞過來的Intent。與已知的全部Intent Filters進行匹配(假設帶有Component信息,就不用比了)。假設找到了,就把相關Component的信息通知回AcitivityManagerService,在這里。會完畢啟動Activity這個非常多細節的事情。?? 2.Intent匹配 ? ? 究竟發出"意圖"的組件是怎樣找到所需的組件呢?在這里,Intent Filters就開始起作用了。Intent Filters定義在AndroidMainFest.xml文件里。每個Activity都會有一個<Intent Filters/>元素,它包括了<action/>、<data/>等子元素。當我們的intent對象沒有包括Component信息時,這樣的"意圖"被稱之為隱形"意圖"。也就是說,"意圖"沒有指明詳細要啟動哪個組件以及完畢什么樣的動作。這時我們就須要通過
Intent Filters中的子元素進行信息匹配。從而確定當前包括Intent Filters屬性的Activity是不是我們要啟動的那個(些)組件。即發送"意圖"組件配置好intent對象,被啟動組件實現Intent Filters屬性,最后。發送組件會依據被啟動組件AndroidMainFest.xml中的<Intent Filters/>信息來確定它是不是目標組件。 三、Intent對象具體解釋 ??Intent類的對象是組件間的通信載體。利用Intent對象我們能夠非常方便的實現不同組件之間的通信。一個Intent對象就是一組信息,這些信息都是通過其Component、Action、Category、Data、Extra和Flag這7種屬性體現的。Intent代表了Android應用的啟動"意圖"。Android應用將會依據Intent來啟動指定組件,至于究竟啟動哪個組件,則取決于Intent的屬性。
? 1.Action屬性 ? ? Action屬性為一個普通的字符串,它代表了該Intent對象要完畢一個什么樣的"動作"。當我們為Intent對象指明了一個action時,被啟動的組件就會按照這個動作的指示表現出對應的行為。比方查看、撥打、編輯等,須要注意的是一個組件(如Activity)僅僅能有一個action。我們能夠方便自己的應用程序組件之間的通信,自己定義action的(字符串)創建新的動作。也能夠直接使用Intent類中的靜態成員變量。比方ACTION_VIEW,ACTION_PICK,它們是Android中為action屬性提前定義的一批action變量。 在設置Intent對象Action屬性時,有兩種: (1)自己定義字符串 public final String CUSTOME_ACTION="intent.action.CUSTOME_JIANG";//字符串能夠隨意 Intent intent=new Intent(); intent.setAction(ActionAttr.CUSTOME_ACTION); //注意:ActionAttr為我們創建的類,也能夠使用this.CUSTOME_ACTION (2)使用系統預定action常量 Intent intent=new Intent(); intent.setAction(Intent.ACTION_CALL); //當中ACTION_CALL為Intent類的靜態成員變量,能夠類直接調用//相應字符串"android.intent.action.CALL" 2.Data屬性 ? ?Action屬性為Intent對象描寫敘述了一個"動作",那么Data屬性就為Intent對象的Action屬性提供了操作的數據。這里須要注意的是,Data屬性僅僅接受一個Uri對象,一個Uri對象通常通過例如以下形式的字符串來表示:
Uri字符串格式:scheme://host:port/path 舉例: content://com.android.contacts/contacts/1或tel://18819463209 在設置Intent對象Data屬性時能夠這樣: Intent intent=new Intent(); String data="content://com.android.contacts/contacts/1"; Uri uri=Uri.parse(data);//將字符串轉換為Uri intent.setData(uri); 或者 Intent intent=new Intent(); intent.setData(Uri.parse("content://com.android.contacts/contacts/1"));?博主筆記1:action屬性和data屬性為Intent所傳遞信息的主要部分,action/data屬性舉例: ACTION_VIEW content://contacts/people/1 -- 傳遞的信息:?顯示?號碼為1的人相關信息 ACTION_DIAL content://contacts/people/1 --?傳遞的信息:給編號為1的人?打?電話 ACTION_VIEW tel:123 -- 傳遞的信息:將號碼123?顯示 ACTION_DIAL tel:123 --傳遞的信息:??撥打?號碼123 ACTION_EDIT content://contacts/people/1 --?傳遞的信息:?編輯編號為1的聯系人 ACTION_VIEW content://contacts/people/ --?傳遞的信息:列出顯示全部聯系人.假設希望在查看某個聯系人,須要定義一個新的intent而且屬性設置為{ ACTION_VIEW content://contacts/N } 傳遞到一個新的Activity。 總結:action屬性、data屬性是intent的主要屬性。
3.Catagory屬性 ? ? 通過Action。配合Data或Type屬性能夠準確的表達出一個完整的意圖了。但為了使的"意圖"更加精確,我們也給意圖加入一些約束,這個約束由"意圖"的Catagory屬性實現。一個意圖僅僅能指定一個action屬性,可是能夠加入一個或多個Catagory屬性。
Category屬性能夠自己定義字符串實現。但為了方便不同應用之間的通信還能夠設置系統提前定義的Category常量。
調用方法addCategory 用來為Intent 加入一個Category。方法removeCategory 用來移除一個Category;getCategories方法返回已定義的Category。 在設置Intent對象Categoty屬性時能夠這樣: (1)自己定義字符串 public final String CUSTOME_CATEGORY="intent.action.CUSTOME_CATEGORY";//字符串能夠隨意 Intent intent=new Intent(); intent.addCategory(ActionAttr.CUSTOME_CATEGORY); (2)使用系統預定action、category常量下面代碼實現當點擊某個button時,通過Intent對象實現返回HOME桌面。Intent intent=new Intent(); intent.setAction(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_HOME);//返回Home桌面
博主筆記2:一般來說Action屬性和Category屬性都是同一時候使用的。
在Android中,全部應用主Activity(就是單獨啟動時候。第一個執行的那個Activity...)。都須要能夠接受一個Category為 CATEGORY_LAUNCHER,Action為ACTION_Main的意圖。
對于發出"意圖"的組件。我們能夠通過setAction()、addCategory()方法為"意圖"加入action屬性或者同一時候加入Action、Category屬性;對于接收"意圖"的組件,在AndroidManifest.xm文件里,我們能夠這樣設置:
<application ? ? ? ? android:allowBackup="true" ? ? ? ? android:icon="@drawable/ic_launcher" ? ? ? ? android:label="@string/app_name" ? ? ? ? android:theme="@style/AppTheme" > ? ? ? ? <activity ? ? ? ? ? ??android:name=".ActionCateAttr" ? ? ? ? ? ? android:label="第一個Activity界面" > ? ? ? ? ? ? <intent-filter> ? ? ? ? ? ? ? ??<action android:name="android.intent.action.MAIN" /> ? ? ? ? ? ?//默認Action ? ? ? ? ? ? ? ??<category android:name="android.intent.category.LAUNCHER" /> ? ?//默認Category ? ? ? ? ? ? </intent-filter> ? ? ? ? </activity> ? ? ? ? ? ? ? <activity ? ? ? ? ? ??android:name=".SecondaryActivity" ? ? ? ? ? ? android:label="第二個Activity界面" > ? ? ? ? ? ? <intent-filter> ? ? ? ? ? ? ? ? <action android:name="intent.action.JIANG_ACTION" /> ? ? ? ? ? ? ? ? <category android:name="intent.action.JIANG_CATEGORY" /> ? ? ? ? ? ? ? ??<category android:name="android.intent.category.DEFAULT" /> ? ?//默認Category ? ? ? ? ? ? </intent-filter> ? ? ? ? </activity> 凝視:發出"意圖"的Activity將Category為 CATEGORY_LAUNCHER,Action為ACTION_Main,接收"意圖"的Activity須設置一個默認的Category屬性CATEGORY_DEFAULT,這里不能將其設置為CATEGORY_LAUNCHER否者會報錯。另外,
假設我們使用了系統提前定義的action常量,則須要在AndroidManifest.xm文件里加入對應的權限,這方面的內容我們將在第二部分講到。4.Type屬性 Type屬性用于指定該Data所指定Uri相應的MIME類型,這種類型能夠是不論什么自己定義的MIME類型。僅僅要符合abc/xyz格式的字符串就可以。這里需要注意的是。Type屬性和Data屬性通常會出現相互覆蓋的情況,假設希望Intent既有Data屬性也有Type屬性,必須通過setDataAndType()方法來實現。對于Type屬性的理解。我記得有篇博文是這樣作比方的:說了Data,就必需要提Type,非常多時候,會有人誤解,覺著Data和Type的區別,就宛如泡妞和泡馬子之間的區別一樣,微乎其微。
但事實上不然,Type信息。是用MIME來表示的,比方text/plain。這種東西。
講到這里。兩者區別就非常清晰了,Data就是門牌號,指明了詳細的位置。詳細問題詳細分析。而type,則是強調物以類聚,解決一批量的問題。實際的樣例是這種。比方,從某個應用撥打一個電話,會發起的是action為ACTION_DIAL且data為tel:xxx這種Intent。相應的人類語言就是撥打xxx的電話。非常具象。而假設使用type,就寬泛了很多,比方瀏覽器收到一個未知的MIME類型的數據(比方一個視頻...),就會放出這種Intent。求系統的其它應用來幫助,表達成自然語言應該就是:查看pdf類文檔,這種。
博主筆記3:MIME類型? ? ? MIME(Multipurpose Internet Mail Extensions)多用途互聯網郵件擴展類型就是設定某種擴展名的文件用一種應用程序來打開的方式類型,當該擴展名文件被訪問的時候,瀏覽器會自己主動使用指定應用程序來打開。多用于指定一些client自己定義的文件名稱。以及一些媒體文件打開方式。
最早的HTTP協議中,并沒有附加的數據類型信息,全部傳送的數據都被客戶程序解釋為超文本標記語言HTML 文檔,而為了支持多媒體數據類型,HTTP協議中就使用了附加在文檔之前的MIME數據類型信息來標識數據類型。
MIME意為多功能Internet郵件擴展,它設計的最初目的是為了在發送電子郵件時附加多媒體數據,讓郵件客戶程序能依據其類型進行處理。
然而當它被HTTP協議支持之后。它的意義就更為顯著了。
它使得HTTP傳輸的不僅是普通的文本,而變得豐富多彩。每一個MIME類型由兩部分組成,前面是
數據的大類別,比如聲音audio、圖象image等,后面定義詳細的種類。 常見的MIME類型(通用型): 超文本標記語言文本 .html?text/html xml文檔 .xml text/xml XHTML文檔 .xhtml application/xhtml+xml 普通文本 .txt text/plain RTF文本 .rtf application/rtf PDF文檔 .pdf application/pdf Microsoft Word文件 .word application/msword PNG圖像 .png image/png GIF圖形 .gif image/gif JPEG圖形 .jpeg,.jpg image/jpeg au聲音文件 .au audio/basic MIDI音樂文件 mid,.midi audio/midi,audio/x-midi RealAudio音樂文件 .ra, .ram audio/x-pn-realaudio MPEG文件 .mpg,.mpeg video/mpeg AVI文件 .avi video/x-msvideo GZIP文件 .gz application/x-gzip TAR文件 .tar application/x-tar 隨意的二進制數據 application/octet-stream5.Ertras屬性 ? 通過上面的這些項。識別問題,基本完美攻克了,剩下一個重要的問題。就是傳參。Extras是用來做這個事情的,它是一個Bundle 類的對象,有一組可序列化的key/value對組成。
每個Action都會有與之相應的key和value類型約定
。發起Intent的時候,須要依照要求把Data不能表示的額外參數放入Extras中。 6.Flags屬性 ? ?能識別,有輸入。整個Intent基本就完整了。但另一些附件的指令,須要放在Flags中帶過去。顧名思義,Flags是一個整形數,有一些列的標志 位構成,這些標志,是用來指明執行模式的。比方,你期望這個意圖的執行者,和你執行在兩個全然不同的任務中(或說進程也無妨吧...),就須要設置FLAG_ACTIVITY_NEW_TASK 的標志位。
7.Component屬性 ? ? 通常來說,"意圖"可分為顯示intent和隱式intent。Intent Filters它是用來描寫敘述一個Activity或 Serveice等組件,我們通過在組件AndroidManifest.xml中<i
ntent-ilters/>元素中加入<action/>等屬性。以滿足期望可以響應怎么樣的Intent,這樣的沒有指明要啟動組件名方式就稱之為隱式intent。當然,我們也可以使"意圖"實現啟動指定的組件,即稱之為顯示intent,主要通過Component屬性來實現。Intent的Component屬性須要接受一個ComponentName對象,這個對實現將要啟動指定組件的類名、類所在的包名綁定在intent上。
ComponentName comp=new ComponentName(ComponentAttr.this,SecondaryActivity.class); Intent intent=new Intent(); intent.setComponent( comp);//設置intent的Component屬性,指定"意圖"要啟動組件的包和類名 凝視:第一句用于創建一個ComponentName對象,來指定包名和類型-這就能夠唯一地確定一個組件類。 四、Intent相關類 1.Activity類 ? ?這里我們僅僅需學習使用Intent啟動Activity組件將要用的的方法| void | startActivity(Intent intent) 作用:啟動Activity,詳細啟動哪個Activity和怎么樣啟動由intent屬性決定 |
| void | startActivityForResult(Intent intent, int requestCode) 作用:啟動Activity,并返回一個結果。當被啟動的Activity退出時。會調用?onActivityResult()?方法并向其傳入一個?requestCode參數,這個?requestCode參數為非負數(>0)。作用是標志是哪個Activity組件發出的"意圖",須要注意的是假設?requestCode小于0時,這種方法的僅僅能用于啟動一個Activity而不能返回值了。另外,Intent的action屬性設為可以返回一個結果,假設設置為?Intent.ACTION_MAIN?or?Intent.ACTION_VIEW。也是不能獲取結果的。 |
| | Intent():創建一個空的構造函數 ? ? ?Intent(Intent?o) ? ? :拷貝構造函數 |
| | Intent(String?action) ?:創建一個具有acion屬性的意圖對象 |
| | Intent(String?action,?Uri?uri):創建一個帶action屬性的意圖。接受一個Uri對象 |
| | Intent(Context?packageContext,?Class<? > cls):創建一個已經指定組件的意圖 |
| | Intent(String?action,?Uri?uri,?Context?packageContext,?Class<?> cls) 為一個指定的組件創建一個帶action和data屬性的意圖 |
| Intent | addCategory(String?category) Add a new category to the intent. |
| Intent | addFlags(int flags) Add additional flags to the intent?(or with existing flags value). |
| String | getAction() Retrieve the general action?to be performed, such as?ACTION_VIEW. |
| Set<String> | getCategories() Return the set of all categories in the intent. |
| ComponentName | getComponent() Retrieve the concrete component associated with the intent. |
| Uri | getData() Retrieve data this intent is operating on. |
| Bundle | getExtras() Retrieves a map of extended data from the intent. |
| int | getFlags() Retrieve any special flags associated with this intent. |
| static?Intent | getIntent(String?uri) This method was deprecated in API level 4. Use?parseUri(String, int)?instead. |
| String | getPackage() Retrieve the application package name this Intent is limited to. |
| String | getScheme() Return the scheme portion of the intent's data. |
| Intent | getSelector() Return the specific selector associated with this Intent. |
| Rect | getSourceBounds() Get the bounds of the sender of this intent, in screen coordinates. |
| String | getType() Retrieve any explicit MIME type included in the intent. |
| boolean | hasCategory(String?category) Check if a category exists in the intent. |
| boolean | hasExtra(String?name) Returns true if an extra value is associated with the given name. |
| static?Intent | makeMainActivity(ComponentName?mainActivity) Create an intent to launch the main (root) activity of a task. |
| static?Intent | makeMainSelectorActivity(String?selectorAction,?String?selectorCategory) Make an Intent for the main activity of an application, without specifying a specific activity to run but giving a selector to find the activity. |
| static?Intent | parseIntent(Resources?resources,?XmlPullParser?parser,?AttributeSet?attrs) Parses(解析) the "intent" element (and its children) from XML and instantiates an Intent object. |
| static?Intent | parseUri(String?uri, int flags) Create an intent from a URI. |
| Intent | putExtra(String?name, int value) Add extended data to the intent. |
| Intent | putExtra(String?name,?CharSequence?value) Add extended data to the intent. |
| Intent | setAction(String?action) Set the general action to be performed. |
| Intent | setClass(Context?packageContext,?Class<?> cls) Convenience for calling?setComponent(ComponentName)?with the name returned by a?Class?object. |
| Intent | setClassName(Context?packageContext,?String?className) Convenience for calling?setComponent(ComponentName)?with an explicit class name. |
| Intent | setClassName(String?packageName,?String?className) Convenience for calling?setComponent(ComponentName)?with an explicit application package name and class name. |
| Intent | setComponent(ComponentName?component) (Usually optional) Explicitly set the component to handle the intent. |
| Intent | setData(Uri?data) Set the data this intent is operating on. |
| Intent | setFlags(int flags) Set special flags controlling how this intent is handled. |
| Intent | setPackage(String?packageName) (Usually optional) Set an explicit application package name that limits the components this Intent will resolve to. |
| void | setSourceBounds(Rect?r) Set the bounds of the sender of this intent, in screen coordinates. |
| Intent | setType(String?type) Set an explicit MIME data type. |
| String | toString() Returns a string containing a concise(簡潔), human-readable (可讀)description of this object. |
| String | toUri(int flags) Convert this Intent into a String holding a URI representation of it. |
- ACTION_MAIN? ? ? ? ? ?//傳遞返回到主Activity動作
- ACTION_VIEW? ? ? ? ? ?//傳遞顯示動作
- ACTION_ATTACH_DATA
- ACTION_EDIT? ? ? ? ? ?//傳遞編輯動作
- ACTION_PICK? ? ? ??
- ACTION_CHOOSER? ? ? ? //傳遞選擇動作
- ACTION_GET_CONTENT
- ACTION_DIAL
- ACTION_CALL
- ACTION_SEND
- ACTION_SENDTO
- ACTION_ANSWER? ? ? ? ?//傳遞接聽電話動作
- ACTION_INSERT
- ACTION_DELETE
- ACTION_RUN
- ACTION_SYNC
- ACTION_PICK_ACTIVITY
- ACTION_SEARCH
- ACTION_WEB_SEARCH
- ACTION_FACTORY_TEST
- ACTION_TIME_TICK
- ACTION_TIME_CHANGED
- ACTION_TIMEZONE_CHANGED
- ACTION_BOOT_COMPLETED
- ACTION_PACKAGE_ADDED
- ACTION_PACKAGE_CHANGED
- ACTION_PACKAGE_REMOVED
- ACTION_PACKAGE_RESTARTED
- ACTION_PACKAGE_DATA_CLEARED
- ACTION_UID_REMOVED
- ACTION_BATTERY_CHANGED
- ACTION_POWER_CONNECTED
- ACTION_POWER_DISCONNECTED
- ACTION_SHUTDOWN
- CATEGORY_DEFAULT
- CATEGORY_BROWSABLE
- CATEGORY_TAB
- CATEGORY_ALTERNATIVE
- CATEGORY_SELECTED_ALTERNATIVE
- CATEGORY_LAUNCHER
- CATEGORY_INFO
- CATEGORY_HOME
- CATEGORY_PREFERENCE
- CATEGORY_TEST
- CATEGORY_CAR_DOCK
- CATEGORY_DESK_DOCK
- CATEGORY_LE_DESK_DOCK
- CATEGORY_HE_DESK_DOCK
- CATEGORY_CAR_MODE
- CATEGORY_APP_MARKET
- EXTRA_ALARM_COUNT
- EXTRA_BCC
- EXTRA_CC
- EXTRA_CHANGED_COMPONENT_NAME
- EXTRA_DATA_REMOVED
- EXTRA_DOCK_STATE
- EXTRA_DOCK_STATE_HE_DESK
- EXTRA_DOCK_STATE_LE_DESK
- EXTRA_DOCK_STATE_CAR
- EXTRA_DOCK_STATE_DESK
- EXTRA_DOCK_STATE_UNDOCKED
- EXTRA_DONT_KILL_APP
- EXTRA_EMAIL
- EXTRA_INITIAL_INTENTS
- EXTRA_INTENT
- EXTRA_KEY_EVENT
- EXTRA_ORIGINATING_URI
- EXTRA_PHONE_NUMBER
- EXTRA_REFERRER
- EXTRA_REMOTE_INTENT_TOKEN
- EXTRA_REPLACING
- EXTRA_SHORTCUT_ICON
- EXTRA_SHORTCUT_ICON_RESOURCE
- EXTRA_SHORTCUT_INTENT
- EXTRA_STREAM
- EXTRA_SHORTCUT_NAME
- EXTRA_SUBJECT
- EXTRA_TEMPLATE
- EXTRA_TEXT
- EXTRA_TITLE
- EXTRA_UID
- getFlags()
- addFlags(int)
- FLAG_GRANT_READ_URI_PERMISSION
- FLAG_GRANT_WRITE_URI_PERMISSION
- FLAG_GRANT_PERSISTABLE_URI_PERMISSION
- FLAG_GRANT_PREFIX_URI_PERMISSION
- FLAG_DEBUG_LOG_RESOLUTION
- FLAG_FROM_BACKGROUND
- FLAG_ACTIVITY_BROUGHT_TO_FRONT
- FLAG_ACTIVITY_CLEAR_TASK
- FLAG_ACTIVITY_CLEAR_TOP
- FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET
- FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
- FLAG_ACTIVITY_FORWARD_RESULT
- FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY
- FLAG_ACTIVITY_MULTIPLE_TASK
- FLAG_ACTIVITY_NEW_DOCUMENT
- FLAG_ACTIVITY_NEW_TASK
- FLAG_ACTIVITY_NO_ANIMATION
- FLAG_ACTIVITY_NO_HISTORY
- FLAG_ACTIVITY_NO_USER_ACTION
- FLAG_ACTIVITY_PREVIOUS_IS_TOP
- FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
- FLAG_ACTIVITY_REORDER_TO_FRONT
- FLAG_ACTIVITY_SINGLE_TOP
- FLAG_ACTIVITY_TASK_ON_HOME
- FLAG_RECEIVER_REGISTERED_ONLY
總結
以上是生活随笔為你收集整理的Android笔记一.深入理解Intent和IntentFilters(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [MAC OS] 常用工具
- 下一篇: WordPress中的cookie 机制