广播接收者:
广播接收者的特点:
即使应用程序的进程不存在,当广播事件到来的时候,广播接受者的进程会自动的启动,响应广播事件
特殊广播事件
在android里面有一些产生非常频繁的广播事件,在清单文件里面配置是不会生效. 电量变化 屏幕锁屏/解锁 这些广播事件只能利用代码注册.
广播接收者创建的三个步骤
1,要有一个收音机。 写一个类 继承 一个类(BroadcastReceiver)
class SDCardStatusReceiver extends BroadcastReceiver
2,配置电池了 也就是在清单文件中配置,(Receiver)
3,调频道 设置action (IntentFilter里面)
当我们在广播接收者里面开启activity的时候,因为广播接收者的上下文是不包含任务栈的,因此直接开启activity会报错
怎么样才能不报错?(提示:加一个flag)
Intent i = new Intent(context,MainActivity.class);
//在广播接受者里面开启Activity需要记得加一个flag
// FLAG_ACTIVITY_NEW_TASK 告知Activity运行在自己的任务栈里面,因为广播接受者里面存在上下文
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
广播接收者,收到的广播可以是android系统发出的广播,也可以收到应用程序自己发的广播,因此要知道怎么自己去发送一个广播。
Intent intent = new Intent();
//设置一个频道,理解为指定向某个电台发送信息
intent.setAction(“com.itheima.ccav.XWLB”);
//然后带上具体的数据
intent.putExtra(“key”, “dfafadfa”);
//最后发送广播
sendBroadcast(intent);//无序广播.
有序广播:
发送有序广播
Intent intent = new Intent();
intent.setAction(“com.itheima.gov.SENDMASHROOM”);
//发送有序广播
//intent 意图
//receiverPermission 权限 默认null
//resultReceiver 结果接受者 null
//消息处理器 null 默认
// Bundle null额外的数据
sendOrderedBroadcast(intent, null, new MyReceiver(), null, 1, “主席讲话: 每人10斤蘑菇”, null);
是否可以被拦截?(调用了什么方法?)
abortBroadcast()
收到广播的顺序是由什么决定的?怎么配置?
(优先级) 在intent-fileter 中 priority属性设置
最高值多少?最低值是多少?如果大家都把自己设置成了1000最高的优先级,谁先收到呢?
(1000,-1000) , 谁先装到手机上,就谁先收到
串改数据的api?拿到数据的api?
(getResultData,setResultData)这两个方法,只有在有序广播的时候才有用!
当发送有序广播的时候,可以设置一个参数(resultReceiver)作用是什么?,
它可以拿到广播最后的数据,即使广播被终止了!! 并且不需要在清单文件中配置
无序广播:和有序比较即可,能操作的功能很少,没有有序广播这么多。
静态注册广播 (在清单文件中配置)
动态注册广播(用代码的方式注册广播) (广播是否可以直接new出来?)
动态注册广播的api?
//注册广播接受者
receiver = new XXXXXXX();
//就类似于在清单文件中的<intent-fileter>
IntentFilter filter = new IntentFilter();
//相当于清单文件里面的action标签
filter.addAction("android.intent.action.SCREEN_OFF");
filter.addAction("android.intent.action.SCREEN_ON");
//最后注册广播
registerReceiver(receiver, filter);
取消广播的api? 一般放在哪里呢?
unregisterReceiver(receiver);
一般放在onDestory()方法里面,
了解完基本的api之后 自己试试写一写,当我activity之间通信、传递数据的时候,
用动态注册广播的方式给另一个activity传递数据。(练习)!!!!!!
先自己敲一下,然后有什么地方卡着了,可以看我给大家的demo代码
练习一下:
短信的广播接收者 主要练习怎么将intent中的短信内容读取出来
ip拨号器 怎么串改数据!(setResultData)
以及手机屏幕解锁以及关闭的广播!!(动态注册)
服务的入门:
服务是专门放一些不需要界面显示的代码,让用户感觉上是运行在后台的一种组件
怎么创建一个服务(创建一个类,继承一个什么类?,清单文件中配置)
一个类继承service,重写一下oncreate方法,清单文件中配置标签
开启和关闭服务的代码api是什么呢? 提示; start , stop
Intent intent = new Intent(this,DemoService.class);
startService(intent);
//关闭服务
stopService(intent);
注意: 服务是运行在主线程里面(main), 不可以直接在服务里面编写耗时的逻辑.
回顾服务的生命周期 记忆的时候,和activity相比较,能理解的更深刻!
oncreate- onstart(因为和activity的概念相冲突,因此不推荐使用了)-onstartCommand-onDestory
当多次启动服务的时候,会多次调用oncreate方法吗?会多次调用什么方法?
不会,onCreate方法只会调用一次,onStart和onStartCommand会被调用多次
销毁的时候会多次调用ondestory方法?
不会,只会调用一次
为什么使用服务?如果仅仅使用线程的话?于使用服务有什么区别呢?
如果单纯的在activity中启动一个线程,然后关闭activity了,那么当前应用程序的
进程,就会成为一个空进程了。这样的后果是空进程的优先级非常的低,因此当内存不足的时候
很容易被回收。
如果用了服务,那么就算activity被关闭了,因为进程中还存在着service服务,那么应用程序的
进程优先级还是在 服务进程 这个级别的,不是很容易被回收!!!! 并且 并且 并且!就算被
回收了,当手机内存空间又充足的时候会重新开启!!!!!!!
进程的优先级
Foreground process
前台进程: 用户正在操作的应用程序所在的进程就是前台进程
Visible process
可视进程: 用户已经不能操作这个应用程序了,但是界面用户仍然可以看到
Service process
服务进程: 应用程序有一个服务代码正在运行
Background process
后台进程: 应用程序有界面,但是界面被用户最小化(home)
Empty process
空进程: 应用程序没有任何运行的Activity,service.
前台进程>可视进程>服务进程>后台进程>空进程