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

作者: 磨砺营 | 来源:发表于2016-12-06 15:15 被阅读114次

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

    在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权限

    相关文章

      网友评论

        本文标题:移动开发中广播你了解多少呢

        本文链接:https://www.haomeiwen.com/subject/bxjrmttx.html