• Broadcast


    动态注册

    如何创建一个广播接收器,首先创建一个新类,让其继承BroadcastReceiver,并重写父类的onReceive方法。当有广播来到时,onReceive方法就会得到执行,具体的逻辑可以在这个方法中处理。这里我们以监听网络变化为例。

    public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    
        private IntentFilter intentFilter;
        private NetworkChangReceiver networkChangReceiver;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            intentFilter = new IntentFilter();
            intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
            networkChangReceiver = new NetworkChangReceiver();
            registerReceiver(networkChangReceiver, intentFilter);
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            unregisterReceiver(networkChangReceiver);  //动态注册的广播器一定要记得注销
        }
    
        class NetworkChangReceiver extends BroadcastReceiver {
            @Override
            public void onReceive(Context context, Intent intent) {
                ConnectivityManager connectionManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
                NetworkInfo networkInfo = connectionManager.getActiveNetworkInfo();
                if (networkInfo != null && networkInfo.isAvailable()) {
                    Toast.makeText(context, "network is available", Toast.LENGTH_LONG).show();
                } else {
                    Toast.makeText(context, "network is unavailable", Toast.LENGTH_LONG).show();
                }
            }
        }
     
    }
    

    需要注意的是,这里访问系统的网络状态需要声明权限。

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

    发送自定义广播

    静态注册一个广播 MyBroadcastReceiver,右击项目,New->Service。

    MyBroadcastReceiver代码如下

    public class MyBroadcastReceiver extends BroadcastReceiver {
    
        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(context, "received in MyBroadcastReceiver", Toast.LENGTH_SHORT).show();
        }
    }
    

    编写AndroidManifest.xml,让MyBroadcastReceiver 接收一条值为test的广播。

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

    接着,添加一个按钮,注册对这个按钮的监听事件,发送值为test的广播。

     @Override
        public void onClick(View view) {
            switch (view.getId()) {
                case R.id.button:
                    Intent intent =new Intent("test");
                    sendBroadcast(intent);
            }
        }
    

    发送有序广播

    1. 使用sendOrderBroadcast()发送有序广播,里面有两个参数,一个是Intent,另外一个和权限相关
    2. 在receiver的intent-filter中给广播设置priority,也就是优先级,数字越大优先级越高
    3. 得到接收广播的优先权后,就可以选择是否继续传递广播,在创建的广播接收器中使用abortBroadcast()可以截断广播

    使用本地广播

    前面我们发送和接收的广播属于系统全局广播,即发出的广播可以被其他人任何应用程序接收,并且我们也可以接收来自于其他应用任何应用程序的广播。这样很容易引起安全问题,为此Android引入一套本地广播机制,使用这个机制发出的广播只能够在应用程序内部进行传递,并且广播接收器也只能接收来自本应用程序发出的广播。本地广播的用法并不复杂,主要就是使用一个LocalBroadcastManager来对广播进行管理,并提供发送广播和注册广播的方法。

    首先我们通过LocalBroadcastManager的getInstance()得到它的一个实例。

    LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);

    剩下的和动态注册的代码基本一致,不同的地方是,我们是用localBroadcastManager.registerReceiver()来注册监听器,用
    localBroadcastManager.unregisterReceiver()来销毁监听器,用localBroadcastManager.sendBroadcast()发送广播。

  • 相关阅读:
    regulation
    Java第三方类库
    python整个小服务器
    VsFTP出现500 OOPS: cannot change directory的解决办法
    Got error 28 from storage engine
    linux下ftp操作
    linux安装JDK
    Apache + Tomcat + Linux 集群和均衡负载 (Session 同步复制) 配置实
    怎么样才能使得PL/SQL Developer不显示系统表?
    sudo 用法
  • 原文地址:https://www.cnblogs.com/ngy-liupeng/p/15217821.html
Copyright © 2020-2023  润新知