Intent 可以啟動activity,service,broadcast receiver,intent 可以指定action跟data,action是指要做什麼樣的事,例如打電話或編輯文章,data則是指此action boundle在一起的資料內容,以URI格式表示。
Intent分成兩種,implicit intent與explicit intent,明確的intent表示指定要啟動的activity,而implicit intent,則是透過設定intent-filter讓系統有能力解析最適合的activity或service等,intent要由哪個應用程式接收,有三種比對的filter,分別是<action>,<category>,<data>。,而implicit intent自動加入CATEGORY_DEFAULT,如果intent-filter中沒有android.intent.category
.DEFAULT,則match就會失敗,所以要讓activity或service接收implicit intent就必須要加入android.intent.category.DEFAULT。
intent-filter 可以被包在 activity,service,receiver中
<intent-filter android:icon="drawable resource" android:label="string resource" android:priority="integer"> <action android:name="string" /> //可以有很多action,只要其中一項符合即可,如果intent filter //沒有指定action,這此AP永不被執行,若intent沒有指定action //,則任何app的action filter皆符合此intent <category android:name="string" /> //若intent有設定Category,必須intent的每項category都通過filter設定 //的Category,若intent沒有設定Category,則都符合此intent <data android:name="string" /> //1.當filter內沒有設定任何data tag,而intent內也沒有設定URI與data type, //那這test就通過 //2.當filter有設定URI,沒有設定data type,而intent object也是只有URI沒有 //data type,這時候通過,這通常只會發生在mailto: 與tel: 時 //3.當filter內只有設定data type 沒有設定URI,而intent object有設定相同 //的data type無URI則通過 //4.當filter內設定的data type與URI都與intent Object內設定的對應即通過 //若filter內只有設定data type而URI不設定,只有在intent Object內的 //data type有對應,而URI為content: 或file:才會通過 </intent-filter>intent機制的好處是,要擴充功能只要發出intent,android就會去找最適合的應用程式,不需要在自己的應用程式裡加code。
網路上收集的intent範例(轉自http://ysl-paradise.blogspot.com/2008/12/intent.html)
顯示網頁
Uri uri = Uri.parse("http://google.com"); Intent it = new Intent(Intent.ACTION_VIEW, uri); startActivity(it);顯示地圖
Uri uri = Uri.parse("geo:38.899533,-77.036476"); Intent it = new Intent(Intent.ACTION_VIEW, uri); startActivity(it); //其他 geo URI 範例 //geo:latitude,longitude //geo:latitude,longitude?z=zoom //geo:0,0?q=my+street+address //geo:0,0?q=business+near+city //google.streetview:cbll=lat,lng&cbp=1,yaw,,pitch,zoom&mz=mapZoom路徑規劃
Uri uri = Uri.parse("http://maps.google.com/maps?f=d&saddr=startLat%20startLng&daddr=endLat%20endLng&hl=en"); Intent it = new Intent(Intent.ACTION_VIEW, uri); startActivity(it); //where startLat, startLng, endLat, endLng are a long with 6 decimals like: 50.123456撥打電話
//叫出撥號程式 Uri uri = Uri.parse("tel:0800000123"); Intent it = new Intent(Intent.ACTION_DIAL, uri); startActivity(it); //直接打電話出去 Uri uri = Uri.parse("tel:0800000123"); Intent it = new Intent(Intent.ACTION_CALL, uri); startActivity(it); //用這個,要在 AndroidManifest.xml 中,加上 //傳送 SMS/MMS
//叫起簡訊程式 Intent it = new Intent(Intent.ACTION_VIEW); it.putExtra("sms_body", "The SMS text"); it.setType("vnd.android-dir/mms-sms"); startActivity(it); //傳送簡訊 Uri uri = Uri.parse("smsto:0800000123"); Intent it = new Intent(Intent.ACTION_SENDTO, uri); it.putExtra("sms_body", "The SMS text"); startActivity(it); //傳送 MMS Uri uri = Uri.parse("content://media/external/images/media/23"); Intent it = new Intent(Intent.ACTION_SEND); it.putExtra("sms_body", "some text"); it.putExtra(Intent.EXTRA_STREAM, uri); it.setType("image/png"); startActivity(it); //如果是 HTC Sense 手機,你要用 Intent sendIntent = new Intent("android.intent.action.SEND_MSG"); sendIntent.putExtra("address", toText); sendIntent.putExtra(Intent.EXTRA_SUBJECT, "subject"); sendIntent.putExtra("sms_body", textMessage); sendIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse(url)); sendIntent.setType("image/jpeg"); startActivity(sendIntent); //底下這段更好,可在所有手機上用 //refer to http://stackoverflow.com/questions/2165516/sending-mms-into-different-android-devices Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.parse("mmsto:傳送 Email"); intent.putExtra("address", ); intent.putExtra("subject", ); startActivity(intent);
Uri uri = Uri.parse("mailto:xxx@abc.com"); Intent it = new Intent(Intent.ACTION_SENDTO, uri); startActivity(it); Intent it = new Intent(Intent.ACTION_SEND); it.putExtra(Intent.EXTRA_EMAIL, "me@abc.com"); it.putExtra(Intent.EXTRA_TEXT, "The email body text"); it.setType("text/plain"); startActivity(Intent.createChooser(it, "Choose Email Client")); Intent it=new Intent(Intent.ACTION_SEND); String[] tos={"me@abc.com"}; String[] ccs={"you@abc.com"}; it.putExtra(Intent.EXTRA_EMAIL, tos); it.putExtra(Intent.EXTRA_CC, ccs); it.putExtra(Intent.EXTRA_TEXT, "The email body text"); it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text"); it.setType("message/rfc822"); startActivity(Intent.createChooser(it, "Choose Email Client")); //傳送影音附件檔 Intent it = new Intent(Intent.ACTION_SEND); it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text"); it.putExtra(Intent.EXTRA_STREAM, Uri.parse("file:///sdcard/mysong.mp3")); it.setType("audio/mp3"); startActivity(Intent.createChooser(it, "Choose Email Client")); //傳送圖片附件檔 Intent it = new Intent(Intent.ACTION_SEND); it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text"); it.putExtra(Intent.EXTRA_STREAM, Uri.parse("file:///sdcard/mypic.jpg")); it.setType("image/jpeg"); startActivity(Intent.createChooser(it, "Choose Email Client"));顯示聯絡人清單
Intent it = new Intent(Intent.ACTION_VIEW, People.CONTENT_URI); startActivity(it);顯示某個朋友的詳細資料
Uri uriPerson = ContentUris.withAppendedId(People.CONTENT_URI, 5); //5 是朋友的 ID Intent it = new Intent(Intent.ACTION_VIEW, uriPerson); startActivity(it);播放多媒體
Intent it = new Intent(Intent.ACTION_VIEW); Uri uri = Uri.parse("file:///sdcard/song.mp3"); it.setDataAndType(uri, "audio/mp3"); startActivity(it); Uri uri = Uri.withAppendedPath(MediaStore.Audio.Media.INTERNAL_CONTENT_URI, "1"); Intent it = new Intent(Intent.ACTION_VIEW, uri); startActivity(it);從圖庫中回傳選到的圖片
Intent it = new Intent(Intent.ACTION_GET_CONTENT); it.addCategory(Intent.CATEGORY_OPENABLE); it.setType("image/*"); startActivityForResult(it, 0); //回傳的圖片可透過 it.getData() 取得圖片之 Uri啟動照相機,並將相片存在指定的檔案中
Intent it = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); //假設你要將相片存在 /sdcard/xxx.jpg 中 File f = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/xxx.jpg"); it.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f)); startActivity(it, 0);Market 相關
//尋找某個應用程式 Uri uri = Uri.parse("market://search?q=pname:pkg_name"); Intent it = new Intent(Intent.ACTION_VIEW, uri); startActivity(it); //where pkg_name is the full package path for an application //顯示某應用程式詳細畫面 Uri uri = Uri.parse("market://details?id=pkg_name_or_app_id"); Intent it = new Intent(Intent.ACTION_VIEW, uri); startActivity(it); //where app_id is the application ID, find the ID //by clicking on your application on Market home //page, and notice the ID from the address barUninstall 應用程式
Uri uri = Uri.fromParts("package", strPackageName, null); Intent it = new Intent(Intent.ACTION_DELETE, uri); startActivity(it);安裝 APK 檔
Uri uri = Uri.parse("url_of_apk_file"); Intent it = new Intent(Intent.ACTION_VIEW, uri); it.setData(uri); it.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); it.setClassName("com.android.packageinstaller", "com.android.packageinstaller.PackageInstallerActivity"); startActivity(it); //make sure the url_of_apk_file is readable for all users
沒有留言:
張貼留言