Published on

一起学Android-广播

Authors
  • avatar
    Name
    noodles
    每个人的花期不同,不必在乎别人比你提前拥有

广播是安卓内的消息通知机制,通过接收广播消息应用能收到系统级的消息通知/其他应用的消息通知。

接收广播

声明接收器

声明接收器是通过在AndroidManifest.xml中声明广播的方式来实现广播的注册。这种方式在应用级别26以上不再支持。实现方式如下:

创建broadcast receiver

    public class MyBroadCast extends BroadcastReceiver {
    // 创建MyBroadCast 实现onReceive 
    // 当接收到广播时 会调用onReceive
        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(context, "receive broadcast", Toast.LENGTH_SHORT).show();
        }
    }

在Manifest中定义receiver

    // 定义receiver
    <receiver android:name=".MyBroadCast" android:exported="true" android:enabled="true" >
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>
    // 权限声明
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

上下文注册接收器

创建broadcast receiver

同声明接收器创建方式

在活动中注册broadcast receiver

    public class MainActivity extends AppCompatActivity {
        private MyBroadCast myBroadCast;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            // 创建广播接收器
            myBroadCast = new MyBroadCast();
            IntentFilter intentFilter = new IntentFilter();
            // 监听网络变化
            intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
            // 注册广播接收器
            registerReceiver(myBroadCast, intentFilter);
        }

        @Override
        protected void onDestroy() {
          //销毁监听
          super.onDestroy();
          unregisterReceiver(myBroadCast);
        }
    }
接收广播

发送广播

Android提供以下三种方式发送广播:

下面发送本地广播的实现方式:

    public class MainActivity extends AppCompatActivity {
        private MyBroadCast myBroadCast;
        private String actionName = "com.example.broadcast.MainActivity.SHOW_TOAST";
        private LocalBroadcastManager localBroadcastManager;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            // 获取LocalBroadcastManager 实例
            localBroadcastManager = LocalBroadcastManager.getInstance(this);
            Button button = (Button) findViewById(R.id.broadcast);
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // 发送广播
                    Intent intent = new Intent(actionName);
                    localBroadcastManager.sendBroadcast(intent);
                }
            });
            myBroadCast = new MyBroadCast();
            IntentFilter intentFilter = new IntentFilter();
            intentFilter.addAction(actionName);
            // 注册接收特定类型的广播
            localBroadcastManager.registerReceiver(myBroadCast, intentFilter);
        }

        @Override
        protected void onDestroy() {
            super.onDestroy();
            // 销毁广播
            localBroadcastManager.unregisterReceiver(myBroadCast);
        }
    }