activity + service + BroadcastReceiver + ContentProvider => Intent
文章來源~
http://ysl-paradise.blogspot.com/2008/12/intent.html
http://www.jollen.org/blog/2009/07/jollen-android-programming-26.html
什麼是Intent(意圖)?
強大的事件處理「Intent」(意圖)是Android很強大的一種機制。ntent(意圖)的作用與事件(event)很像,但與傳統的事件處理仍然有些差異。傳統的事件處理,講求的是「處理者(handler)的觸發」,當一事件發生時,便callback讓事件的處理者,或是直接將該事件轉送(forward)給應用程式,由應用程式決定處理方式。Android的做法是,讓每個意圖(Intent)都帶有一個動作(action),並根據不同的動作去行動。在「Intent」這樣的事件處理觀念裡,Android 試圖將事件解釋為「應用程式的意圖」或是「使用者的意圖」,並試著去解釋該意圖的目的,若 Android 系統本身能理解應用程式的意圖,便會「自行」去處理該意圖所應執行的工作。
I
The structure of intent include (Component Name, Action, Data, Categorg, Extra, Flag)
Android Component Name
i.e. target class
e.g. setComponent(), setClass(), setClassName and getComponent()
Android Action
ACTION_CALL i.e. call tel number
ACTION_EDIT
ACTION_MAIN
ACTION_SYNC
ACTION_VIEW: 使用Android內部定義的動作「ACTION_VIEW」,來「檢視」(view)一個「URL」資料,當框架看到內部定義的ACTION_VIEW動作時,便「自行」處理該Intent;處理的方式是啟動WebView並連上網“ACTION_VIEW”就可以很容易做出一個「啟動瀏覽器(WebView類別)上網」的應用程式
ACTION_DIAL
ACTION_SENDTO
現在,列舉以下三個情境,並分別實作其範例:
HelloIntentDialer: 啟動撥號器(dialer)並撥號
HelloIntentMusic: 使用者按下「Select Music」後,可以由音樂清單裡選擇音樂並撥放
HelloIntentWallpaper: 啟動Android內建的「背景圖選擇器」,讓使用者更換背景
第二個範例”HelloIntentMusic”其實是ApiDemo裡的範例,而且是很容易能了解Intent內涵的好程式。
除了action外,Intent還可以包含另外一項資訊「data」。
Intent的action指定這個Intent的「動作」是什麼,框架會依指定的動作進行處理;有些action可以附帶一筆資料,這個資料是以Uri的格式撰寫,在HelloIntentDialer的範例會再做說明。
內建的Intent有哪些呢?請參考Android Reference Guide中的Intent類別說明。上述三個範例分別使用以下三個action:
1. ACTION_CALL: 撥號
2. ACTION_GET_CONTENT: 啟動內容選取器
3. ACTION_SET_WALLPAPER: 設定Wallpaper
在進行範例講解前,可以先行閱讀Intent類別的說明。ACTION_CALL是一個內建的action,我們只要產生一個Intent物件,並定義其「action」為ACTION_CALL即可通知框架「打電話」。
Android內建的action是相當實用的應用開發機制,同時也是Android OS最具代表性的機制之一。Android內建的Intent action分為二種:
1. Activity Action: 啟動Activity的action
2. Broadcast Action: 透過廣撥器處理的action
第一種action是activity action,用途是通知框架啟動Activity,這裡提出的三個範例,都是使用activity action。Broadcast action將在Broadcast的教學裡再做說明。
Intent 應該算是 Andorid 中特有的東西。你可以在 Intent 中,指定要應用程式執行的動作 (view, edit, dial),以及應用程式執行該動作時,所需要的資料。都指定好後,只要透過 startActivity(),Android 系統會自動尋找,最符合你指定要求的應用程式,並喚起執行該應用程式。
不過,這部份的文件還不是很完整。Reference of Available Intents 有列一些。
開啟文字檔
1. Uri uri = Uri.parse(file:///sdcard/readme.txt);
2. Intent it = new Intent(Intent.ACTION_VIEW, uri);
3. it.setType("text/*");
4. startActivity(it);
顯示網頁
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
文章來源~
http://tomkuo139.blogspot.com/2010/04/android-open-file-with-default.html
Android 可以利用 Intent.ACTION_VIEW 來開啟檔案且執行之,
Intent intent = new Intent( Intent.ACTION_VIEW );
File f1 = new File( "/" + vDir + "/" + vFile );
// 檔名小寫, 容易判斷副檔名
String vlowerFileName = vFile.toLowerCase();
// 影片
if( vlowerFileName.endsWith("mpg")
|| vlowerFileName.endsWith("mp4")
)
intent.setDataAndType( Uri.fromFile(f1), "video/*" );
// 音樂
else if( vlowerFileName.endsWith("mp3") )
intent.setDataAndType( Uri.fromFile(f1), "audio/*" );
// 影像
else if( vlowerFileName.endsWith("bmp")
|| vlowerFileName.endsWith("gif")
|| vlowerFileName.endsWith("jpg")
|| vlowerFileName.endsWith("png")
)
intent.setDataAndType( Uri.fromFile(
沒有留言:
張貼留言