移动开发中广播你了解多少呢

一, 我们所熟知的广播大家也比较有印象的可能是学校的喇叭通报这个,通知那个的,他是通过无线电波或导线传送声音的新闻传播工具。通过无线电波传送节目的称无线广播,通过导线传送节目的称有线广播。当年我们听到放假通知那是各种收拾准备走人,这时候我们学生就是对应的广播接收器,相对于听到的消息,进行对应的行为操作。

在Android中广播,我们能做到的是在特定的时刻发送一条广播,所有对应的广播接收器都可以做出相应的操作,从实现原理上可以看,android中的广播使用了观察者模式,基于消息的发布/订阅事件模型,因此,android中的广播将广播的发送者与接收者极大程度的解耦,使得系统能够方便集成,更易扩展。

二、学习广播,首先要了解的肯定是广播的应用场景:

1.同一app内部的同一组件的消息通信(单个或多个线程之间)

2.同一app内部的不同组件的消息通信(单个进程)

3.同一app内部具有多个进程的不同组件的消息通信

4.不同app之间的组件之间消息通信

5.android系统在特定情况下与app之间的消息通信

三,广播分为有序广播和无序广播

无序广播:接着刚才的例子,就是喇叭通知放假(即发广播)之后,学生们作为广播接收器,他们是同时下课的,因为他们接受到的广播是在同一时间发生的,因此,这一类的广播称为无序广播,

有序广播:就类似与击鼓传花游戏,喝酒敲7的游戏,当第一个人开始后,就相当于发了广播,下一个人作为广播接收器,依次向下传递。但规则只能是前一位做完游戏后,后一位才可以做游戏,因此这样的一类广播我们称之为有序广播。但值得注意的地方是广播接收器是可以截断有序广播的,一旦截断之后,后面的广播接收器就无法再被执行,就相当于上面玩游戏,第一个人向第二个人传递的时候,还没传给第三个人的时候,这个时候第三个人接了第一个人传递的,这就导致了这个游戏失败了,就得开始,因此第三个人以后的人再刚才的这场游戏中,无法继续玩游戏了。

四、了解到用法以及广播的分类,接下来我们谈谈他的使用。广播作为四大组件之一,还需要对BroadcastRecevier进行注册。注册又分为静态注册和动态注册

1.静态注册:

类似于Activity,自定义一个广播接收器之后,在清单文件(AndroidManifest.xml)中注册即为静态注册。


action就类似于显示生活中的广播的频段,当广播发送的时候需要制定后面的字符串,接收器接受的时候,也会根据该处的制定的字符串进行过滤,通常命名规范为项目的包命加上自定义的名字。

2.动态注册:

动态注册就是在java代码中进行注册BroadcastReceiver,也就是说只有在程序启动后,执行到注册代码才会注册成功,并且动态注册的广播需要解除注册才可以,

public class MainActivity extends AppCompatActivity {

private static final String My_ACTION = "com.example.administrator.broadcastdemo.MYBROADCAST";

private MyBroad myBroad;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

//初始化广播接收器对象

myBroad = new MyBroad();

//初始化过滤器,对应清单文件中receiver中的字段

IntentFilter intentFilter = new IntentFilter();

//在过滤器中添加action

intentFilter.addAction(My_ACTION);

//注册广播

registerReceiver(myBroad,intentFilter);

}

class MyBroad extends BroadcastReceiver{

@Override

public void onReceive(Context context, Intent intent) {

Log.d("MyBroad", "接收到广播");

}

}

@Override

protected void onDestroy() {

super.onDestroy();

//取消动态注册的广播

unregisterReceiver(myBroad);

}

}

静态注册与动态注册的区别:

①静态注册:在android的清单文件中注册,在程序未执行的时候就已经注册成功了。例如手机在开机之后会发送一个系统的广播,我们可以根据此广播做到开机启动应用程序。

②动态注册:在java代码中进行注册,也就是程序执行到注册代码之后,才能注册成功,并且动态注册的广播接收器需要在特定的时刻取消注册,一般在生命周期的onDestroy()方法中。

五、现在我们来学习一下自定义广播。

1.发送无序的广播:

通过Context的sendBroadCast(Intent intent)方法发送无序广播,它是完全异步的。所有receivers(广播接受器)的执行顺序是不确定的。

