BroacastReceiver的介绍

1.清单文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="mobi.vhly.broadcastreceiverdemo"
        >

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

    <!-- 自定义权限:通常消息推送 大量使用自定义权限 -->
    <permission android:name="com.qianfeng.permission.TEST_1_PERMISSION"/>
    <uses-permission android:name="com.qianfeng.permission.TEST_1_PERMISSION"/>

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

    <!-- <uses-permission android:name="android.permission.BROADCAST_SMS"/> -->
    <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:supportsRtl="true"
            android:theme="@style/AppTheme"
            >
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>

        <!-- 清单文件注册广播接收者,属于静态注册 -->

        <receiver android:name=".receivers.NetworkReceiver">
            <intent-filter>

                <!-- action 内部指定的内容,就是广播的信息类型 -->
                <!-- 代表广播接收者接收网络状态变化的广播Intent -->
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
            </intent-filter>
        </receiver>
        <receiver
                android:name=".receivers.Normal1Receiver"
                android:enabled="true"
                android:exported="false"
                >
            <intent-filter android:priority="3">
                <action android:name="com.qianfeng.ACTION_TEST_0"/>
            </intent-filter>
        </receiver>
        <receiver
                android:name=".receivers.Normal0Receiver"
                android:enabled="true"
                android:exported="false"
                >
            <!--priority数字越大优先级越高-->
            <intent-filter android:priority="4">
                <action android:name="com.qianfeng.ACTION_TEST_0"/>
            </intent-filter>
        </receiver>
        <receiver
                android:name=".receivers.SmsReceiver"
                android:enabled="true"
                android:exported="true"
                >
            <intent-filter android:priority="1000">
                <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
            </intent-filter>
        </receiver>

        <!--
             permission 属性是 sendOrderedBroadcast 内部指定的内容,
            这个权限内容,需要在清单文件最上方定义
        -->
        <receiver
                android:name=".receivers.Ordered1Receiver"
                android:enabled="true"
                android:exported="false"
                android:permission="com.qianfeng.permission.TEST_1_PERMISSION"
                >
            <intent-filter android:priority="-2">
                <action android:name="com.qianfeng.ACTION_TEST_1"/>
            </intent-filter>
        </receiver>
        <receiver
                android:name=".receivers.Ordered0Receiver"
                android:enabled="true"
                android:exported="false"
                >
            <intent-filter android:priority="-1">
                <action android:name="com.qianfeng.ACTION_TEST_1"/>
            </intent-filter>
        </receiver>

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

</manifest>
2.无序广播接收者实例:

1)Normal0Receiver.java

public class Normal0Receiver extends BroadcastReceiver {
    public Normal0Receiver() {
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d("Normal", "Normal0 received!");
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        Log.d("Normal", "Normal0 Finished!");

    }
}

2)Normal1Receiver.java

public class Normal1Receiver extends BroadcastReceiver {
    public Normal1Receiver() {
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d("Normal", "Normal1 received!");
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        Log.d("Normal", "Normal1 Finished!");
    }
}

3.UI线程

public class MainActivity extends AppCompatActivity {

    // 动态注册部分:
    // 1. 创建一个BroadcastReceiver对象
    // 2. 通过代码来注册要接收哪些广播信息
    // 3. 不需要接收的时候,直接取消注册就可以了

    private BroadcastReceiver mReceiver = new BroadcastReceiver() {

        /**
         * 1. onReceive 默认执行在主线程,希望运行于子线程那么使用Handler
         * 2. onReceive 方法在主线程执行时,允许执行最长10s,超过则被系统强制终止
         * 3. 静态注册的广播接收者只要onReceive方法完成,那么创建的对象也会被系统删除
         * 4.
         * @param context
         * @param intent
         */
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if(action.equals(Intent.ACTION_BATTERY_CHANGED)){
                // BatteryManager 内部定义了Intent中包含的各种EXTRA
                int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
                int plugged = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0);
                Log.d("Battery", "Level = " + level);
                Log.d("Battery", "plugged = " + plugged);
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    protected void onResume() {
        super.onResume();
        Context context = this;


        /*

        <receiver name="xxx$1">
            <intent-filter>
                <action name="Battery......"/>
            </intent-filter>
        </receiver>

         */

        IntentFilter filter = new IntentFilter();
        // 电量变化的广播,!电量变化只能用动态注册来监听
        filter.addAction(Intent.ACTION_BATTERY_CHANGED);
        context.registerReceiver(mReceiver, filter);
    }

    @Override
    protected void onPause() {
        super.onPause();
        unregisterReceiver(mReceiver);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main_menu, menu);
        return true;
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
    }

    public void btnSendNormal(View view) {
        // 广播信息
        Intent intent = new Intent("com.qianfeng.ACTION_TEST_0");
        intent.putExtra("name", "admin");
        Context context = this;
        // 发送无序广播
        context.sendBroadcast(intent);
    }

    public void btnSendOrdered(View view) {
        Intent intent = new Intent("com.qianfeng.ACTION_TEST_1");
        //sendOrderedBroadcast(intent, null);

        // 参数2:是定义的权限,只有声明使用这个权限内容的广播接收者才可以接收到广播消息
        sendOrderedBroadcast(intent, "com.qianfeng.permission.TEST_1_PERMISSION");
    }

    public void btnSendLocal(View view) {

        // 本地广播管理器
        LocalBroadcastManager manager = LocalBroadcastManager.getInstance(this);
        Intent intent = new Intent("com.qianfeng.ACTION_TEST_2");
        // 发送无序普通的广播
        manager.sendBroadcast(intent);
        // 发送广播,并且等待所有的广播发送给广播接收者,当所有广播接收者执行完成,
        // 这个方法才会结束
        manager.sendBroadcastSync(intent);
    }
}
4.有序广播接收者

1)接收者一

public class Ordered0Receiver extends BroadcastReceiver {
    public Ordered0Receiver() {
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d("Receiver", "Ordered0 Receive");
        //abortBroadcast();

        // 设置处理的结果
        Bundle extras = new Bundle();
        extras.putString("name", "admin");
        setResult(998, "Hello", extras);

    }
}
2)接收者二

public class Ordered1Receiver extends BroadcastReceiver {
    public Ordered1Receiver() {
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d("Receiver", "Ordered1 Receive");

        // Intent 参数传递的是初始的 广播信息

        int code = getResultCode();
        String data = getResultData();
        // 获取传递的参数
        Bundle extras = getResultExtras(true);

        Log.d("Receiver", "code = " + code);
        Log.d("Receiver", "data = " + data);
        Log.d("Receiver", "extras = " + extras);
    }
}

5.开机启动广播接收者

BootReceiver.java

public class BootReceiver extends BroadcastReceiver {
    public BootReceiver() {
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d("BOOT", "手机启动了");

        NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
        Notification n =
                builder.setContentTitle("启动了")
                        .setContentText("检测到手机启动")
                        .setSmallIcon(R.mipmap.ic_launcher)
                        .build();

        NotificationManagerCompat managerCompat = NotificationManagerCompat.from(context);
        managerCompat.notify(998, n);
    }
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值