接受系统广播


动态注册

在Java代码中指定IntentFilter,然后想监听什么广播就添加对应的Action。动态注册的广播,一定要调用unregisterReceiver()方法取消注册。

下面用动态注册监听网络变化

在AndroidManifest.xml中添加权限:

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

Activity的Java代码:

public class MainActivity extends AppCompatActivity {    private IntentFilter intentFilter;    private NetworkChangeReceiver networkChangeReceiver;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        //动态接受网络变化的广播接收器        intentFilter = new IntentFilter();        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");        networkChangeReceiver = new NetworkChangeReceiver();        registerReceiver(networkChangeReceiver, intentFilter);    }    @Override    protected void onDestroy() {        super.onDestroy();        //取消动态网络变化广播接收器的注册        unregisterReceiver(networkChangeReceiver);    }    //自定义接受网络变化的广播接收器    class NetworkChangeReceiver extends BroadcastReceiver {        @Override        public void onReceive(Context context, Intent intent) {            ConnectivityManager connectionManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);            NetworkInfo networkInfo = connectionManager.getActiveNetworkInfo();            if (networkInfo != null && networkInfo.isAvailable()) {                Toast.makeText(context, "network is available", Toast.LENGTH_SHORT).show();            } else {                Toast.makeText(context, "network is unavailable", Toast.LENGTH_SHORT).show();            }        }    }}

静态注册

动态注册需要程序启动之后才能接收广播,静态广播就弥补了这个短板。在AndroidManifest中指定IntentReceiver就可以在程序未启动的情况下接收到广播

下面用静态注册接受开机广播

新建一个广播接收器

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中添加权限、注册广播接收器和添加Action

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.example.broadcasttest">    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />    <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=".BootCompleteReceiver"            android:enabled="true"            android:exported="true">            <intent-filter>                <action android:name="android.intent.action.BOOT_COMPLETED" />            intent-filter>        receiver>    application>manifest>

发送广播


发送标准广播

接收器的Java代码:

public class MyBroadcastReceiver extends BroadcastReceiver {    @Override    public void onReceive(Context context, Intent intent) {        Toast.makeText(context, "received in MyBroadcastReceiver", Toast.LENGTH_SHORT).show();    }}

接收器的注册代码:

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

Activity的Java代码

public class MainActivity extends AppCompatActivity {    private Button button;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);         //发送自定义广播        button = (Button) findViewById(R.id.button);        button.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");                sendBroadcast(intent);            }        });    }    @Override    protected void onDestroy() {        super.onDestroy();        //取消动态网络变化广播接收器的注册        unregisterReceiver(networkChangeReceiver);    } }

发送有序广播

发送有序广播的方法:

sendOrderedBroadcast(intent, null);

设置广播接收器的先后顺序,在AndroidManifest.xml中receiver的intent-filter的priority属性,优先级可选值:-1000~1000

android:priority="100"

使用本地广播


主要是用LocalBroadcastManager来对广播进行管理,提供了发送广播和注册广播接收器的方法如下:

  • LocalBroadcastManager.getInstance()获得实例
  • ~.registerReceiver()注册广播
  • ~.sendBroadcast()发送广播
  • ~.unregisterReceiver()取消广播

注意事项:

  • 本地广播无法通过静态注册来接收,相比系统全局广播更加高效
  • 在广播中启动活动需要添加FLAG_ACTIVITY_NEW_TASK的标记
  • 在广播中弹出AlertDialog需要添加TYPE_SYSTEM_ALERT

Java代码:

public class MainActivity extends AppCompatActivity {    private IntentFilter intentFilter;    private LocalReceiver localReceiver;    private LocalBroadcastManager localBroadcastManager;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        //得到本地广播管理器的实例        localBroadcastManager = LocalBroadcastManager.getInstance(this);        //动态注册本地广播接收器        intentFilter = new IntentFilter();        intentFilter.addAction("com.example.broadcasttest.LOCAL_BROADCAST");        localReceiver = new LocalReceiver();        localBroadcastManager.registerReceiver(localReceiver, intentFilter);        //发送本地广播        Button button = (Button) findViewById(R.id.button);        button.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Intent intent = new Intent("com.example.broadcasttest.LOCAL_BROADCAST");                localBroadcastManager.sendBroadcast(intent);            }        });    }    @Override    protected void onDestroy() {        super.onDestroy();        //取消动态网络变化广播接收器的注册        localBroadcastManager.unregisterReceiver(localReceiver);    }    class LocalReceiver extends BroadcastReceiver {        @Override        public void onReceive(Context context, Intent intent) {            Toast.makeText(context, "received local broadcast", Toast.LENGTH_SHORT).show();        }    }}

更多相关文章

  1. Android一键锁屏代码
  2. Android(安卓)入门知识点梳理之一 四大组件
  3. 初学Android,开机自启动的Service(七十三)
  4. Android的framework层音量控制原理分析--hot(key)处理
  5. androidの亮屏,灭屏,解锁广播使用
  6. android与java web交互完成简单的登录和注册
  7. Android02--debug.keystore的注册信息
  8. Android四大基本组件介绍与生命周期
  9. 系出名门Android(4) - 活动(Activity), 服务(Service), 广播(Bro

随机推荐

  1. android获取屏幕长宽的方法
  2. Android属性动画完全解析(一)
  3. Android Uri转换成真实File路径
  4. Android(安卓)Surfaceflinger 的使用
  5. 【Android】SQLite数据库的简单使用
  6. Android自定义AlertDialog实现
  7. android仿滴滴司机端滑动接到乘客,送达乘
  8. Android 获取MIEI ISMI Sim卡串号等等信
  9. Migrating Your Android App from Eclips
  10. android launch 初探