Android——广播初介绍

Android四大组件中的BroadcastReceiver用于接受程序(包括用户开发的程序和系统内建的程序)所发出的Broadcast Intent,与应用程序启动Activity,Service相同的是
程序启动BroadcastReceiver也只需要两步
一:创建需要启动的服务的意图 BroadcastReceiver 的Intent
二:调用Content的sendBroadcast()或seendOrderedBroadcast()方法来启动指定的BroadcastReceiver
当应用程序发出一个Broadcast Intent之后,所以匹配该Intent的BroadcastReceiver都有可能被启动

与Activity,Service具有完整的生命周期不同,BroadcastReceiver本质上只是一个系统级的监听——它是专门负责监听各程序发出的Broadcast 广播

下面代码

创建继承BroadcastReceiver的类
  
  
1
import android.content.BroadcastReceiver;
2
import android.content.Context;
3
import android.content.Intent;
4
import android.os.Binder;
5
import android.os.Bundle;
6
import android.widget.Toast;
7
8
/**
9
 * Created by YacaToy on 2017/6/25.
10
 */
11
12
public class MyBroadcastReceiver extends BroadcastReceiver {
13
    @Override
14
    public void onReceive(Context context, Intent intent) {
15
        Toast.makeText(context,intent.getAction()+"/------/"+intent.getStringExtra("msg"),Toast.LENGTH_SHORT).show();
16
    }
17
}
代码注册广播监听
1
        IntentFilter filter = new IntentFilter("com.yacatoy.mydata.TEST_BROAD");
2
        MyBroadcastReceiver myBroadcastReceiver = new MyBroadcastReceiver();
3
        registerReceiver(myBroadcastReceiver,filter);
清单文件注册
1
<receiver android:name=".MyBroadcastReceiver">
2
            <intent-filter android:priority="20">
3
                <action android:name="com.yacatoy.mydata.TEST_BROAD"></action>
4
            </intent-filter>
5
        </receiver>
启动
1
bt_send.setOnClickListener(new View.OnClickListener() {
2
            @Override
3
            public void onClick(View v) {
4
                Intent intent =new Intent();
5
                intent.setAction("com.yacatoy.mydata.TEST_BROAD");
6
                intent.putExtra("msg","放出的数据");
7
                sendBroadcast(intent);  //有序广播
8
             //   sendOrderedBroadcast(intent,null);
9
            }
10
        });
这里主要下
Bundle 广播出来的类型

