这是本文档旧的修订版!
两种类型:标准广播、有序广播
标准广播:完全异步执行的广播。效率高,无法被截断。
有序广播:同步执行的,优先级高的先执行,并且可截断。
在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);
判断网络是否可用
首先添加访问系统网络状态的权限:
...
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
...
修改NetworkChangeReceiver:
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
包 ⇒ 新建
⇒ Other
⇒ Broadcast Receiver
,命名为BootCompleteReceiver。
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>
内容,最后添加的内容如下:
... <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类。
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:
... <receiver android:name=".MyBroadcastReceiver" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="com.example.broadcasttest.MY_BROADCAST" /> </intent-filter> </receiver> ...