继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

使用广播接收器动态注册实现监听网络变化与静态注册实现开机自启

Ninja_z
关注TA
已关注
手记 4
粉丝 9
获赞 164
  1. 动态注册实现监听网络变化
public class MainActivity extends Activity {

    private IntentFilter mIntentFilter;
    private NetWorkChangeReceiver mNetWorkChangeReceiver;//自定义内部类NetWorkChangeReceiver 

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mIntentFilter = new IntentFilter();
        mIntentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
/*当网络状态发生变化时,系统发出的是android.net.conn.CONNECTIVITY_CHANGE
这条广播,所以说,想监听什么类型的广播,就在这里添加相应的action就行了。*/

        mNetWorkChangeReceiver = new NetWorkChangeReceiver();
        registerReceiver(mNetWorkChangeReceiver, mIntentFilter);//注册广播接收器
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(mNetWorkChangeReceiver);//动态注册的广播接收器需取消
    }

    class NetWorkChangeReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            ConnectivityManager connectivityManager = (ConnectivityManager)
                    getSystemService(Context.CONNECTIVITY_SERVICE);
//ConnectivityManager是一个系统服务类,专门用来管理网络连接
            NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
            if (networkInfo != null && networkInfo.isAvailable()) {
// networkInfo.isAvailable()判断当前是否有网络
                Toast.makeText(context, "当前网络可用", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(context, "无可用的网络", Toast.LENGTH_SHORT).show();
            }
        }
    }
}

最后,记得需要在manifest文件中加入可以查看网络连接的权限。
uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"

  1. 静态注册实现开机自启
    动态注册虽然灵活,但有一个弱点,就是必须要在程序启动之后才能接收广播
public class BootCompleteReceiver extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context , "BroadcastText已启动!" , Toast.LENGTH_SHORT).show();
    }
}

然后在mainfest文件中将这个广播器的类名注册
uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED
此为监听系统开机广播权限

<application
...>
<receiver android:name=".BootCompleteReceiver">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"></action>
            </intent-filter>
        </receiver>
...
</application>

首先通过android:name 来指定具体注册哪个广播接收器,然后在intent-filer标签中加入想要接收的广播即可。
注意:
不同在onReceive方法中添加过多的逻辑或进行任何耗时操作,因为在广播接收器中是不允许开启线程的,当onReceive方法进行了较长时间而没有结束时,程序就会报错。因此广播接收器更多的是扮演一种打开程序其他组件的角色。如创建一条状态栏通知,或者启动一个服务等。


转载自 郭霖 《第一行代码》

打开App,阅读手记
6人推荐
发表评论
随时随地看视频慕课网APP