广播
广播作为安卓四大组件之一,具有很大的作用,总结了一下广播的使用方法,希望能够帮助到一些人
1.广播概念
系统提供,应用程序之间信息传递的机制2.原理
数据发送源发送广播(按照特定的频率(action)),广播接收方可以是多个,但是要保证接收方,接收的频率(action)和发送方一
intent-filter–设置频率(action)3.用途
意图过滤器作用Intetnt-Filter–>
告诉系统我能够处理哪些事情
1>接收系统广播 安卓系统不停往外发送广播
比如电量.wifi状态…
2>接收应用程序组件之间广播
界面–服务
界面–界面
服务–服务4.适用场景
广播获取消息后,应用场景
UI更新
handler–ui更新
5.学习广播基本步骤
广播对象的创建
1>创建广播类对象对象继承BroadcastReceiver
2>要求重写onReceive{
}
广播注册分为静态注册和动图注册两种方式
1静态注册
在主配置文件添加<receiver>
节点
<intent-filter>
–意图过滤器表明我能够处理的广播
特点:常驻型广播(活一次,永久活着,Activity销毁,还能接收广播)
测试–>系统广播的接收飞行模式测试
创建FirstBroadCast类继承BroadcastReceiver,代码如下
package com.tedu.broad;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class FirstBroadCast extends BroadcastReceiver{
@Override //接收广播数据,并对数据做出处理
public void onReceive(
Context context,//上下文对象
Intent intent//意图对象(数据,频率(action))
) {
//注意:不能阻止该方法超过10s---ANR
//耗时操作不能做-网络访问,数据库获取数据
//测试wifi状态的改变
Toast.makeText(context, "飞行模式状态改变", Toast.LENGTH_SHORT).show();
}
}
MainAcitivity代码如下
package com.tedu.broad;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
AndroidManifest.xml文件中配置如下
<receiver android:name="com.tedu.broad.FirstBroadCast">
<intent-filter >
<action android:name="android.net.wifi.STATE_CHANGE"/>
<action android:name="android.net.wifi.WIFI_STATE_CHANGED"/>
<action
<!-- 飞行模式Action --> android:name="android.intent.action.AIRPLANE_MODE"/>
</intent-filter>
</receiver>
2> 动态注册广播
创建在activity目录下注册位置
activity生命周期的oncreat()
注册的方法
registerReceiver(
innerReceiver–>广播对象
, filter—>过滤器
);
注意动态注册广播要在activity生命周期结束之后解除注册
protected void onDestroy() {
//将广播解除注册
unregisterReceiver(解除注册的广播对象);
}
动态广播如果不解除注册在给报异常
MainActivity代码如下
package com.tedu.broad;
import android.os.Bundle;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.view.Menu;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends Activity {
//声明一个类内的广播
private InnerBroadCast innerReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//注册过程
//广播初始化
innerReceiver=new InnerBroadCast();
//调用注册方法注册
//intent-filter设置
IntentFilter filter=new IntentFilter();
filter.addAction("com.tedu.broad_INNER");//告诉系统我能处理声明广播
registerReceiver(innerReceiver, filter);
}
@Override
protected void onDestroy() {
//将广播解除注册
unregisterReceiver(innerReceiver);
super.onDestroy();
}
/**
* @author pjy
* 类内创建的一个广播
*
*/
class InnerBroadCast extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "InnerReciver反馈", Toast.LENGTH_SHORT).show();
}
}
/**
* @param v
* 用于处理单击按钮对广播进行发送
*
*/
public void doClick(View v){
switch (v.getId()) {
case R.id.main_send_btn:
Intent intent=new Intent("com.tedu.broad_INNER");
//发送广播方法
sendBroadcast(intent);
break;
}
}
}
通过广播传递数据
发送数据
借助intent putExtra(“key”,value);获得数据
get…Extra(“key”);
广播的分类
无序广播
特点:只要注册相应频率(action)任何广播接收器都可以接收有序的广播
特点:传递有顺序,先接收广播的可以将广播中断,通过abortBroadcast()方法来中断广播,后序接受者收不到消息
注意如果无序广播调用这个方法出现异常接收的信息进行修改
setResult..();获取接收到的信息
getResult..();广播的优先级:
1> 如果没有设置任何优先条件的话.
在主配置文件里边谁先注册的谁先接收消息
2>人为干涉优先级
优先级所在位置 intent-filter标签里有属性
<intent-filter
android:priority=""
>
priority="整型变量"
优先数值大会优先接收
3>匹配action(频道)相同又没有优先级设置的话,动态广播先于静态广播接收