Android Intent 是 Android 进程间交互,进程内组件间交互的中介.
Intent 分为两种:
显式Intent:与具体组件关联.
隐式Intent:声明关联Action.
隐式Intent:
1.
Activity 声明接收 Intent 类型
<intent-filter>
<action android:name="公司名.intent.action.ActionName" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
2.
调用 Activity
Intent intent = new Intent("公司名.intent.action.ActionName");
intent.setData(null);
parentActivity.startActivity(intent);
3.
Android 预定义的 Intent
Intent.ACTION_VIEW
Intent.ACIION_EDIT
Intent.ACTION_PICK
Intent.ACTION_WEB_SERACH
Intent.ACIION_DIAL
Intent.ACTION_CALL
4.
action 名字相同的 Intent,Andriod OS 如何决定调用哪个 Activity?
a.根据 schema.URI 的协议匹配.
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<data android:schema="http" />
<data android:schema="https" />
</intent-filter>
5.
数据子元素:
<host>
<mimeType>
<path>
<pathPattern>
<pathPrefix>
<port>
<schema>
<mimeType>经常用到:
匹配多个记录
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<data android:mimeType="vnd.android.cursor.dir/vnd.tl.android.note" />
</intent-filter>
匹配一条记录
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<data android:mimeType="vnd.android.cursor.item/vnd.tl.android.note"/>
</intent-filter>
6.extra
除了data属性外,extra也可以附加数据.
数据以键值对方式存储.键是字符串类型 ,而值是基本类型或实现Parcelable接口的对象.
extra 代表 android.os.Bundle.
Bundle bundle = intent.getExtras();
Bundel anotherBundle = new Bundle();
intent.putExtras(anotherBundle); //复制extra 数据到anotherBundle.
7.category
用于设定Activity放置的位置.
嵌入lanucher
嵌入home
嵌入Activity
嵌入菜单
嵌入Preferences
default
8.获取运行程序列表
Intent intent = new Intent(Intent.ACTION_MAIN, null);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
List myApps = getPackggetManager().queryIntentActivities(intent, 0);
显式Intent:
Intent intent = new Intent(parentActivity, activity.class);
parentActivity.startActivity(intent);
Intent 如何解析:
如果Intent指定关联的组件名,则忽略其它属性.只对关联的组件有效.
否则
根据action属性查找,若intent-filter中指定action且没有其它属性,则调用组件.
若有多个组件匹配,android os 会出现一个组件选择器,供用户选择.
然后
根据data属性匹配.先根据schema匹配,然后根据URI和URI Data 类型.
最后
根据category.
查找 intent-filter 中声明的 category.匹配则调用.只用于ACITON_PICK.
调用 Activity 并返回结果:
调用:
startActivityForResult(Intent intent, int requestCode);
结果回调:
onActivityResult(int requestCode, int resultCode, Intent data);
示例:
Intent 分为两种:
显式Intent:与具体组件关联.
隐式Intent:声明关联Action.
隐式Intent:
1.
Activity 声明接收 Intent 类型
<intent-filter>
<action android:name="公司名.intent.action.ActionName" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
2.
调用 Activity
Intent intent = new Intent("公司名.intent.action.ActionName");
intent.setData(null);
parentActivity.startActivity(intent);
3.
Android 预定义的 Intent
Intent.ACTION_VIEW
Intent.ACIION_EDIT
Intent.ACTION_PICK
Intent.ACTION_WEB_SERACH
Intent.ACIION_DIAL
Intent.ACTION_CALL
4.
action 名字相同的 Intent,Andriod OS 如何决定调用哪个 Activity?
a.根据 schema.URI 的协议匹配.
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<data android:schema="http" />
<data android:schema="https" />
</intent-filter>
5.
数据子元素:
<host>
<mimeType>
<path>
<pathPattern>
<pathPrefix>
<port>
<schema>
<mimeType>经常用到:
匹配多个记录
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<data android:mimeType="vnd.android.cursor.dir/vnd.tl.android.note" />
</intent-filter>
匹配一条记录
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<data android:mimeType="vnd.android.cursor.item/vnd.tl.android.note"/>
</intent-filter>
6.extra
除了data属性外,extra也可以附加数据.
数据以键值对方式存储.键是字符串类型 ,而值是基本类型或实现Parcelable接口的对象.
extra 代表 android.os.Bundle.
Bundle bundle = intent.getExtras();
Bundel anotherBundle = new Bundle();
intent.putExtras(anotherBundle); //复制extra 数据到anotherBundle.
7.category
用于设定Activity放置的位置.
嵌入lanucher
嵌入home
嵌入Activity
嵌入菜单
嵌入Preferences
default
8.获取运行程序列表
Intent intent = new Intent(Intent.ACTION_MAIN, null);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
List myApps = getPackggetManager().queryIntentActivities(intent, 0);
显式Intent:
Intent intent = new Intent(parentActivity, activity.class);
parentActivity.startActivity(intent);
Intent 如何解析:
如果Intent指定关联的组件名,则忽略其它属性.只对关联的组件有效.
否则
根据action属性查找,若intent-filter中指定action且没有其它属性,则调用组件.
若有多个组件匹配,android os 会出现一个组件选择器,供用户选择.
然后
根据data属性匹配.先根据schema匹配,然后根据URI和URI Data 类型.
最后
根据category.
查找 intent-filter 中声明的 category.匹配则调用.只用于ACITON_PICK.
调用 Activity 并返回结果:
调用:
startActivityForResult(Intent intent, int requestCode);
结果回调:
onActivityResult(int requestCode, int resultCode, Intent data);
示例:
public static void invokePick(Activity activity){
Intent intent = new Intent(Intent.ACTION_PICK);
int requestCode = 1;
intent.setData(Uri.parse("contetn://tl.android.provider.NotePad/notes"));
activity.startActivityForResult(intent, requestCode);
}
protected void onActivityResult(int requestCode, int resultCode, Intent data){
super.onActivityResult(requestCode, resultCode, data);
parseResult(this, requestCode, resultCode, data);
}
public static void parseResult(Activity activity, int requestCode, int resultCode, Intent data){
if(requestCode != 1){
Log.d(TAG, "Some one else called this, no us!");
return;
}
if(resultCode != Activity.RESULT_OK){
Log.d(TAG, "Result code is not ok! " + resultCode);
return;
}
Log.d(TAG, "Result code is " + resultCode);
Uri uri = data.getData();
Log.d(TAG, "URI is " + uri.toString());
data.setAction(Intent.View);
startActivity(data);
}