Android广播之接收系统广播(一)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wzhworld/article/details/70233085

Android广播之接收系统广播(一)

##广播的机制介绍
广播可以分为标准广播与有序广播,区别主要是前者为异步,后者为同步。
标准广播是在发出广播之后所有的接受器都会收到广播,效率较高,有序广播是发出广播之后只有一种能接受到广播,当这个接收器逻辑执行完后才会发到下一个接收器,主要是有序的,同时广播是可以截断的,只要阶段其中的某一步,后面的就会收不到。

##一、接收系统广播
有两种注册方式,一种是代码注册,一种是在AndroidMainfest.xml中注册,前者为动态,后者为静态

###1、动态注册监听网络变化

public class MainActivity extends AppCompatActivity {
    private IntentFilter mIntentFilter;
    /*
    创建一个IntentFilter实例,然后将android.net.conn.CONNECTIVITY_CHANGE
    传入到实例中,也就是说我们想要监听什么样的广播就传入什么样的数值,然后
    使用注册receiver,动态的广播接收器一定要取消注册,所以在destory要调用
    unregisterReceiver
     */

    private NetworkChangReceiver mNetworkChangeReceiver;
	/*
		NetworkChangeReceiver是继承BroadcastReceiiver
	*/
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mIntentFilter = new IntentFilter();
        mIntentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
        mNetworkChangeReceiver = new NetworkChangReceiver();
        registerReceiver(mNetworkChangeReceiver,mIntentFilter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(mNetworkChangeReceiver);
    }
    class NetworkChangReceiver extends BroadcastReceiver{
        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(context, "network changes", Toast.LENGTH_SHORT).show();
        }
    }
}

###2、动态注册改进
单单只是网络的改变还不够人性化,所以我们改进成能够提示网络的开关闭,我们在onReceiver中修改,

class NetworkChangReceiver 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();

        }
    }

注意在AndroidMainfest.xml申请网络权限:

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

好了,我们现在按home键,然后找到设置里开关数据,开关可以看到变化

###3、静态注册
静态注册的优点是动态所没有的,就是当程序没有启动的时候可接收广播
####先增加一个BroadcastReceiver

public class BootCompleteReceiver extends BroadcastReceiver{
    private static final String TAG ="Start";
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "Boot Complete", Toast.LENGTH_SHORT).show();
    }
}

####在androidmainfest.xml中添加开机广播权限声明

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

以及在application中添加receiver

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

猜你喜欢

转载自blog.csdn.net/wzhworld/article/details/70233085
今日推荐