embedded linux ,android

2010年11月3日 星期三

Intent 與 intent-filter

AndroidManifest.xml 向 framework 登記此AP,包含哪些activity,service等,所以android接獲intent時,就有資訊可以解析哪個應用程式最符合這個intent。

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:");   
intent.putExtra("address", );   
intent.putExtra("subject", );   
startActivity(intent);
傳送 Email
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 bar  
Uninstall 應用程式
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  

沒有留言:

張貼留言