Intent的作用
Intent在android中可以用來請求一個動作,用於啓動另外一個控件,Intent可以啓動三種控件如下
啓動一個activity,可以使用startActivity(),如果你想啓動activity之後返回結果,那麼啓動的時候調用startActivityForResult(),然後當前的activity實現onActivityResult(),當被啓動的activity結束時,可以回調該方法,並返回結果
啓動一個service,service是一般用來在後臺進行一些操作,通過startService()方法來啓動service
啓動boardcast(廣播)通過調用sendBroadcast()
Intent的類型
- 顯示類型,顯示指定要啓動的控件的類型,通常用來啓動activity
Intent i = new Intent();
i.stClass(MainActivity.this,OtherActivity.class);
startActivity(i);
- 隱式類型 不直接指名要啓動控件的名字,但是通過指定action與data來啓動,通常用來啓動其他app的activity,比如打電話的界面,相冊,地圖等。
先說一下Intent Filter吧,在說如何發送隱式intent,這樣會好理解一些
Intent Filter
intent filter 是intent的過濾器,他可以對隱式的intent進行過濾,我的理解是當發送一個intent時,android系統會匹配各個應用中intent filter,查看intent filter 是否是當前intent要被啓動的。
intent filter 中可以添加如下屬性(manifest文件中設置)
action: 動作的名稱,通常是系統定義好的值,如ACTION_SEND,或ACTION_VIEW,通過
data:intent附帶的數據。通過指定他的值,可以使用一個或者多個屬性,我們可以只定義MIME type或者是隻指定URI prefix,也可以只定義一個URI scheme,或者是他們綜合使用。
category:提供一個附加的方法來標識這個activity能夠handle的intent。通常與用戶的手勢或者是啓動位置有關。系統有支持幾種不同的categories,但是大多數都很少用到。而且,所有的隱式intent都默認是 CATEGORY_DEFAULT 類型的。在intent filter中用指定它的值。
還有一點需要特別注意:**intent-filterfilter>中必須有category標籤,不然應用就會奔潰,category屬性一般指定爲
< category android:name=”android.intent.category.LAUNCHER” />
驗證是否有App去接收這個Intent
Caution: 如果觸發了一個intent,而且沒有任何一個app會去接收這個intent,則app會crash(奔潰掉)。
PackageManager packageManager = getPackageManager();
List<ResolveInfo> activities = packageManager.queryIntentActivities(intent, 0);
boolean isIntentSafe = activities.size() > 0;
下面是一個例子
<activity android:name="MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="ShareActivity">
<intent-filter>
<action android:name="android.intent.action.SEND"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="text/plain"/>
</intent-filter>
</activity>
設置intent
- 設置component 發送intent可以添加控件的名字,用於顯示啓動控件
*設置action,如果啓動的控件爲自己定義的,一般我們用包名來作爲action名字的前綴,來和我們系統衆多的action區分開
static final String ACTION_TIMETRAVEL = "com.example.action.TIMETRAVEL";
- 設置data,一般設置一些電腦號碼,email地址等需要傳遞給要啓動控制的數據
*設置catogory,一般不需要設置,默認大多數的隱式intent的intent-filter中的catogory爲默認的屬性
- 設置extra
這個用到的比較多,比方說我們想傳遞要給一個數據給另外一個activity時,就可以用到
putExtra()或者使用putExtras
下面是一些其他intent的例子
帶有指定電話號碼的intent:
Uri number = Uri.parse("tel:5551234"); Intent callIntent = new Intent(Intent.ACTION_DIAL, number);
查看地圖:
Uri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California"); Uri location = Uri.parse("geo:37.422219,-122.08364?z=14"); Intent mapIntent = new Intent(Intent.ACTION_VIEW, location);
查看網頁
Uri webpage = Uri.parse("http://www.android.com"); Intent webIntent = new Intent(Intent.ACTION_VIEW, webpage);
至於另外一些需要extra數據的隱式 intent,我們可以使用 putExtra() 方法來添加那些數據。 默認的,系統會根據Uri數據類型來決定需要哪些合適的MIME type。如果我們沒有在intent中包含一個Uri, 則通常需要使用 setType() 方法來指定intent附帶的數據類型。設置MIME type 是爲了指定應該接受這個intent的activity。例如:
發送一個帶附件的email:
Intent emailIntent = new Intent(Intent.ACTION_SEND); emailIntent.setType(HTTP.PLAIN_TEXT_TYPE); emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[]{"[email protected]"}); emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Email subject"); emailIntent.putExtra(Intent.EXTRA_TEXT, "Email message text"); emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("content://path/to/email/attachment"));
創建一個日曆事件
Intent calendarIntent = new Intent(Intent.ACTION_INSERT, Events.CONTENT_URI); Calendar beginTime = Calendar.getInstance().set(2012, 0, 19, 7, 30); Calendar endTime = Calendar.getInstance().set(2012, 0, 19, 10, 30); calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, beginTime.getTimeInMillis()); calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endTime.getTimeInMillis()); calendarIntent.putExtra(Events.TITLE, "Ninja class"); calendarIntent.putExtra(Events.EVENT_LOCATION, "Secret dojo");