Android四大组件的学习与理解之(Intent、BroadcastReceiver、ContentProvider)

 

Intent:

 

1.开启一个Activity

页面跳转:(启动其他Activity)

Button button = (Button) findViewById(R.id.btn1);

button.setOnClickListener(new View.OnClickListener(){

@Override

public void onClick(View v) {

Intent intent = new Intent(MainActivity.this,MyActivity.class);

startActivity(intent);

}

});

}

 

 

ComponentName属性

Intent intent = new Intent();

ComponentName componentname = new ComponentName("com.aynu","com.aynu.MyActivity")

intent.setComponent(componentname);

startActivity(intent);

2.开启一个Service

3.用来传递广播

 

Action和Data属性:

ACTION_EDIT 对应data属性为: content//com.android.contacts/contacts/1

ACTION_CALL 对应data属性为:tel:10086

ACTION_VIEW http://www.xxxx.com

 

简单的按钮跳转:

Action属性和Category属性:

CateGory属性中intent.CATEGORY_HOME 和finish方法都可以返回到主屏幕,两者有什么区别???

 

Category:Category属性用于指定当前动作(Action)被执行的环境。通过addCategory()方法或在清单文件AndroidManifest.xml中设置。默认为:CATEGORY_DEFAULT。

 

Extras:Extras属性主要用于传递目标组件所需要的额外的数据。通过putExtras()方法设置。 

 

  通常我们使用Intent来直接传递Bundle对象,但也可以传递其他系统内置的一些参数。

 

 

BroadcastReceiver(广播接收者)

一:广播类型:

标准广播:完全异步执行的广播,发出广播后,所有广播接收器几乎会在同一时刻收到这条广播通知

有序广播:同步执行的一种广播,发出广播后,同一时间只有一个广播接收者能收到,当这个广播接收者的逻辑执行完毕后,才会传到下一个接收者,当然,前面的接收者还可以截断广播的继续传递,那么后续接收者就无法收到广播了

 

二:两种广播的注册方式:

动态注册:就是在Java代码中指定IntentFilter,然后添加不同的Action即可,想监听什么广播就写什么Action,另外动态注册的广播,一定要调用unregisterReceiver让广播取消注册

1.创建Servicer类

2.MainActivity中注册动态广播

静态注册:动态注册需程序启动后才能接收广播,经阿嚏广播就弥补了这个短板,在AndroidManifest中指定<IntentReceiver>就可以让程序在未启动的情况下接收到广播了

1.创建receiver类

 

2.AndroidManifest.xml中对该Receiver进行注册,添加开机广播的intent-filter!

千万要加上加上android.permission.RECEIVE_BOOT_COMPLETED的权限

使用广播的注意事项:

不要在广播里添加过多逻辑或者进行任何耗时操作,因为在广播中是不允许开辟线程的, 当onReceiver( )方法运行较长时间(超过10秒)还没有结束的话,那么程序会报错(ANR), 广播更多的时候扮演的是一个打开其他组件的角色,比如启动Service,Notification提示, Activity等!

 

发送广播:

发送广播钱需要定义一个广播接收器,不然没有东西可接收,我们需要自定义一个BroadcastReceiver,重写onReceiver()方法,注册下,

1.标准广播:sendBroadcast(intent);即可

2.有序广播sendOrdereBroadcast(intent,null)

 

前面学习的都是全局广播,这意味着只要发送广播所有APP都会收到,不安全,所以为了应对,有了本地广播

本地广播:

核心用法:使用LocalBroadcastManager来管理广播

1.调用LocalBroadcastManagergetInstance()来获得实例

2.调用~.registerreceiver()注册广播

3.调用~.sendBroadcast()发送广播

4.调用~.unregisterReceiver()取消广播

注意事项:

1.无法通过静态注册方式来接收,相比起系统全局广播更高效

2.在广播中启动Activity的话,需要为Intent加入FLAG_ACTIVITY_NEW_TASK的标记,不然会报错,因为需要一个栈来存放新打开的Activity

3.广播中弹出AlertDialog的话,需要设置对话框的类型为:TYPE_SYSTEM_ALERT,不然是无法弹出的

 

ContentProvider(内容提供者)

概念:

当我们想允许自己的应用的数据允许别的应用进行读取操作,我们可以让我们的APP实现ContentProvider类,同时注册一个URL,然后其他应用只要使用ContentResolver根据URL就可以操作我们APP中的数据了,而数据不一定是数据库,也可能是文件,xml或者其他,但是SharePreferernce使用基于数据库模型的简单表格来提供其中的数据。

1.简单的读取收件箱的信息:


其中:
 ContentResolver resolver = getContentResolver();
//对ContentProvider中的数据进行添加,删除,修改和查询操作
Uri uri = Uri.parse();//将字符串转换成URI
Cursor cursor = resolver.query();//获取信息
其中:
 ContentResolver resolver = getContentResolver();
//对ContentProvider中的数据进行添加,删除,修改和查询操作
Uri uri = Uri.parse();//将字符串转换成URI
Cursor cursor = resolver.query();//获取信息

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值