知识库

wiki.linsakura.com

用户工具

站点工具


wiki:book:notes:android:第一行代码-android-第2版-郭霖:第5章

这是本文档旧的修订版!


第5章 全局大喇叭——详解广播机制

简介

两种类型:标准广播、有序广播
标准广播:完全异步执行的广播。效率高,无法被截断。
有序广播:同步执行的,优先级高的先执行,并且可截断。

接收系统广播

动态注册监听网络变化

在MainActivity中添加:

class NetworkChangeReceiver extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "网络变化了", Toast.LENGTH_SHORT).show();
    }
}

然后在onCreate()中加入:

intentFilter = new IntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
networkChangeReceiver = new NetworkChangeReceiver();
registerReceiver(networkChangeReceiver, intentFilter);

onDestroy()中加入:

unregisterReceiver(networkChangeReceiver);

判断网络是否可用
首先添加访问系统网络状态的权限:

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

修改NetworkChangeReceiver:

MainActivity.java
public class MainActivity extends AppCompatActivity {
    ...
    class NetworkChangeReceiver extends BroadcastReceiver{
        @Override
        public void onReceive(Context context, Intent intent) {
            ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
            if (networkInfo != null && networkInfo.isAvailable()){
                Toast.makeText(context, "网络可用", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(context, "网络不可用", Toast.LENGTH_SHORT).show();
            }
        }
    }
}

静态注册实现开机启动

右键com.exampel.broadcasttest包 ⇒ 新建OtherBroadcast Receiver,命名为BootCompleteReceiver。

BootCompleteReceiver.java
public class BootCompleteReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "开机启动完成", Toast.LENGTH_SHORT).show();
    }
}

然后需要在AndroidManifest.xml中注册,这一步刚才Android Studio已经自动帮我们完成了。
可以看到在<application>标签内新增的标签<receiver>
另外需要再添加监听系统开机广播的权限,android.permission.RECEIVE_BOOT_COHPLETED,还要在<receiver>标签中添加<intent-filter>内容,最后添加的内容如下:

AndroidManifest.xml
...
 
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COHPLETED" />
...
        <receiver
            android:name=".BootCompleteReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>
...

备注:开机启动了程序,但是没有提示,后续查看为什么。

发送自定义广播

发送标准广播

新建MyBroadcastReceiver类。

MyBroadcastReceiver.java
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:

AndroidManifest.xml
        ...
        <receiver
            android:name=".MyBroadcastReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="com.example.broadcasttest.MY_BROADCAST" />
            </intent-filter>
        </receiver>
        ...

然后发送广播即可:

Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
sendBroadcast(intent);

发送有序广播

发送方式更改为:

sendOrderedBroadcast(intent, null);

添加android:priority="100",数字大的优先接收到广播:

AndroidManifest.xml
            ...
            <intent-filter android:priority="100">
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
            ...

最后在onReceive()中可以通过abortBroadcast();阻止广播继续传递。

wiki/book/notes/android/第一行代码-android-第2版-郭霖/第5章.1649233918.txt.gz · 最后更改: 2022/04/06 16:31 由 博丽幻月