zoukankan      html  css  js  c++  java
  • 四大组件-广播

    广播接收器(Broadcast Receiver)

    Android 中每个程序都可以对自己需要的广播进行注册,这样的话就能就收到注册广播所发送的内容。

    这些广播可以是系统的也可以其他应用程序的。

    1.广播类型

    广播分两种类型:

    标准广播:完全异步的广播,发出广播后所有注册这个广播的程序都会在同一时刻收的这条广播。

    有序广播:是一种同步执行的广播,在广播发出后同一时刻只能有一个广播接收器接收这条广播,只有这个接收器中的逻辑执行完毕后,广播才会继续传递。广播是有先后顺序的,优先级高的广播接收器先接收到广播,可以通过 <receiver ... <intent-filter android:priority="100"> 来设置优先级,并且还可以通过 abortBroadcast(); 将这条广播截断。

    2.接收广播

    注册广播的两种方式:动态 注册、静态注册

    • (1)动态注册(监听网络状态变化案例)

    动态注册可以自由的控制注册和注销,但是必须得在程序运行之后才可以接收到广播。

    首先声明网络权限

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    

    创建一个NetworkChangeReceiver类继承自BroadcastReceiver

        class NetworkChangeReceiver extends BroadcastReceiver {
    
            @Override  //当网络状态发生变化时执行
            public void onReceive(Context context, Intent intent) {
              
    			//得到ConnectivityManager实例 再得到NetworkInfo实例 来判断网络状态
                ConnectivityManager connectivityManager = (ConnectivityManager)
                        getSystemService(Context.CONNECTIVITY_SERVICE);
                NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
                if (networkInfo != null && networkInfo.isAvailable()) {
                    Toast.makeText(context, "Network is available", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(context, "Network is unavailable", Toast.LENGTH_SHORT).show();
                }
            }
        }
    

    然后MainActivity重注册广播

    public class MainActivity extends AppCompatActivity {
    
        private NetworkChangeReceiver networkChangeReceiver; //接收器
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            //动态注册
            IntentFilter intentFilter = new IntentFilter();  
            intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); //添加想要监听的广播
            networkChangeReceiver = new NetworkChangeReceiver();
    
            registerReceiver(networkChangeReceiver, intentFilter); //注册广播
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            unregisterReceiver(networkChangeReceiver);  //活动销毁后 取消注册
        }
    
    • (2)静态注册(开机启动)

    未启动程序的情况下就可以接收到广播

    首先声明权限

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
    

    通过Android Studio 来快捷的创建一个广播接收器。

    右键包名 --》New--》Other--》Broadcast Receiver ,接着会弹出创建窗口,我们可以设置两个属性,

    这两个属性分别是:

    Exported :是否允许这个广播接收器接收本程序以外的广播;

    Enabled :是否启用这个广播接收器。

    接着就帮我们创建好了 MyReceiver,

    public class MyReceiver extends BroadcastReceiver {
        public MyReceiver() {
        }
        @Override
        public void onReceive(Context context, Intent intent) {
           Toast.makeText(context, "Starting up", Toast.LENGTH_SHORT).show(); //Toast
        }
    }
    
    

    我们只需要在 onReceive() 写入我们想要执行的逻辑就行。

    注意:onReceive()方法中不要在执行过多逻辑或者耗时操作,而且该方法中不允许开启线程,

    并且清单文件中自动创建了注册代码

            <receiver
                android:name=".MyReceiver"
                android:enabled="true"
                android:exported="true">
               <intent-filter>
                    <action android:name="android.intent.action.BOOT_COMPLETED"/>
                </intent-filter>
            </receiver>
    

    android:name 指定注册哪一个广播接收器

    <intent-filter> 中添加我们要监听的 Action

    3.发送自定义广播

    • 发送标准广播:
            Intent intent=new Intent("com.tiger.broadcasttest.mytest");
            sendBroadcast(intent);
    

    这样的话所有监听 com.tiger.broadcasttest.mytest 这条广播的接收器都会受到这条消息。

    另外因为我们是通过Intent进行传递的,我们还可以携带一些数据给其他广播接收器。

    • 发送有序广播:
            Intent intent=new Intent("com.tiger.broadcasttest.mytest");
            sendOrderedBroadcast(intent,null);
    

    4.Receiver 中开启活动

    如果想要在广播接收器中开启活动需要 在Intent中添加 FLAG_ACTIVITY_NEW_TASK,否则会报错,因为需要一个栈来存储打开互动

        @Override
        public void onReceive(Context context, Intent intent) {
    
            Toast.makeText(context, "Boot complete!", Toast.LENGTH_SHORT).show();
            Intent intentStartActivity=new Intent(context,MainActivity.class);
            intentStartActivity.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(intentStartActivity);
        }
    

    5.Receiver 中开启服务

        @Override
        public void onReceive(Context context, Intent intent) {
    
            Toast.makeText(context, "Start myservice ", Toast.LENGTH_SHORT).show();
            Intent startService=new Intent(context,MyService.class);
            context.startService(startService);
        }
    
    文章部分内容摘自网络和图书,如有侵权,请联系我。
  • 相关阅读:
    c# 三层结构的简单理解
    浅析C#鼠标右键如何添加
    三层结构开发的理解
    Windows快捷键大全
    command 中 ExecuteScalar() ExecuteNonQuery ()和ExecuteReader()的用法
    很拽的JSON
    FCKeditor的全局API
    WebForm_DoPostBackWithOptions 丢失的解决
    闭包的错误例子
    XPath学习笔记 XPath数据模型
  • 原文地址:https://www.cnblogs.com/-Tiger/p/7450645.html
Copyright © 2011-2022 走看看