上面介绍的有序广播。下面来说说无序广播
广播被分为两种不同的类型:“无序广播(Normal broadcasts)”和“有序广播(Ordered broadcasts)”。
普通广播是完全异步的,可以在同一时刻(逻辑上)被所有广播接收者接收到,消息传递的效率比较高,
但缺点是:接收者不能将处理结果传递给下一个接收者,并且无法终止广播Intent的传播;
然而有序广播是按照接收者声明的优先级别(声明在intent-filter元素的android:priority属性中,
数越大优先级别越高,取值范围:-1000到1000。也可以调用IntentFilter对象的setPriority()进行设置),
被接收者依次接收广播。如:A的级别高于B,B的级别高于C,那么,广播先传给A,再传给B,最后传给C。
A得到广播后,可以往广播里存入数据,当广播传给B时,B可以从广播中得到A存入的数据。
(从其他地方扒的  http://blog.csdn.net/jiangwei0910410003/article/details/19150705)
广播大小级别的设置
1
<receiver android:name=".MyBroadcastReceiver">
2
            <intent-filter android:priority="20"> <!-- 大-->
3
                <action android:name="com.yacatoy.mydata.TEST_BROAD"></action>
4
5
            </intent-filter>
6
7
        </receiver>
8
9
        <receiver android:name=".MyBroadcastreciverTow">
10
            <intent-filter android:priority="0">  <!--小-->
11
                <action android:name="com.yacatoy.mydata.TEST_BROAD"></action>
12
            </intent-filter>
13
        </receiver>

用sendBroadcast是无序广播
用sendOrderendBroadcast是有序广播


下面代码

级别为20的广播接受者
1
import android.content.BroadcastReceiver;
2
import android.content.Context;
3
import android.content.Intent;
4
import android.os.Binder;
5
import android.os.Bundle;
6
import android.widget.Toast;
7
8
/**
9
 * Created by YacaToy on 2017/6/25.
10
 */
11
12
public class MyBroadcastReceiver extends BroadcastReceiver {
13
    @Override
14
    public void onReceive(Context context, Intent intent) {
15
        Toast.makeText(context,intent.getAction()+"/------/"+intent.getStringExtra("msg"),Toast.LENGTH_SHORT).show();
16
17
        Bundle bundle = new Bundle();
18
        bundle.putString("first","hahahhahahhah");
19
        setResultExtras(bundle);
20
    }
21
}
22
级别为0的广播接受者
1
2
import android.content.BroadcastReceiver;
3
import android.content.Context;
4
import android.content.Intent;
5
import android.os.Bundle;
6
import android.widget.Button;
7
import android.widget.Toast;
8
9
/**
10
 * Created by YacaToy on 2017/6/25.
11
 */
12
13
public class MyBroadcastreciverTow extends BroadcastReceiver {
14
    @Override
15
    public void onReceive(Context context, Intent intent) {
16
        Bundle bundle = getResultExtras(true);
17
18
        Toast.makeText(context,bundle.getString("first"),Toast.LENGTH_SHORT).show();
19
    }
20
}
点击事件
1
bt_send.setOnClickListener(new View.OnClickListener() {
2
            @Override
3
            public void onClick(View v) {
4
                Intent intent =new Intent();
5
                intent.setAction("com.yacatoy.mydata.TEST_BROAD");
6
                intent.putExtra("msg","放出的数据");
7
//                sendBroadcast(intent);
8
                sendOrderedBroadcast(intent,null);
9
            }
10
        });
级别为20的广播介绍着接受了发出来的广播,而且向处理结果中存入了key为frist的消息,可以被级别为0的广播接受者解析出来
原Intent带来的数据还在

下面我在其他博客中找到一些笔记,我又扒下来了
有序广播特点:
1.所有广播接收者的action是一致的,发送有序广播调用 sendOrderedBroadcast()方法。
2.有序广播的接收者需要调用setPriority()方法设置广播接收者的优先级。数字越大,优先接受广播。
3.有序广播如果需要终止 广播继续往下发送,可以调用 abortBroadcast()方法切断广播。
4.先接收广播者可以将自己的处理结果通过setResultExtras()方法继续传递给下一个广播接收者。
5.后接收者可以调用 getResultExtras(true)来自己决定是否接收上一个广播传递过来的数据
粘性广播
发送广播调用的方法 sendStickyBroadcast(Intent),和sendBroadcast(Intent)不同。
粘性广播会一直保留在内存当中,直到有广播接收者注册该广播,该广播才算结束。
1.权限
1
< uses-permission   android:name="android.permission.BROADCAST_STICKY"></ uses-permission

2.粘性广播发送除了调用方法不同sendStickyBroadcast(intent1),其他都一样。
3.一般广播都是先注册广播,才能接收到广播,而粘性广播可以做到先发送广播,哪里需要接收该广播就哪里注册,可以后注册广播拿到广播的结果。这就是 普通广播和粘性广播的区别。

在Android系统源码中监测电池电量部分使用到了。
 
// Register for the battery changed event 
IntentFilter filter =  new   IntentFilter(Intent.ACTION_BATTERY_CHANGED); 
   
/ Intent is sticky so using  null   as receiver works fine 
// return value contains the status 
Intent batteryStatus =  this .registerReceiver( null , filter); 
   
// Are we charging / charged? 
int   status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, - 1 ); 
boolean   isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING 
   || status == BatteryManager.BATTERY_STATUS_FULL; 
   
boolean   isFull = status == BatteryManager.BATTERY_STATUS_FULL; 
   
// How are we charging? 
int   chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, - 1 ); 
boolean   usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB; 
boolean   acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;  

广播的基础就介绍在这里了。Android系统应用有很多广播,大伙初学的话,都是这写一下










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值