public class MainActivity extends AppCompatActivity {

private Button btn;

private String MyAction = "com.example.administrator.myapplication.MYBROADCAST";

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

btn = (Button) findViewById(R.id.btn);

final Intent intent = new Intent(MyAction);

btn.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

//发送无序广播

sendBroadcast(intent);

}

});

}

其中的action是我们自定义的,那我们发送个自定义的广播,我们可以看到,广播是通过Intent进行发送的,intent是连接Android组件的枢纽。

2.发送有序广播:

通过Context.sendOrderedBroadcast()来发送,所有的recevier(广播接收器)依次执行,Receiver可以使用setResult()方法来把结果传给下一个Receiver,通过getResult()方法来取得上个Receiver的返回结果,并可以以abort()方法来让系统丢弃该广播,使得改广播不再传送到下一个Receiver。Receiver可以设置优先级属性,来决定Receiver的执行顺序。

public class MainActivity extends AppCompatActivity {

private Button btn;

private String MyAction = "com.example.administrator.myapplication.MYBROADCAST";

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

btn = (Button) findViewById(R.id.btn);

final Intent intent = new Intent(MyAction);

btn.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

//发送有序的广播

sendOrderedBroadcast(intent,null);

}

});

}

六,广播接收器(BroadcastReceiver)

广播接受器就是我们平时所说的Android四大组件之一的广播,BroadcastReceiver是一个抽象类,因此我们可以自定义一个类来继承BroadRecevier,并实现它的抽象方法。

// 自定义的类继承BroadcastReceiver,并实现抽象方法

public class MyBroadCast extends BroadcastReceiver {

@Override

public void onReceive(Context context, Intent intent) {

Log.d("todo", "接受到了广播");

}

}

BroadcastRecevier的方法:

abortBroadcast() : 中止有序广播

getResultData() : 获取广播接收者之间传递的数据对象

getResultCode() :获取广播结束者之间传递的code

getResultExtras() :获取广播接收者之间传递的Bundle

setResultData(String data) :向下传递数据

setResultCode() :向下传递code

setResult(int code, String data, Bundle) :向下传递三个数据

setResultExtras(Bundle extras) :向下传递Bundle

isOrderedBroadcast() :判断是否是有序广播

广播得接收器:

public class MyBroad extends BroadcastReceiver{

@Override

public void onReceive(Context context, Intent intent) {

Log.d("MyBroad", "接收到广播");

//获取上一个Receiver中传递来的数据

int code = getResultCode();//获取一种结果代码的初始值。通常为 Activity.RESULT_OK 。这个值是 -1 ;为其他 int 型 也可以,如 0,1,2 ;

String data = getResultData();//获取广播数据

Bundle args = getResultExtras(false);//获取广播的附加信息

//向下一个Receiver传递数据,Bundle中可以携带需要的数据

setResultCode(100);

setResultData("Afanbaby");

setResultExtras(args);

//截断广播,不再向下进行传递

abo     }

}

七,接收系统的广播:

系统的广播通常是指Android系统执行的特定时刻,系统会发送特定的广播,以方便开发者获取一些数据或状态,只要涉及到手机的基本操作,基本上都会发出相应的系统广播,例如接收到短信,网络切换,系统开机的时候等等,每一个特定的广播都对应一个知己的特定action(也就是类似与频段)

下面是一些常用的系统广播:

android.intent.action.AIRPLANE_MODE 切换飞行模式时

android.intent.action.BATTERY_LOW 电池电量低时

android.intent.action.BATTERY_OKAY 电池由低到正常时

android.intent.action.BOOT_COMPLETED 系统开机成功之后

android.intent.action.PACKAGE_ADDED 成功的安装APK之后

android.intent.action.ACTION_POWER_CONNECTED 插上外部电源时发出的广播

android.net.conn.CONNECTIVITY_CHANGE 网络状态改变时

android.provider.Telephony.SMS_RECEIVED 接收短信

还有需要注意:某些广播的使用需要配合相应的系统权限,例如检查系统开机需要android.permission.RECEIVE_BOOT_COMPLETED权限;检查网络变化需要android.permission.ACCESS_NETWORK_STATE权限

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,695评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,569评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,130评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,648评论 1 297
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,655评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,268评论 1 309
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,835评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,740评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,286评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,375评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,505评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,185评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,873评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,357评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,466评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,921评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,515评论 2 359

推荐阅读更多精彩内容