Intent是什么?
Intent是一种运行时绑定机制,它能在程序运行过程中连接两个不同的组件。通过Intent,你的程序可以向Android表达某种请求或者意愿,Android会根据意愿的内容选择适当的组件来完成请求。比如, 有一个Activity希望打开网页浏览器查看某一网页的内容,那么这个Activity只需要发出WEB_SEARCH_ACTION给Android, Android就会根据Intent的请求内容,查询各组件注册时声明的IntentFilter,找到网页浏览器的Activity来浏览网页。总而言之,就是我们通过intent传入某种意图,而Android就会根据这种意图,自动寻找合适的Activity来启动, 如果有多个符合的Activity, 就以列表的方式让用户手动选择一个。
显式Intent与隐式Intent
显式:明确指出是启动OtherActivity
- Intent intent = new Intent();
- intent.setClass(Context packageContext, OtherActivity.class);
- startActivity(intent);
- Intent intent = new Intent();
- intent.setAction(Intent.ACTION_NEW);
- startActivity(intent);
1,通过setClassName
- Intent intent = new Intent();
- //表示希望启动com.example.test_permission包中的com.example.test_permission.MainActivity
- intent.setClassName("com.example.test_permission", "com.example.test_permission.MainActivity");
- startActivity(intent);
- Intent intent = new Intent();
- intent.setClass(Context packageContext, OtherActivity.class);
- startActivity(intent);
某个Activity能不能被某个Intent激活,要看这个Activity是不是符合这个Intent的要求, 而某个Activity能被哪个Intent激活是有定义的,定义在AndroidManifest.xml
打开AnddroidManifest.xml,找到任意一个Activity:
- <activity
- android:name=".MainActivity"
- android:label="@string/app_name" >
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
1,Action:(一条<intent-filter>元素至少应该包含一个<action>)
这个表示用来说明这个Activity可以执行哪些动作,所以当隐式Intent传递过来action时,如果跟这里<intent-filter>所列出的任意一个Action匹配的话,这个Activity就将被执行。
常用的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 改变时区警告.
这个表示这个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时需要的数据,也就是说这些数据是必须的。如果其它条件都足以激活该Activity,但是Intent却没有传进来指定类型的Data时,就不能激活该Activity。
在<data/>标签中包含一下几种子元素:android:scheme 前缀;android:host 主机名;android:port 端口 android:path 路径
- <activity android:name=".TargetActivity">
- <intent-filter>
- <action android:name="com.scott.intent.action.TARGET"/>
- <category android:name="android.intent.category.DEFAULT"/>
- <data android:scheme="scott" android:host="com.scott.intent.data" android:port="7788" android:path="/target"/>
- </intent-filter>
- </activity>
1,利用构造函数
- public Intent(String action, Uri uri) {
- mAction = action;
- mData = uri;
- }
- Intent intent = new Intent("com.scott.intent.action.name");
- intent.setData(Uri.parse("scheme://host:port/parth"));
- startActivity(intent);
- <activity android:name=".TargetActivity">
- <intent-filter>
- <action android:name="com.scott.intent.action.TARGET"/>
- <category android:name="android.intent.category.DEFAULT"/>
- <data android:scheme="scott" android:host="com.scott.intent.data" android:port="7788" android:path="/target"/>
- </intent-filter>
- </activity>
- Intent intent = new Intent("com.scott.intent.action.TARGET");
- intent.setData(Uri.parse("scott://com.scott.intent.data:7788/target"));
- startActivity(intent);
参考文献:http://blog.youkuaiyun.com/harvic880925/article/details/38399723