1 Intent的中文意思是“意圖,目的”的意思,可以理解為不同組件之間通信的“媒介”或者“信使”。 2 3 目標組件一般要通過Intent來聲明自己的條件,一般通過組件中的<intent-filter>元素來過濾。 4 5 Intent在由以下幾個部分組成:動作(action),數據(data),分類(Category),類型(Type),組件(Component),和擴展信息(Extra)。 6 7 Intent在尋找目標組件的時候有兩種方法:第一,通過組件名稱直接指定;第二,通過Intent Filter過濾指定 8 9 Intent啟動不同組件的方法 10 組件名稱 方法名稱 11 Activity startActivity() startActivityForResult() 12 Service startService() bindService() 13 Broadcasts sendBroadcast() sendOrderedBroadcast() sendStickyBroadcast() 14 15 16 常見的Activity Action Intent常量 17 常量名稱 常量值 意義 18 ACTION_MAIN android.intent.action.MAIN 應用程序入口 19 ACTION_VIEW android.intent.action.VIEW 顯示數據給用戶 20 ACTION_ATTACH_DATA android.intent.action.ATTACH_DATA 指明附加信息給其他地方的一些數據 21 ACTION_EDIT android.intent.action.EDIT 顯示可編輯的數據 22 ACTION_PICK android.intent.action.PICK 選擇數據 23 ACTION_CHOOSER android.intent.action.CHOOSER 顯示一個Activity選擇器 24 ACTION_GET_CONTENT android.intent.action.GET_CONTENT 獲得內容 25 ACTION_DIAL android.intent.action.GET_CONTENT 顯示打電話面板 26 ACITON_CALL android.intent.action.DIAL 直接打電話 27 ACTION_SEND android.intent.action.SEND 直接發短信 28 ACTION_SENDTO android.intent.action.SENDTO 選擇發短信 29 ACTION_ANSWER android.intent.action.ANSWER 應答電話 30 ACTION_INSERT android.intent.action.INSERT 插入數據 31 ACTION_DELETE android.intent.action.DELETE 刪除數據 32 ACTION_RUN android.intent.action.RUN 運行數據 33 ACTION_SYNC android.intent.action.SYNC 同步數據 34 ACTION_PICK_ACTIVITY android.intent.action.PICK_ACTIVITY 選擇Activity 35 ACTION_SEARCH android.intent.action.SEARCH 搜索 36 ACTION_WEB_SEARCH android.intent.action.WEB_SEARCH Web搜索 37 ACTION_FACTORY_TEST android.intent.action.FACTORY_TEST 工廠測試入口點 38 39 40 常見的BroadcastIntent Action常量 BroadcastIntent 41 Action字符串常量 描述 42 ACTION_TIME_TICK 系統時間每過一分鍾發出的廣播 43 ACTION_TIME_CHANGED 系統時間通過設置發生了變化 44 ACTION_TIMEZONE_CHANGED 時區改變 45 ACTION_BOOT_COMPLETED 系統啟動完畢 46 ACTION_PACKAGE_ADDED 新的應用程序apk包安裝完畢 47 ACTION_PACKAGE_CHANGED 現有應用程序apk包改變 48 ACTION_PACKAGE_REMOVED 現有應用程序apk包被刪除 49 ACTION_UID_REMOVED 用戶id被刪除 50 51 52 Intent的Action和Data屬性匹配 53 Action屬性 Data屬性 說明 54 ACTION_VIEW content://contacts/people/1 顯示id為1的聯系人信息 55 ACTION_DIAL content://contacts/people/1 將id為1的聯系人電話號碼顯示在撥號界面中 56 ACITON_VIEW tel:123 顯示電話為123的聯系人信息 57 ACTION_VIEW http://www.google.com 在瀏覽器中瀏覽該網站 58 ACTION_VIEW file://sdcard/mymusic.mp3 播放MP3 59 ACTION_VIEW geo:39.2456,116.3523 顯示地圖 60 61 62 常見的Category常量 63 Category字符串常量 描述 64 CATEGORY_BROWSABLE 目標Activity能通過在網頁瀏覽器中點擊鏈接而激活(比如,點擊瀏覽器中的圖片鏈接) 65 CATEGORY_GADGET 表示目標Activity可以被內嵌到其他Activity當中 66 CATEGORY_HOME 目標Activity是HOME Activity,即手機開機啟動后顯示的Activity,或按下HOME鍵后顯示的Activity 67 CATEGORY_LAUNCHER 表示目標Activity是應用程序中最優先被執行的Activity 68 CATEGORY_PREFERENCE 表示目標Activity是一個偏愛設置的Activity 69 70 71 常見的Extra常量 72 Extra鍵值字符串常量 描述 73 EXTRA_BCC 裝有郵件密送地址的字符串數組 74 EXTRA_CC 裝有郵件抄送地址的字符串數組 75 EXTRA_EMAIL 裝有郵件發送地址的字符串數組 76 EXTRA_INTENT 使用ACTION_PICK_ACTIVITY動作時裝有Intent選項的鍵 77 EXTRA_KEY_EVENT 觸發該Intent的案件的KeyEvent對象 78 EXTRA_PHONE_NUMBER 使用撥打電話相關的Action時,電話號碼字符串的鍵,類型為String 79 EXTRA_SHORTCUT_ICON 使用ACTION_CREATE_SHORTCUT在HomeActivity創建快捷方式時,對快捷方式的描述信息。 80 其中ICON和ICON_RESOURCE描述的是快捷方式的圖標,類型分別為Bitmap和ShortcutIconResource。INTENT描述的是快捷方式相對應的Intent對象。NAME描述的是快捷方式的名字。 81 EXTRA_SHORTCUT_ICON_RESOURCE EXTRA_SHORTCUT_INTENT EXTRA_SHORTCUT_NAME EXTRA_SUBJECT 描述信息主題的鍵 82 EXTRA_TEXT 使用ACTION_SEND動作時,用來描述要發送的文本信息,類型為CharSequence 83 EXTRA_TITLE 使用ACTION_CHOOSER動作時,描述對話框標題的鍵,類型為CharSequence 84 EXTRA_UID 使用ACTION_UID_REMOVED動作時,描述刪除的用戶id的鍵,類型為int 85 86 87 Android.telephony包中的類 88 類名 描述 89 CellLocation 表示設備位置的抽象類 90 PhoneNumberFormattingTextWather 監視一個TextView控件,如果有電話號碼輸入,則用formatNumber()方法處理電話號碼 91 PhoneNumberUtils 包含各種處理電話號碼字符串的使用工具 92 PhoneStateListener 監視手機中電話狀態變化的監聽類 93 ServiceState 包含電話狀態和相關的服務信息 94 TelephonyManager 提供對手機中電話服務信息的訪問 95 96 97 與短信服務相關的類主要在包android.telephony.gsm中 98 類名 描述 99 GsmCellLocation 表示GSM手機的基站位置 100 SmsManager 管理各種短信操作 101 SmsMessage 表示具體的短信 102 103 104 1.Intent的用法: 105 (1)用Action跳轉 106 1、使用Action跳轉,如果有一個程序的AndroidManifest.xml中的某一個 Activity的IntentFilter段中 定義了包含了相同的Action那么這個Intent就與這個目標Action匹配。如果這個IntentFilter段中沒有定義 Type,Category,那么這個 Activity就匹配了。但是如果手機中有兩個以上的程序匹配,那么就會彈出一個對話可框來提示說明。 107 Action 的值在Android中有很多預定義,如果你想直接轉到你自己定義的Intent接收者,你可以在接收者的IntentFilter 中加入一個自定義的Action值(同時要設定 Category值為"android.intent.category.DEFAULT"),在你的Intent中設定該值為Intent的 Action,就直接能跳轉到你自己的Intent接收者中。因為這個Action在系統中是唯一的。 108 2,data/type,你可以用Uri 來做為data,比如Uri uri = Uri.parse(http://www.google.com); 109 Intent i = new Intent(Intent.ACTION_VIEW,uri);手機的Intent分發過程中,會根據http://www.google.com 的scheme判斷出數據類型type 。手機的Brower則能匹配它,在Brower的Manifest.xml中的IntenFilter中 首先有ACTION_VIEW Action,也能處理http:的type, 110 3, 至於分類Category,一般不要去在Intent中設置它,如果你寫Intent的接收者,就在Manifest.xml的Activity的 IntentFilter中包含android.category.DEFAULT,這樣所有不設置 Category(Intent.addCategory(String c);)的Intent都會與這個Category匹配。 111 4,extras(附 加信息),是其它所有附加信息的集合。使用extras可以為組件提供擴展信息,比如,如果要執行“發送電子郵件”這個動 作,可以將電子郵件的標題、正文等保存在extras里,傳給電子郵件發送組件。 112 (2)用類名跳轉 113 Intent負責對應用中一次操作的動作、動作涉及數據、附加數據進行描 述,Android則根據此Intent的描述, 負責找到對應的組件,將 Intent傳遞給調用的組件,並完成組件的調用。Intent在這里起着實現調用者與被調用者之間的解耦作用。Intent傳遞過程中,要找 到目標消費者(另一個Activity,IntentReceiver或Service),也就是Intent的響 應者。 114 Intent intent = new Intent(); 115 intent.setClass(context, targetActivy.class); 116 //或者直接用 Intent intent = new Intent(context, targetActivity.class); 117 118 startActivity(intent); 119 不過注意用類名跳轉,需要在AndroidManifest.xml中申明activity 120 <activity android:name="targetActivity"></activity> 121 2.幾種Intent的用法 122 android 中intent是經常要用到的。不管是頁面牽轉,還是傳遞數據,或是調用外部程序,系統功能都要用到intent。在做了一些intent的例子之后,整理了一下intent,希望對大家有用。由於intent內容太多,不可能真的寫全,難免會有遺落,以后我會隨時更新。如果你們有疑問或新的intent內容,希望交流。 123 ★intent大全: 124 1.從google搜索內容 125 Intent intent = new Intent(); 126 intent.setAction(Intent.ACTION_WEB_SEARCH); 127 intent.putExtra(SearchManager.QUERY,"searchString") 128 startActivity(intent); 129 130 2.瀏覽網頁 131 Uri uri = Uri.parse("http://www.google.com"); 132 Intent it = new Intent(Intent.ACTION_VIEW,uri); 133 startActivity(it); 134 135 3.顯示地圖 136 Uri uri = Uri.parse("geo:38.899533,-77.036476"); 137 Intent it = new Intent(Intent.Action_VIEW,uri); 138 startActivity(it); 139 140 4.路徑規划 141 Uri uri = Uri.parse("http://maps.google.com/maps?f=dsaddr=startLat%20startLng&daddr=endLat%20endLng&hl=en"); 142 Intent it = new Intent(Intent.ACTION_VIEW,URI); 143 startActivity(it); 144 145 5.撥打電話 146 Uri uri = Uri.parse("tel:xxxxxx"); 147 Intent it = new Intent(Intent.ACTION_DIAL, uri); 148 startActivity(it); 149 150 6.調用發短信的程序 151 Intent it = new Intent(Intent.ACTION_VIEW); 152 it.putExtra("sms_body", "The SMS text"); 153 it.setType("vnd.android-dir/mms-sms"); 154 startActivity(it); 155 156 7.發送短信 157 Uri uri = Uri.parse("smsto:0800000123"); 158 Intent it = new Intent(Intent.ACTION_SENDTO, uri); 159 it.putExtra("sms_body", "The SMS text"); 160 startActivity(it); 161 String body="this is sms demo"; 162 Intent mmsintent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts("smsto", number, null)); 163 mmsintent.putExtra(Messaging.KEY_ACTION_SENDTO_MESSAGE_BODY, body); 164 mmsintent.putExtra(Messaging.KEY_ACTION_SENDTO_COMPOSE_MODE, true); 165 mmsintent.putExtra(Messaging.KEY_ACTION_SENDTO_EXIT_ON_SENT, true); 166 startActivity(mmsintent); 167 168 8.發送彩信 169 Uri uri = Uri.parse("content://media/external/images/media/23"); 170 Intent it = new Intent(Intent.ACTION_SEND); 171 it.putExtra("sms_body", "some text"); 172 it.putExtra(Intent.EXTRA_STREAM, uri); 173 it.setType("image/png"); 174 startActivity(it); 175 StringBuilder sb = new StringBuilder(); 176 sb.append("file://"); 177 sb.append(fd.getAbsoluteFile()); 178 Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts("mmsto", number, null)); 179 // Below extra datas are all optional. 180 intent.putExtra(Messaging.KEY_ACTION_SENDTO_MESSAGE_SUBJECT, subject); 181 intent.putExtra(Messaging.KEY_ACTION_SENDTO_MESSAGE_BODY, body); 182 intent.putExtra(Messaging.KEY_ACTION_SENDTO_CONTENT_URI, sb.toString()); 183 intent.putExtra(Messaging.KEY_ACTION_SENDTO_COMPOSE_MODE, composeMode); 184 intent.putExtra(Messaging.KEY_ACTION_SENDTO_EXIT_ON_SENT, exitOnSent); 185 startActivity(intent); 186 187 9.發送Email 188 Uri uri = Uri.parse("mailto:xxx@abc.com"); 189 Intent it = new Intent(Intent.ACTION_SENDTO, uri); 190 startActivity(it); 191 Intent it = new Intent(Intent.ACTION_SEND); 192 it.putExtra(Intent.EXTRA_EMAIL, "me@abc.com"); 193 it.putExtra(Intent.EXTRA_TEXT, "The email body text"); 194 it.setType("text/plain"); 195 startActivity(Intent.createChooser(it, "Choose Email Client")); 196 Intent it=new Intent(Intent.ACTION_SEND); 197 String[] tos={"me@abc.com"}; 198 String[] ccs={"you@abc.com"}; 199 it.putExtra(Intent.EXTRA_EMAIL, tos); 200 it.putExtra(Intent.EXTRA_CC, ccs); 201 it.putExtra(Intent.EXTRA_TEXT, "The email body text"); 202 it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text"); 203 it.setType("message/rfc822"); 204 startActivity(Intent.createChooser(it, "Choose Email Client")); 205 206 Intent it = new Intent(Intent.ACTION_SEND); 207 it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text"); 208 it.putExtra(Intent.EXTRA_STREAM, "file:///sdcard/mysong.mp3"); 209 sendIntent.setType("audio/mp3"); 210 startActivity(Intent.createChooser(it, "Choose Email Client")); 211 212 10.播放多媒體 213 Intent it = new Intent(Intent.ACTION_VIEW); 214 Uri uri = Uri.parse("file:///sdcard/song.mp3"); 215 it.setDataAndType(uri, "audio/mp3"); 216 startActivity(it); 217 Uri uri = Uri.withAppendedPath(MediaStore.Audio.Media.INTERNAL_CONTENT_URI, "1"); 218 Intent it = new Intent(Intent.ACTION_VIEW, uri); 219 startActivity(it); 220 221 11.uninstall apk 222 Uri uri = Uri.fromParts("package", strPackageName, null); 223 Intent it = new Intent(Intent.ACTION_DELETE, uri); 224 startActivity(it); 225 226 12.install apk 227 Uri installUri = Uri.fromParts("package", "xxx", null); 228 returnIt = new Intent(Intent.ACTION_PACKAGE_ADDED, installUri); 229 230 13. 打開照相機 231 <1>Intent i = new Intent(Intent.ACTION_CAMERA_BUTTON, null); 232 this.sendBroadcast(i); 233 <2>long dateTaken = System.currentTimeMillis(); 234 String name = createName(dateTaken) + ".jpg"; 235 fileName = folder + name; 236 ContentValues values = new ContentValues(); 237 values.put(Images.Media.TITLE, fileName); 238 values.put("_data", fileName); 239 values.put(Images.Media.PICASA_ID, fileName); 240 values.put(Images.Media.DISPLAY_NAME, fileName); 241 values.put(Images.Media.DESCRIPTION, fileName); 242 values.put(Images.ImageColumns.BUCKET_DISPLAY_NAME, fileName); 243 Uri photoUri = getContentResolver().insert( 244 MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); 245 246 Intent inttPhoto = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 247 inttPhoto.putExtra(MediaStore.EXTRA_OUTPUT, photoUri); 248 startActivityForResult(inttPhoto, 10); 249 250 14.從gallery選取圖片 251 Intent i = new Intent(); 252 i.setType("image/*"); 253 i.setAction(Intent.ACTION_GET_CONTENT); 254 startActivityForResult(i, 11); 255 256 15. 打開錄音機 257 Intent mi = new Intent(Media.RECORD_SOUND_ACTION); 258 startActivity(mi); 259 260 16.顯示應用詳細列表 261 Uri uri = Uri.parse("market://details?id=app_id"); 262 Intent it = new Intent(Intent.ACTION_VIEW, uri); 263 startActivity(it); 264 //where app_id is the application ID, find the ID 265 //by clicking on your application on Market home 266 //page, and notice the ID from the address bar 267 268 剛才找app id未果,結果發現用package name也可以 269 Uri uri = Uri.parse("market://details?id=<packagename>"); 270 這個簡單多了 271 272 17尋找應用 273 Uri uri = Uri.parse("market://search?q=pname:pkg_name"); 274 Intent it = new Intent(Intent.ACTION_VIEW, uri); 275 startActivity(it); 276 //where pkg_name is the full package path for an application 277 278 18打開聯系人列表 279 <1> 280 Intent i = new Intent(); 281 i.setAction(Intent.ACTION_GET_CONTENT); 282 i.setType("vnd.android.cursor.item/phone"); 283 startActivityForResult(i, REQUEST_TEXT); 284 285 <2> 286 Uri uri = Uri.parse("content://contacts/people"); 287 Intent it = new Intent(Intent.ACTION_PICK, uri); 288 startActivityForResult(it, REQUEST_TEXT); 289 290 19 打開另一程序 291 Intent i = new Intent(); 292 ComponentName cn = new ComponentName("com.yellowbook.android2", 293 "com.yellowbook.android2.AndroidSearch"); 294 i.setComponent(cn); 295 i.setAction("android.intent.action.MAIN"); 296 startActivityForResult(i, RESULT_OK); 297 298 20.調用系統編輯添加聯系人(高版本SDK有效): 299 Intent it = newIntent(Intent.ACTION_INSERT_OR_EDIT); 300 it.setType("vnd.android.cursor.item/contact"); 301 //it.setType(Contacts.CONTENT_ITEM_TYPE); 302 it.putExtra("name","myName"); 303 it.putExtra(android.provider.Contacts.Intents.Insert.COMPANY, "organization"); 304 it.putExtra(android.provider.Contacts.Intents.Insert.EMAIL,"email"); 305 it.putExtra(android.provider.Contacts.Intents.Insert.PHONE,"homePhone"); 306 it.putExtra(android.provider.Contacts.Intents.Insert.SECONDARY_PHONE, 307 "mobilePhone"); 308 it.putExtra( android.provider.Contacts.Intents.Insert.TERTIARY_PHONE, 309 "workPhone"); 310 it.putExtra(android.provider.Contacts.Intents.Insert.JOB_TITLE,"title"); 311 startActivity(it); 312 313 21.調用系統編輯添加聯系人(全有效): 314 Intent intent = newIntent(Intent.ACTION_INSERT_OR_EDIT); 315 intent.setType(People.CONTENT_ITEM_TYPE); 316 intent.putExtra(Contacts.Intents.Insert.NAME, "My Name"); 317 intent.putExtra(Contacts.Intents.Insert.PHONE, "+1234567890"); 318 intent.putExtra(Contacts.Intents.Insert.PHONE_TYPE,Contacts.PhonesColumns.TYPE_MOBILE); 319 intent.putExtra(Contacts.Intents.Insert.EMAIL, "com@com.com"); 320 intent.putExtra(Contacts.Intents.Insert.EMAIL_TYPE, Contacts.ContactMethodsColumns.TYPE_WORK); 321 startActivity(intent);
