Android-->intent-filter 过滤规则的匹配 (Activity通过Uri传递参数)
2016-01-16 21:22
549 查看
当我们使用
这种方式启动Activity的时候, 叫做隐式调用;
隐式调用最重要的就是匹配规则,否则系统也不知道该启动那个Activity;
一般, 声明Activity的时候,可以这样写:
也可以这样写:
其中 intent-filter 声明的部分就是 此Activity匹配规则;
每声明一个 intent-filter , 就定义了一组 匹配规则;
匹配的时候,只要匹配其中任意一组,就能启动此Activity;
action category data ,都可以有多个;
category 系统会默认 添加:
即便你没有声明;
1–> action 的匹配规则:
如果你像这样,声明了很多个action, 那么匹配的时候, 只要和启动任意一个完全相同即可;
action 的匹配规则,总结为: 或 的关系;
2–>category 的匹配规则
如果你像这样,声明了很多个category , 那么匹配的时候, 传递过来的参数需要和声明的一一匹配, 有一个不相同, 就会匹配失败;
category 的匹配规则,总结为: 且 的关系;
注意: 如果需要隐式启动自定义的Activity,一定要在声明Activity的时候加上:
因为系统在隐式启动Activity的时候,会默认添加这个category;
3–>data 的匹配规则
这个规则有点负责,挑重点说:
默认情况下, 系统会匹配 scheme 为 content 和 file的uri, 即使你没有明确指定 scheme, 也可以匹配这2个scheme;
其次, 在声明 minmeType 的时候, 一定要是 xx/xx 的形式, 否则APK 都安装不了;我已填坑!
剩下的,
如果你像这样,声明了很多个data , 那么匹配的时候, 传递过来的参数需要和声明的一一匹配, 有一个不相同, 就会匹配失败;
data 的匹配规则,总结为: 且 的关系;
其实 category 和 data 的匹配都是一样的;
如果声明了category 和 data 规则,,那么启动的时候,就必须指定其中1个或多个, 才能启动成功;
大总结:
要想隐式启动Activity,必须添加过滤规则如下:
其次, data 可以要,也可要不要, 如果要, 那么调用的时候,就必须添加;
category 一定要声明, 因为系统默认调用的时候 会添加;
补充一点:如果系统找不到匹配的Activity, 会抛出ActivityNotFound异常;
Activity通过Uri传递参数
1:定义一个用于接收参数的Activity
2:发送参数
还有一种方法就是用Bundle传递,但是方法如果用了Intent.FLAG_ACTIVITY_NEW_TASK标识,参数就无法获取.
至此: 文章就结束了,如有疑问: QQ群:274306954 欢迎您的加入.
Intent intent = new Intent(Intent.ACTION_VIEW); startActivity(intent);
这种方式启动Activity的时候, 叫做隐式调用;
隐式调用最重要的就是匹配规则,否则系统也不知道该启动那个Activity;
一般, 声明Activity的时候,可以这样写:
<activity android:name="PagerActivity" android:label="@string/title_activity_view_pager" android:theme="@style/AppTheme.NoActionBar"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity>
也可以这样写:
<activity android:name="PagerActivity" android:label="@string/title_activity_view_pager" android:theme="@style/AppTheme.NoActionBar"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> <intent-filter> <action android:name="com.angcyo.activity" /> <category android:name="com.angcyo"/> </intent-filter> <intent-filter> <action android:name="com.angcyo.activity" /> <category android:name="com.angcyo"/> <data android:mimeType="image/*"/> </intent-filter> </activity>
其中 intent-filter 声明的部分就是 此Activity匹配规则;
每声明一个 intent-filter , 就定义了一组 匹配规则;
匹配的时候,只要匹配其中任意一组,就能启动此Activity;
action category data ,都可以有多个;
category 系统会默认 添加:
<category android:name="android.intent.category.LAUNCHER"/>
即便你没有声明;
1–> action 的匹配规则:
<intent-filter> <action android:name="com.angcyo.activity" /> <action android:name="com.angcyo.activity1" /> <action android:name="com.angcyo.activity2" /> <action android:name="com.angcyo.activity3" /> </intent-filter>
如果你像这样,声明了很多个action, 那么匹配的时候, 只要和启动任意一个完全相同即可;
action 的匹配规则,总结为: 或 的关系;
2–>category 的匹配规则
<intent-filter> <category android:name="com.angcyo"/> <category android:name="com.angcyo1"/> <category android:name="com.angcyo2"/> <category android:name="com.angcyo3"/> </intent-filter>
如果你像这样,声明了很多个category , 那么匹配的时候, 传递过来的参数需要和声明的一一匹配, 有一个不相同, 就会匹配失败;
category 的匹配规则,总结为: 且 的关系;
注意: 如果需要隐式启动自定义的Activity,一定要在声明Activity的时候加上:
<category android:name="android.intent.category.DEFAULT"/>
因为系统在隐式启动Activity的时候,会默认添加这个category;
3–>data 的匹配规则
这个规则有点负责,挑重点说:
默认情况下, 系统会匹配 scheme 为 content 和 file的uri, 即使你没有明确指定 scheme, 也可以匹配这2个scheme;
<data android:mimeType="angcyo/*"/>
其次, 在声明 minmeType 的时候, 一定要是 xx/xx 的形式, 否则APK 都安装不了;我已填坑!
剩下的,
<data android:mimeType="angcyo/*"/><data android:mimeType="angcyo1/*"/>
<data android:mimeType="angcyo2/*"/>
<data android:mimeType="angcyo3/*"/>
如果你像这样,声明了很多个data , 那么匹配的时候, 传递过来的参数需要和声明的一一匹配, 有一个不相同, 就会匹配失败;
data 的匹配规则,总结为: 且 的关系;
其实 category 和 data 的匹配都是一样的;
如果声明了category 和 data 规则,,那么启动的时候,就必须指定其中1个或多个, 才能启动成功;
大总结:
要想隐式启动Activity,必须添加过滤规则如下:
<intent-filter> <action android:name="android.angcyo" /> //必须要,name 可以自定义 <category android:name="android.intent.category.DEFAULT"/> //必须要, name必须为此 </intent-filter>
其次, data 可以要,也可要不要, 如果要, 那么调用的时候,就必须添加;
category 一定要声明, 因为系统默认调用的时候 会添加;
补充一点:如果系统找不到匹配的Activity, 会抛出ActivityNotFound异常;
Activity通过Uri传递参数
1:定义一个用于接收参数的Activity
<activity android:name=".MainActivity"> <intent-filter> <action android:name="com.angcyo.robi"/> <category android:name="android.intent.category.DEFAULT"/> <data android:scheme="robi"/> //注意这个scheme,这是关键 </intent-filter> </activity>
2:发送参数
public void sendIntent(String data) { Intent intent = new Intent("com.angcyo.robi", //这个值,就是上文中的隐式调用方法 Uri.parse("robi:" + data));//注意,这个robi就是步骤1中的scheme,":"号也不能少. intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//在必要的时候,可以添加此行. startActivity(intent); }
还有一种方法就是用Bundle传递,但是方法如果用了Intent.FLAG_ACTIVITY_NEW_TASK标识,参数就无法获取.
至此: 文章就结束了,如有疑问: QQ群:274306954 欢迎您的加入.
相关文章推荐
- Android 之 高德地图学习 一 基本地图
- Android startservice & bindservice的区别
- Android ViewHolder模式简洁封装写法
- Android学习笔记之性能优化SparseArray
- android140 360 黑名单 启动service和分页加载
- 【Android】图标爆炸效果(类似小米卸载应用图标散开效果)
- Android使用LruCache,DiskLruCache结合线程池打造类似(ImageLoader)图片加载器
- android布局优化-merge
- 【Android开发小记--3】按钮视图动画几种效果
- Android系统性能调优工具介绍
- android 星级条和拖动条
- Android Joda-time工具类
- Android Joda-time工具类
- Android Studio中使用JNI调用OpenCV本地代码Canny 边缘检测
- 向每一个错误致敬——Android HotFix
- Android调试优化篇
- android 进度条ProgressBar
- Android 记住密码和自动登录界面的实现(SharedPreferences 的用法)
- 《第一行代码Android》学习日记19——基于位置的服务
- windows7安装Androidstudio