Android Intents

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);

示例:

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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值