关于Android隐式启动Activity(2)
单靠data的mimeType属性不能匹配,就算这个mimeType是唯一的也不行(比如 in.setType("leo.android.cursor.dir/vnd.google.leo");),需要有一个action配合可以有多个 mimeType,在java代码里只需匹配其中一个即可:
<activity android:name=".MyActivityTwo" android:label="@string/activityTwo">
<intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW"></action>
<data android:mimeType="leo.android.cursor.dir/vnd.google.leo" />
<data android:mimeType="leo.android.cursor.dir/vnd.google.liao" />
<category android:name="android.intent.category.DEFAULT"></category>
</intent-filter>
</activity>
这样可以启动MyActivityTwo这个Activity:
Intent in = new Intent();
in.setAction("android.intent.action.VIEW");
in.addCategory(Intent.CATEGORY_DEFAULT);//可去掉,因为Category默认值即系Intent.CATEGORY_DEFAULT
in.setType("leo.android.cursor.dir/vnd.google.liao");
startActivity(in);
或者这样也可以启动MyActivityTwo这个Activity:
Intent in = new Intent();
in.setAction("android.intent.action.VIEW");
in.addCategory(Intent.CATEGORY_DEFAULT);//可去掉,因为Category默认值即系Intent.CATEGORY_DEFAULT
in.setType("leo.android.cursor.dir/vnd.google.leo");
startActivity(in);
scheme和mimeType只能有其中一个,下面这样通不过
AndroidManifest.xml里:
<data android:scheme="something" android:host="project.example.com"
android:port="80"
android:mimeType="leo.android.cursor.dir/vnd.google.leo" />
或
<data android:scheme="something" android:host="project.example.com"
android:port="80" />
<data android:mimeType="leo.android.cursor.dir/vnd.google.leo" />
java代码里:
匹配不上:
Intent in = new Intent();
in.setAction("android.intent.action.VIEW");
Uri uri = Uri.parse("something://project.example.com:80");
in.setData(uri);
in.setType("leo.android.cursor.dir/vnd.google.leo");
startActivity(in);
这样还是匹配不上:
Intent in = new Intent();
in.setAction("android.intent.action.VIEW");
// Uri uri = Uri.parse("something://project.example.com:80");
// in.setData(uri);
in.setType("leo.android.cursor.dir/vnd.google.leo");
startActivity(in);
这样还是匹配不上:
Intent in = new Intent();
in.setAction("android.intent.action.VIEW");
Uri uri = Uri.parse("something://project.example.com:80");
in.setData(uri);
// in.setType("leo.android.cursor.dir/vnd.google.leo");
startActivity(in);
(4) 一个Activity里可以有多对<intent-filter></intent-filter> 只要匹配其中一对,即可启动这个Activity
<activity android:name=".MyActivityTwo" android:label="@string/activityTwo">
<intent-filter>
<action android:name="android.intent.action.VIEW"></action>
<data android:scheme="something" android:host="project.example.com"
android:port="80" />
<category android:name="android.intent.category.DEFAULT"></category>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW"></action>
<data android:mimeType="leo.android.cursor.dir/vnd.google.leo" />
<category android:name="android.intent.category.DEFAULT"></category>
</intent-filter>
<intent-filter>
<action android:name="hello.hi.liao"></action>
<category android:name="android.intent.category.DEFAULT"></category>
</intent-filter>
</activity>
java代码里:
匹配第一对<intent-filter> 可以启动MyActivityTwo这个Activity:
Intent in = new Intent();
in.setAction("android.intent.action.VIEW");
in.addCategory(Intent.CATEGORY_DEFAULT);//可去掉,因为Category默认值即系Intent.CATEGORY_DEFAULT
Uri uri = Uri.parse("something://project.example.com:80");
in.setData(uri);
startActivity(in);
匹配第二对<intent-filter> 也可以启动MyActivityTwo这个Activity:
Intent in = new Intent();
in.addCategory(Intent.CATEGORY_DEFAULT);//可去掉,因为Category默认值即系Intent.CATEGORY_DEFAULT
in.setAction("android.intent.action.VIEW");
in.setType("leo.android.cursor.dir/vnd.google.leo");
startActivity(in);
匹配第三对<intent-filter> 也可以启动MyActivityTwo这个Activity:
Intent in = new Intent();
in.setAction("hello.hi.liao");
in.addCategory(Intent.CATEGORY_DEFAULT);//可去掉,因为Category默认值即系Intent.CATEGORY_DEFAULT
startActivity(in);
全部总结:
1. <action/> 包含在 <intent-filter></intent-filter> 标签对里,而且是必不可少的!不管以哪一种方式来匹配,都不可缺少这个<action/> ,可以有多个,至少要有一个。
如有多个的,话只需要匹配其中一个即可找到这个activity
<action>里的属性值大多数是在Intent里定义的,比如<action android:name="android.intent.action.VIEW"/>里的属性值就等于 Intent.ACTION_VIEW,
在这个Intent类里以ACTION开头定义的常量都是。当然,也可以自定义。
2. 任何一个需要隐式启动的Activity都必须要有这项:<category android:name="android.intent.category.DEFAULT"/>
例外情况是:android.intent.category.MAIN和android.intent.category.LAUNCHER的filter中没有必要加入android.intent.category.DEFAULT,当然加入也没有问题
<category> 里的属性值大多数是在Intent里定义的,比如 <category android:name="android.intent.category.DEFAULT"/>里的属性值就等于 Intent.CATEGORY_DEFAULT,
在这个Intent类里以CATEGORY开头定义的常量都是。当然,也可以自定义。
3.一个Activity里可以有多对<intent-filter></intent-filter> 只要匹配其中一对,即可启动这个Activity
4.在<intent-filter></intent-filter>里可以有多个<data android:mimeType="xxxx"/>,只需匹配其中一个即可.注意:不可以同时出现第5点的标签对,即下面这条。
5. 在<intent-filter></intent-filter>里可以有多个<data android:scheme="xxxx" android:host="yyyy" android:port="uuu"/>,只需匹配其中一个即可。
语法:
<data android:host="string"
android:mimeType="string"
android:path="string"
android:pathPattern="string"
android:pathPrefix="string"
android:port="string"
android:scheme="string" />
可以分开写,如:
<data android:scheme="something" android:host="project.example.com" android:port="80"/>
等同于这样写:
<data android:scheme="something"/>
<data android:host="project.example.com"/>
<data android:port="80"/>
在java代码里,Uri的格式:scheme://host:port/path or pathPrefix or pathPattern
注意:不可以同时出现第4点的标签对,即上面那条。
6.在<intent-filter></intent-filter>里可以有多个<action android:name="xxxx"> ,只需匹配其中一个即可。
7.当匹配不上任何Activity的话,会发生异常,跳出对话框:很抱歉...某某应用程序意外停止,请重试。
8. 上面所说的全部适用于Service和BroadcastReceiver,只需把<activity ...></activity>换成<service ...></service>或<receiver ...></receiver>即可。
9.刚参考了一下packages\apps\HTMLViewer\AndroidManifest.xml,第4和第5条应该是不冲突才对,但是实际测试中却是冲突,暂时未到找原因。匹配方式请看:用于打开HTML文件的intent
在被启动的Activity(本例为MyActivityTwo)里接收数据:
Intent intent = getIntent();
String intentCategories = intent.getCategories()
String intentType = intent.getType();
Uri uri = intent.getData();
String uriScheme = uri.getScheme();
String uriPath = uri.getPath();
String uriHost = uri.getHost();
String uriEncodedPath = uri.getEncodedPath();
请参考:packages\apps\HTMLViewer\src\com\android\htmlviewer\HTMLViewerActivity.java
转载出处:http://blog.csdn.net/qjbagu/archive/2011/04/28/6369609.aspx
单靠data的mimeType属性不能匹配,就算这个mimeType是唯一的也不行(比如 in.setType("leo.android.cursor.dir/vnd.google.leo");),需要有一个action配合可以有多个 mimeType,在java代码里只需匹配其中一个即可:
<activity android:name=".MyActivityTwo" android:label="@string/activityTwo">
<intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW"></action>
<data android:mimeType="leo.android.cursor.dir/vnd.google.leo" />
<data android:mimeType="leo.android.cursor.dir/vnd.google.liao" />
<category android:name="android.intent.category.DEFAULT"></category>
</intent-filter>
</activity>
这样可以启动MyActivityTwo这个Activity:
Intent in = new Intent();
in.setAction("android.intent.action.VIEW");
in.addCategory(Intent.CATEGORY_DEFAULT);//可去掉,因为Category默认值即系Intent.CATEGORY_DEFAULT
in.setType("leo.android.cursor.dir/vnd.google.liao");
startActivity(in);
或者这样也可以启动MyActivityTwo这个Activity:
Intent in = new Intent();
in.setAction("android.intent.action.VIEW");
in.addCategory(Intent.CATEGORY_DEFAULT);//可去掉,因为Category默认值即系Intent.CATEGORY_DEFAULT
in.setType("leo.android.cursor.dir/vnd.google.leo");
startActivity(in);
scheme和mimeType只能有其中一个,下面这样通不过
AndroidManifest.xml里:
<data android:scheme="something" android:host="project.example.com"
android:port="80"
android:mimeType="leo.android.cursor.dir/vnd.google.leo" />
或
<data android:scheme="something" android:host="project.example.com"
android:port="80" />
<data android:mimeType="leo.android.cursor.dir/vnd.google.leo" />
java代码里:
匹配不上:
Intent in = new Intent();
in.setAction("android.intent.action.VIEW");
Uri uri = Uri.parse("something://project.example.com:80");
in.setData(uri);
in.setType("leo.android.cursor.dir/vnd.google.leo");
startActivity(in);
这样还是匹配不上:
Intent in = new Intent();
in.setAction("android.intent.action.VIEW");
// Uri uri = Uri.parse("something://project.example.com:80");
// in.setData(uri);
in.setType("leo.android.cursor.dir/vnd.google.leo");
startActivity(in);
这样还是匹配不上:
Intent in = new Intent();
in.setAction("android.intent.action.VIEW");
Uri uri = Uri.parse("something://project.example.com:80");
in.setData(uri);
// in.setType("leo.android.cursor.dir/vnd.google.leo");
startActivity(in);
(4) 一个Activity里可以有多对<intent-filter></intent-filter> 只要匹配其中一对,即可启动这个Activity
<activity android:name=".MyActivityTwo" android:label="@string/activityTwo">
<intent-filter>
<action android:name="android.intent.action.VIEW"></action>
<data android:scheme="something" android:host="project.example.com"
android:port="80" />
<category android:name="android.intent.category.DEFAULT"></category>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW"></action>
<data android:mimeType="leo.android.cursor.dir/vnd.google.leo" />
<category android:name="android.intent.category.DEFAULT"></category>
</intent-filter>
<intent-filter>
<action android:name="hello.hi.liao"></action>
<category android:name="android.intent.category.DEFAULT"></category>
</intent-filter>
</activity>
java代码里:
匹配第一对<intent-filter> 可以启动MyActivityTwo这个Activity:
Intent in = new Intent();
in.setAction("android.intent.action.VIEW");
in.addCategory(Intent.CATEGORY_DEFAULT);//可去掉,因为Category默认值即系Intent.CATEGORY_DEFAULT
Uri uri = Uri.parse("something://project.example.com:80");
in.setData(uri);
startActivity(in);
匹配第二对<intent-filter> 也可以启动MyActivityTwo这个Activity:
Intent in = new Intent();
in.addCategory(Intent.CATEGORY_DEFAULT);//可去掉,因为Category默认值即系Intent.CATEGORY_DEFAULT
in.setAction("android.intent.action.VIEW");
in.setType("leo.android.cursor.dir/vnd.google.leo");
startActivity(in);
匹配第三对<intent-filter> 也可以启动MyActivityTwo这个Activity:
Intent in = new Intent();
in.setAction("hello.hi.liao");
in.addCategory(Intent.CATEGORY_DEFAULT);//可去掉,因为Category默认值即系Intent.CATEGORY_DEFAULT
startActivity(in);
全部总结:
1. <action/> 包含在 <intent-filter></intent-filter> 标签对里,而且是必不可少的!不管以哪一种方式来匹配,都不可缺少这个<action/> ,可以有多个,至少要有一个。
如有多个的,话只需要匹配其中一个即可找到这个activity
<action>里的属性值大多数是在Intent里定义的,比如<action android:name="android.intent.action.VIEW"/>里的属性值就等于 Intent.ACTION_VIEW,
在这个Intent类里以ACTION开头定义的常量都是。当然,也可以自定义。
2. 任何一个需要隐式启动的Activity都必须要有这项:<category android:name="android.intent.category.DEFAULT"/>
例外情况是:android.intent.category.MAIN和android.intent.category.LAUNCHER的filter中没有必要加入android.intent.category.DEFAULT,当然加入也没有问题
<category> 里的属性值大多数是在Intent里定义的,比如 <category android:name="android.intent.category.DEFAULT"/>里的属性值就等于 Intent.CATEGORY_DEFAULT,
在这个Intent类里以CATEGORY开头定义的常量都是。当然,也可以自定义。
3.一个Activity里可以有多对<intent-filter></intent-filter> 只要匹配其中一对,即可启动这个Activity
4.在<intent-filter></intent-filter>里可以有多个<data android:mimeType="xxxx"/>,只需匹配其中一个即可.注意:不可以同时出现第5点的标签对,即下面这条。
5. 在<intent-filter></intent-filter>里可以有多个<data android:scheme="xxxx" android:host="yyyy" android:port="uuu"/>,只需匹配其中一个即可。
语法:
<data android:host="string"
android:mimeType="string"
android:path="string"
android:pathPattern="string"
android:pathPrefix="string"
android:port="string"
android:scheme="string" />
可以分开写,如:
<data android:scheme="something" android:host="project.example.com" android:port="80"/>
等同于这样写:
<data android:scheme="something"/>
<data android:host="project.example.com"/>
<data android:port="80"/>
在java代码里,Uri的格式:scheme://host:port/path or pathPrefix or pathPattern
注意:不可以同时出现第4点的标签对,即上面那条。
6.在<intent-filter></intent-filter>里可以有多个<action android:name="xxxx"> ,只需匹配其中一个即可。
7.当匹配不上任何Activity的话,会发生异常,跳出对话框:很抱歉...某某应用程序意外停止,请重试。
8. 上面所说的全部适用于Service和BroadcastReceiver,只需把<activity ...></activity>换成<service ...></service>或<receiver ...></receiver>即可。
9.刚参考了一下packages\apps\HTMLViewer\AndroidManifest.xml,第4和第5条应该是不冲突才对,但是实际测试中却是冲突,暂时未到找原因。匹配方式请看:用于打开HTML文件的intent
在被启动的Activity(本例为MyActivityTwo)里接收数据:
Intent intent = getIntent();
String intentCategories = intent.getCategories()
String intentType = intent.getType();
Uri uri = intent.getData();
String uriScheme = uri.getScheme();
String uriPath = uri.getPath();
String uriHost = uri.getHost();
String uriEncodedPath = uri.getEncodedPath();
请参考:packages\apps\HTMLViewer\src\com\android\htmlviewer\HTMLViewerActivity.java
转载出处:http://blog.csdn.net/qjbagu/archive/2011/04/28/6369609.aspx