main.xml如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent" tools:context=".MainActivity" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:text="@string/mainActivity_tip" android:textSize="25sp" /> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:text="@string/button_tip" android:textSize="25sp"/> </RelativeLayout>
another.xml如下:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="200dip" android:layout_height="50dip" android:layout_centerInParent="true" android:gravity="center" android:textSize="20sp" android:text="@string/anotherActivity_tip" /> </RelativeLayout>
MainActivity如下:
package cn.com.bravesoft.testactivity4; import android.net.Uri; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; /** * 利用隐式意图激活组件的测试笔记 * 在利用隐式意图激活组件时常用action category data进行匹配 * 测试1: * 代码中设置为: * Intent intent = new Intent(); * intent.setAction("cn.com.bravesoft.testAction"); * startActivity(intent); * Manifest文件中设置: * <intent-filter > * <action android:name="cn.com.bravesoft.testAction"/> * </intent-filter> * 结果: * 报错,无法激活组件 * 原因: * 在intent设置action的时候会默认给改intent设置一个默认的category即 * 相当于会自动执行:intent.addCategory("android.intent.category.DEFAULT"); * 解决: * 在<intent-filter >中设置category即 * <category android:name="android.intent.category.DEFAULT" /> * 这样就可以匹配到 * 总结: * 在代码中的intent和manifest中的</intent-filter>均为设置data的情况下 * 只要代码中intent的action和category均出现在了</intent-filter>那么就 * 可以激活组件 * * 测试2: * 关于data的匹配测试 * 在测试1中可以看到如果我们在代码中没有设置category那么系统会自动添加一个 * 默认category即android.intent.category.DEFAULT. * 但是如果在意图对象或manifest中设置了data而另一方没有设置data,那么无论如何是不能匹配的 * 关于该点不再单独测试 * 关于数据的匹配常用到scheme host path * 比如在http://www.bravesoft.com.cn/android中 * scheme是http * host是www.bravesoft.com.cn * path是/android * 此时代码如下: * Intent intent = new Intent(); * intent.setAction("cn.com.bravesoft.testAction"); * intent.setData(Uri.parse("http://www.bravesoft.com.cn/android")); * startActivity(intent); * manifest的<intent-filter >如下: * <intent-filter > * <action android:name="cn.com.bravesoft.testAction"/> * <category android:name="android.intent.category.DEFAULT" /> * <data android:scheme="http" android:host="www.bravesoft.com.cn" android:path="/android"/> * </intent-filter> * 此时可以匹配的 * * 测试3: * 在测试2的基础上继续测试 * 关于数据的匹配除了常用到scheme host path,有时还会采用mimeType * 为 </intent-filter>添加了mimeType即<data android:mimeType="image/gif"/> * 为了匹配该意图所以在代码中设置了intent.setType("image/gif"); * 此时代码如下: * Intent intent = new Intent(); * intent.setAction("cn.com.bravesoft.testAction"); * intent.setData(Uri.parse("http://www.bravesoft.com.cn/android")); * intent.setType("image/gif"); * * manifest的<intent-filter >如下: * <intent-filter > * <action android:name="cn.com.bravesoft.testAction"/> * <category android:name="android.intent.category.DEFAULT" /> * <data android:scheme="http" android:host="www.bravesoft.com.cn" android:path="/android"/> * <data android:mimeType="image/gif"/> * </intent-filter> * 结果: * 无法匹配 * 原因: * 在调用setType的时候会自动清除setData所设置的内容,即setData失效 * 解决: * 当manifest中的 </intent-filter>除了设置scheme host path外还 * 设置了mimeType时在代码中需要intent.setDataAndType将这些必须的 * 东西同时设置. * 此时代码如下: * Intent intent = new Intent(); * intent.setAction("cn.com.bravesoft.testAction"); * intent.setDataAndType(Uri.parse("http://www.bravesoft.com.cn/android"), "image/gif"); * startActivity(intent); * manifest的<intent-filter >如下: * <intent-filter > * <action android:name="cn.com.bravesoft.testAction"/> * <category android:name="android.intent.category.DEFAULT" /> * <data android:scheme="http" android:host="www.bravesoft.com.cn" android:path="/android"/> * <data android:mimeType="image/gif"/> * </intent-filter> */ public class MainActivity extends Activity { private Button mButton; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mButton = (Button) findViewById(R.id.button); mButton.setOnClickListener(new ButtonOnClickListener()); } private class ButtonOnClickListener implements OnClickListener { public void onClick(View v) { Intent intent = new Intent(); intent.setAction("cn.com.bravesoft.testAction"); intent.setDataAndType(Uri.parse("http://www.bravesoft.com.cn/android"), "image/gif"); startActivity(intent); } } }
AnotherActivity如下:
package cn.com.bravesoft.testactivity4; import android.app.Activity; import android.os.Bundle; public class AnotherActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.another); } }
AndroidManifest如下:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="cn.com.bravesoft.testactivity4" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="7" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="cn.com.bravesoft.testactivity4.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> <!-- 注册第二个Activity --> <activity android:name="cn.com.bravesoft.testactivity4.AnotherActivity"> <intent-filter > <action android:name="cn.com.bravesoft.testAction"/> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="http" android:host="www.bravesoft.com.cn" android:path="/android"/> <data android:mimeType="image/gif"/> </intent-filter> </activity> </application> </manifest>