广播接收者
安卓系统:相当于广播电台:提供各种广播事件 电话 电量 sd卡状态等等
广播接收者:相当于一台收音机,我们可以接收到系统广播事件执行相应的代码.即使应用程序进程关闭 也可以接到广播
用法:
新建一个广播接收者
new->other->Broadcast Receiver
也可以自己新建一个class 继承BroadcastReceiver 重写 onReceiver方法
创建好的接收者回有一条抛异常的代码 删掉就好
throw new UnsupportedOperationException("Not yet implement");
系统广播接收方法:
我们试着 监听系统的广播事件,系统启动的广播,实现应用开机启动
2.去清单文件配置
配置是必须的,有个例外最后会提到.
<receiver
<!--接收者的名字-->
android:name=".MyReceiver1"
<!--是否可以new它的实例-->
android:enabled="true"
<!--4.4后特有 其他应用是否可以访问-->
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
其中action后面就是要匹配的系统启动时的广播
需要注意的是这里需要一个加一个权限
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission>
回到我们自己建的广播接收者里面 在onReceiver方法里写上启动页面的代码
Intent intent1 = new Intent(context,MainActivity.class);
//由于这样开启页面没有任务栈,我们需要自己建一个
intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent1);
开机启动功能完成
自定义广播
概念:自定义广播分为无序和有序
- 无序广播:这种广播不可被终止,内容不可被改变
自定义发送无序广播方法:
我们通过一个按钮来发广播
public void click(View view) {
Intent intent = new Intent();
//通过putExtra携带了一个数据 键是data值是 电视节目播出了
intent.putExtra("data","电视节目播出了");
intent.setAction("com.aaaaa.intent");
sendBroadcast(intent);
}
我们在清单文件配置稍微有点不同,这里是我们自己定义广播事件
<receiver
android:name=".MyReceiver1"
android:enabled="true"
android:exported="true">
<intent-filter>
<!--后面变成了自己定义的广播事件-->
<action android:name="com.aaaaa.intent" />
</intent-filter>
</receiver>
接广播
package p5.itheima.com.app2;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class MyReceiver1 extends BroadcastReceiver {
public MyReceiver1() {
}
@Override
public void onReceive(Context context, Intent intent) {
/**
*广播携带数据 通过getStringExtra接收
*/
String action = intent.getStringExtra("data");
Toast.makeText(context, action, Toast.LENGTH_SHORT).show();
}
}
有序广播
开发者可以自己定义的另一种广播,这种广播的特点是一级一级传递可以被一个程序终止 修改数据 也可以通过配置参数监视数据最后传播的状态
public void click(View view) {
Intent intent = new Intent();
intent.setAction("com.itheima.intent");
sendOrderedBroadcast(intent,null,new FinalReceiver(),new Handler(),1,"凌晨三点半在屋顶一起看日出",null);
}
sendOrderedBroadcast参数详解:
- 第一个参数:意图,将intent传入就好
- 第二个参数:接收权限
- 第三个参数:广播接收者类型,可以将这广播个视为最终广播.可以检查数据最后传递的状态.
- 第四个参数:Handler 实例.自己定义一个实例即可
- 第五个参数:int类型的初始码,一个标识,自己随便定义一个int类型的值
- 第六个参数:通过String携带的数据.这是有序广播特有的
- 第七个参数:Bundle,底层一个map,表示是否接收一个额外的数据
有序广播的层级接受方法:
先建好Receive,注意在清单文件里配置
<intent-filter
android:prioity="100"
>
<action android:name="com.itheima.intent"></action>
</intent-filter>
这个action是 上面写好的action.要保持一致
android:prioity=”100”是优先级属性 范围是+1000到-1000可以决定接受广播的优先度
在新建行的Receive里的onReceive方法里写接收代码
public void onReceive(Context context,Intent intent){
//这里我们可以取出传递来的数据
String data = getResultData();
//通过Toast弹一下证明我们取到了数据
Toast,makeText(context,data,Toast.LENGTH_SHORT).show();
}
同理我们可以写出很多这样的接受方法 只是修改优先级便可以决定接受顺序.我们可以在接受时修改数据 让后面接收到的数据不同
public void onReceive(Context context,Intent intent){
String data = getResultData();
Toast,makeText(context,data,Toast.LENGTH_SHORT).show();
//通过一个方法修改数据
setResultData("凌晨三点半在家睡觉");
}
我们也可以终止数据传递
public void onReceive(Context context,Intent intent){
String data = getResultData();
//通过这个方法把传递终止
abortBroadcast();
再创建一个最终的广播接收者 也就是前面参数三定义的FinalReceiver,把它创建出来
//拿到最后的数据
String data = getResultData();
最终广播接收者无需配置优先级!它具有特权,即使数据传递被终止它一样可以拿到
特殊广播接收者
概念:当某个广播事件特别频繁时.我们就不能按常规方式去进行接收.比如屏幕关闭唤醒事件
android.intent.action.SCREEN_OFF
android.intent.action.SCREEN_ON
这时候我们需要用Context.register.Receiver()方法进行动态注册
register.Receiver()两个参数详解
- 要注册的receiver的实例
ScreenREceiver screenreceiver = new ScreenREceiver();
- 意图过滤器的实例
IntenFilte filter = new IntenFilter();
在意图过滤器里面添加我们正常配置需要的action
filter.addAction("android.intent.action.SCREEN_ON");
filter.addAction("android.intent.action.SCREEN_OFF");
我们动态注册的receiver需要手动取消 当我们不需要它的时候需要执行这个方法.参数里写刚刚注册的实例.
unregisterREceiver(screenreceiver);