先看效果圖:

1、Action:該activity可以執行的動作
該標識用來說明這個activity可以執行哪些動作,所以當隱式intent傳遞過來action時,如果跟這里<intent-filter>所列出的任意一個匹配的話,就說明這個activity是可以完成這個intent的意圖的,可以將它激活!
常用的Action如下所示:
ACTION_CALL activity 啟動一個電話.
ACTION_EDIT activity 顯示用戶編輯的數據.
ACTION_MAIN activity 作為Task中第一個Activity啟動
ACTION_SYNC activity 同步手機與數據服務器上的數據.
ACTION_BATTERY_LOW broadcast receiver 電池電量過低警告.
ACTION_HEADSET_PLUG broadcast receiver 插拔耳機警告
ACTION_SCREEN_ON broadcast receiver 屏幕變亮警告.
ACTION_TIMEZONE_CHANGED broadcast receiver 改變時區警告.
兩條原則:
一條<intent-filter>元素至少應該包含一個<action>,否則任何Intent請求都不能和該<intent-filter>匹配。
如果Intent請求的Action和<intent-filter>中個任意一條<action>匹配,那么該Intent就可以激活該activity(前提是除了action的其它項也要通過)。
兩條注意:
如果Intent請求或<intent-filter>中沒有說明具體的Action類型,那么會出現下面兩種情況。如果<intent-filter>中沒有包含任何Action類型,那么無論什么Intent請求都無法和這條<intent-filter>匹配。 反之,如果Intent請求中沒有設定Action類型,那么只要<intent-filter>中包含有Action類型,這個Intent請求就將順利地通過<intent-filter>的行為測試。
2、Category:指定當前動作(Action)被執行的環境
即這個activity在哪個環境中才能被激活。不屬於這個環境的,不能被激活。
常用的Category屬性如下所示:
CATEGORY_DEFAULT:Android系統中默認的執行方式,按照普通Activity的執行方式執行。表示所有intent都可以激活它
CATEGORY_HOME:設置該組件為Home Activity。
CATEGORY_PREFERENCE:設置該組件為Preference。
CATEGORY_LAUNCHER:設置該組件為在當前應用程序啟動器中優先級最高的Activity,通常為入口ACTION_MAIN配合使用。
CATEGORY_BROWSABLE:設置該組件可以使用瀏覽器啟動。表示該activity只能用來瀏覽網頁。
CATEGORY_GADGET:設置該組件可以內嵌到另外的Activity中。
注意:如果該activity想要通過隱式intent方式激活,那么不能沒有任何category設置,至少包含一個android.intent.category.DEFAULT
三 附《Intent調用常見系統組件方法》
// 調用瀏覽器
Uri webViewUri = Uri.parse("http://blog.csdn.net/zuolongsnail");
Intent intent = new Intent(Intent.ACTION_VIEW, webViewUri);
// 調用地圖
Uri mapUri = Uri.parse("geo:100,100");
Intent intent = new Intent(Intent.ACTION_VIEW, mapUri);
// 播放mp3
Uri playUri = Uri.parse("file:///sdcard/test.mp3");
Intent intent = new Intent(Intent.ACTION_VIEW, playUri);
intent.setDataAndType(playUri, "audio/mp3");
// 調用撥打電話
Uri dialUri = Uri.parse("tel:10086");
Intent intent = new Intent(Intent.ACTION_DIAL, dialUri);
// 直接撥打電話,需要加上權限<uses-permission id="android.permission.CALL_PHONE" />
Uri callUri = Uri.parse("tel:10086");
Intent intent = new Intent(Intent.ACTION_CALL, callUri);
// 調用發郵件(這里要事先配置好的系統Email,否則是調不出發郵件界面的)
Uri emailUri = Uri.parse("mailto:zuolongsnail@163.com");
Intent intent = new Intent(Intent.ACTION_SENDTO, emailUri);
// 直接發郵件
Intent intent = new Intent(Intent.ACTION_SEND);
String[] tos = { "zuolongsnail@gmail.com" };
String[] ccs = { "zuolongsnail@163.com" };
intent.putExtra(Intent.EXTRA_EMAIL, tos);
intent.putExtra(Intent.EXTRA_CC, ccs);
intent.putExtra(Intent.EXTRA_TEXT, "the email text");
intent.putExtra(Intent.EXTRA_SUBJECT, "subject");
intent.setType("text/plain");
Intent.createChooser(intent, "Choose Email Client");
// 發短信
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.putExtra("sms_body", "the sms text");
intent.setType("vnd.android-dir/mms-sms");
// 直接發短信
Uri smsToUri = Uri.parse("smsto:10086");
Intent intent = new Intent(Intent.ACTION_SENDTO, smsToUri);
intent.putExtra("sms_body", "the sms text");
// 發彩信
Uri mmsUri = Uri.parse("content://media/external/images/media/23");
Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra("sms_body", "the sms text");
intent.putExtra(Intent.EXTRA_STREAM, mmsUri);
intent.setType("image/png");
// 卸載應用
Uri uninstallUri = Uri.fromParts("package", "com.app.test", null);
Intent intent = new Intent(Intent.ACTION_DELETE, uninstallUri);
// 安裝應用
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File("/sdcard/test.apk"), "application/vnd.android.package-archive");
// 在Android Market中查找應用
Uri uri = Uri.parse("market://search?q=憤怒的小鳥");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
Demo源碼
package mm.shandong.com.testactioncate;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
public class TestActionCateActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test_action_cate);
}
//啟動activityTestComponentOtherActivity,設置intent的action為
//TestComponentOtherActivity1
public void startActivityToAction1(View view) {
Intent intent = new Intent();
intent.setAction("TestComponentOtherActivity1");
startActivity(intent);
}
//啟動activityTestComponentOtherActivity,設置intent的action為
//TestComponentOtherActivity2
public void startActivityToAction2(View view) {
Intent intent = new Intent();
intent.setAction("TestComponentOtherActivity2");
startActivity(intent);
}
//啟動activityTestComponentOtherActivity,設置intent的action為
//TestComponentOtherActivity3
public void startActivityToAction3(View view) {
Intent intent = new Intent();
intent.setAction("TestComponentOtherActivity3");
startActivity(intent);
}
//啟動action為sameAction的activity,有兩個activity設置了相同
//的action
public void startActivitySameAction1(View view) {
Intent intent = new Intent();
intent.setAction("sameAction");
startActivity(intent);
}
//啟動action為Intent.ACTION_VIEW的activity,
// 系統瀏覽器的activity也設置了這個action
public void startActivitySameAction2(View view) {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
startActivity(intent);
}
//啟動一個設置了三個category的activity,這個category必須全都設置,
//才能啟動
public void startActivityCategory(View view) {
Intent intent = new Intent();
intent.setAction("TestActionCate3Activity");
intent.addCategory("category1");
intent.addCategory("category2");
intent.addCategory("category3");
startActivity(intent);
}
}
本人微博:honey_11
Demo下載
最后,以上例子都來源與安卓無憂,請去應用寶或者豌豆莢下載:例子源碼,源碼例子文檔一網打盡
