BroadCastReceiver广播接收者

介绍广播接收者

其实BroadcastReceiver就是应用程序间的全局大喇叭,即通信的一个手段, 系统自己在很多时候都会发送广播,比如电量低或者充足,刚启动完,插入耳机,输入法改变等,系统都会发送广播,这个叫系统广播,每个APP都会收到,如果你想让你的应用在接收到 这个广播的时候做一些操作,这个时候你只需要为你的应用 注册一个用于监视开机的BroadcastReceiver, 当然我们也可以自己发广播,比如:接到服务端推送信息,用户在别处登录,然后应该强制用户下线回到 登陆界面,并提示在别处登录当然,这些等下都会写一个简单的示例帮大家了解广播给我们带来的好处

在这里插入图片描述

广播接收者生命周期

静态注册和动态注册的区别:假如说Activity是接受者:
动态注册:
(1)广播接收者会跟Activity的生命周期的结束而结束;
(2)自由的控制注册和取消,有很大的灵活性
静态注册:
(1)广播接收者不会跟随Activity的生命周期的结束而结束,一直存在,即使应用程序关闭,也会被唤醒接受广播
(2)全局的广播

实现广播接收者

首先需要创建一个java类,它继承自广播接收者BroadcastReceiver

public class MyReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO: This method is called when the BroadcastReceiver is receiving
        // an Intent broadcast.
        throw new UnsupportedOperationException("Not yet implemented");
    }
}

然后需要注册一个广播接收者

静态注册

在清单文件中注册就是静态注册

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <receiver
            android:name=".MyReceiver4"
            android:enabled="true"
            android:exported="true"></receiver>
        <receiver
            android:name=".MyLocalReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="com.local" />
            </intent-filter>
        </receiver>

        <activity android:name=".LocalActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

        <receiver
            android:name=".MyNotifyReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="com.notify" />
            </intent-filter>
        </receiver>

        <activity android:name=".Main2Activity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

        <receiver
            android:name=".MyReceiver3"
            android:enabled="true"
            android:exported="true" />
        <receiver
            android:name=".MyReceiver2"
            android:enabled="true"
            android:exported="true">
            <intent-filter android:priority="1000">
                <action android:name="FM101.3" />
            </intent-filter>
        </receiver>
        <receiver
            android:name=".MyReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="FM101.1" />
                <action android:name="FM101.2" />
            </intent-filter>
        </receiver>

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

</manifest>
动态注册

通过java代码实现注册

//动态注册广播接收者
//创建一个广播
MyReceiver myReceiver = new MyReceiver();
//添加广播过滤器
IntentFilter intentFilter = new IntentFilter();
//添加action
intentFilter.addAction("FM101.1");
intentFilter.addAction("FM101.2");
//注册广播
registerReceiver(myReceiver,intentFilter);

动态注册还需要注销广播

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

发送广播

无序广播

Intent intent = new Intent();
intent.setAction("FM101.1");

Bundle bundle = new Bundle();
bundle.putString("name","吉吉国王");

sendBroadcast(intent);

有序广播

区别在于方法不同:sendOrderedBroadcast()发送的是有序广播可以被拦截

Intent intent = new Intent();
intent.setAction("FM101.3");
//intent 权限名
sendOrderedBroadcast(intent,null);

拦截广播

//判断是有序广播
if (isOrderedBroadcast()){
    //中断一个广播
    abortBroadcast();
}

本地广播

Activity代码:

public class LocalActivity extends AppCompatActivity {
    private Button btnLocal;
    private ImageView ivPic;

    private LocalBroadcastManager broadcastManager;
    private MyLocalReceiver myLocalReceiver= new MyLocalReceiver();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_local);
        ivPic = (ImageView) findViewById(R.id.iv_pic);
        btnLocal = (Button) findViewById(R.id.btn_local);

        final IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("com.local");

        broadcastManager = LocalBroadcastManager.getInstance(this);
        //注册
        broadcastManager.registerReceiver(myLocalReceiver,intentFilter);


        btnLocal.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.setAction("com.local");
                broadcastManager.sendBroadcast(intent);
            }
        });

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        broadcastManager.unregisterReceiver(myLocalReceiver);
    }
}
/**
 * 本地广播
 */
public class MyLocalReceiver extends BroadcastReceiver {


    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i("---", "onReceive: 本地广播");
    }
}
发布了13 篇原创文章 · 获赞 0 · 访问量 2943

猜你喜欢

转载自blog.csdn.net/weixin_45697390/article/details/104657439
今日推荐