《Android 开发艺术探索》随手笔记——第一章Activity生命周期和启动模式

IntentFilter 匹配规则

Action匹配:

1> Intent 中必须至少有一个action,否则无法发起隐式Intent请求,报错。

2> 一个intent-filter中可以有多个action 

3>action 区分字母大小写

详细说明:


intent中可以只有一个action,intent-filter中可以有一个,也可以有多个。只要intent的action在filter中就能匹配成功。

intent 也可以包含多个action,如果要匹配成功。这些action,必须全部在intent-filter中 。即intent =< intent-filter(所有的action都必须在intent-filter中找到。intent-filter 的action 包含所有 intent 中的action)

intent中至少有一个action,因为 intent =< intent-filter , 经过测试,intent 没有action,不论intent-filter中没有action还是只有一个action。都会报错。所以,至少intent 和 intent-filter 都至少有一个action。


Intent启动的两种写法

一、

                Intent intent = new Intent("com.ryg.charpter_1.c");
                startActivity(intent);

二、

                Intent intent = new Intent();
                intent.setAction("com.ryg.charpter_1.c");
                intent.setAction("com.ryg.charpter_1.d");
                startActivity(intent);

注意是setAction 不是addAction。


Intent-Filter 的注册方法静态和动态,比如广播接收器

静态:

<!--广播注册-->  
        <receiver android:name=".SmsBroadCastReceiver">  
            <intent-filter android:priority="20">  
                <action android:name="com.ryg.charpter_1.c<span style="font-family: Arial, Helvetica, sans-serif;">"/>  </span>
            </intent-filter>  
        </receiver>  
动态:

	//初始化广播
	private void initBroadCast(){
		localBroadcastManager = LocalBroadcastManager.getInstance(mContext);
		IntentFilter intentFilter = new IntentFilter();
		intentFilter.addAction(SIGNUP_SUCCESS_TO_LOGIN_ACTION);//可以增加多个action
		broadcastReceiver = new BroadcastReceiver() {
			@Override
			public void onReceive(Context context, Intent intent) {
				String login_code = intent.getStringExtra("login_code");
				vUserNameEditText.setText(login_code);
				vPasswordEditText.requestFocus();
			}
		};
		localBroadcastManager.registerReceiver(broadcastReceiver, intentFilter);
	}

Category匹配规则

1>Intent 中不管有几个category,每个category都必须在intent-filter 过滤器中找到。即 Intent =< Intent-filter  

2> Intent中可以不包含任何category,这是因为,Intent启动时,startActivity 和startActivityForResult ,系统会自动增加一个category:android.intent.category.DEFAULT

3> 自定义Intent-Filter 必须包含

<category android:name="android.intent.category.DEFAULT" />


Data 匹配规则

data 结构:

data由两部分组成,mimeType 和URI 。mimeType 指媒体类型,比如 image/jpeg 、audio/mpeg4-generic  和 video/* 等。可以表示图片、文本、视频等不同的媒体格式。

URI 结构:

<scheme>://<host>:<port>/[<path> | <pathPrefix> | <pathPattern>]

比如:

content://com.example.project:200/folder/subfolder/etc

http://www.baidu.com:80/search/info


如果URI中没有指定scheme和host 那么整个URI 是无效的。


过滤器中没有指定URI ,但是有默认值,URI的默认值为content 和 file 。


* 如果intent指定了完整的data,必须调用setDataAndType方法,不能先调用setData,再调用setType。因为这两个方法彼此会清除对方的值,看Android源码就能理解。


1、匹配规则与action类似,只要有一个data匹配就可以。 也是 intent =< intent-filter 但是有点不同。就是intent 和 intent-filter 中都同时没有data。就是隐式匹配中没有data的匹配。

2、如果 intent-filter中 定义了data 过滤器,那么intent中必须含有data,并且至少一个data,并且要匹配data过滤器中的某一个data。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值