静态注册广播接收者。
可以理解为静态变量,可以直接使用。 可以直接使用,用完生命周期就结束了,需要用的时候再直接使用。
动态注册广播接收者,可以理解为实例变量,需要对象才能调用。
静态注册广播接收者
<!--组册广播接收者:告诉系统这个接收者,关注,检测哪一种广播消息,-->
<receiver android:name=".receivers.NetworkReceiver"
>
<!--使用intent filter 来告诉Android系统,这个接收者需要接受哪种广播消息-->
<intent-filter>
<!--设置接受者接收的消息类型action,代表intent中getAction()返回的内容-->
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
</intent-filter>
</receiver>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
public class NetworkReceiver extends BroadcastReceiver{
/**
* 广播接收者当收到广播信息(Intent数据)的时候,进行回调,大部分情况,这个方法是运行在主线程的。
* 可以通过手动设置的形式让这个方法在子线程执行,
* @param context
* @param intent
*/
@Override
public void onReceive(Context context, Intent intent) {
//广播中的重要数据:
//1.ACTION-》getAction()返回当前广播的类型。!!!需要背下来,
Log.d("NetworkReceiver", "收到广播消息" +intent );
String action = intent.getAction();
//2.判断广播消息的类型,使用网络变化状态为例,
if(action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
ConnectivityManager connectivitManager =(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
//如果是WIFI 就是Context.WIFI_SERVICEI
//如果是短信Context.TELEPHONY_SERVICE
NetworkInfo activeNetworkInfo = connectivitManager.getActiveNetworkInfo();
String netWorkState="无网络";
if (activeNetworkInfo != null) {
//获取枚举类型的 网络状态
NetworkInfo.State state = activeNetworkInfo.getState();
Log.d("NetworkRecevier", "当前状态 " + state);
activeNetworkInfo.getReason();
activeNetworkInfo.getSubtype();//当前是3G,还是WiFI
String typeName = activeNetworkInfo.getTypeName();
int type = activeNetworkInfo.getType();
switch (type){
case ConnectivityManager.TYPE_MOBILE:
if(state==NetworkInfo.State.CONNECTED){
netWorkState="切换到手机网络";
}
break;
case ConnectivityManager.TYPE_WIFI:
if(state==NetworkInfo.State.CONNECTED){
netWorkState="切换到wifi网络";
}
break;
default:
if(state==NetworkInfo.State.CONNECTED){
netWorkState="切换到其他网络";
}
break;
}
Log.d("NetworkRecevier", "TypeName"+typeName );
int subtype = activeNetworkInfo.getSubtype();
switch (subtype){
case ConnectivityManager.TYPE_MOBILE_DUN:
break;
}
String subTypeName = activeNetworkInfo.getSubtypeName();
Log.d("NetworkRecevier", "subTypeName"+subTypeName );
}else{
Log.d("NetworkRecevier", "已经断线");
}
sendNotification(context,"网络变化 ",netWorkState);
}
}
/**
* 发送通知消息
* @param context
* @param content
*/
public static void sendNotification(Context context,String title,String content){
//1.
NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
builder.setSmallIcon(R.mipmap.ic_launcher).setContentTitle(title).setContentText(content);
Notification n = builder.build();
NotificationManagerCompat managerCompat = NotificationManagerCompat.from(context);
managerCompat.notify(188,n);
}
}
可以理解为静态变量,可以直接使用。 可以直接使用,用完生命周期就结束了,需要用的时候再直接使用。
动态注册广播接收者,可以理解为实例变量,需要对象才能调用。
静态注册广播接收者
<!--组册广播接收者:告诉系统这个接收者,关注,检测哪一种广播消息,-->
<receiver android:name=".receivers.NetworkReceiver"
>
<!--使用intent filter 来告诉Android系统,这个接收者需要接受哪种广播消息-->
<intent-filter>
<!--设置接受者接收的消息类型action,代表intent中getAction()返回的内容-->
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
</intent-filter>
</receiver>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
public class NetworkReceiver extends BroadcastReceiver{
/**
* 广播接收者当收到广播信息(Intent数据)的时候,进行回调,大部分情况,这个方法是运行在主线程的。
* 可以通过手动设置的形式让这个方法在子线程执行,
* @param context
* @param intent
*/
@Override
public void onReceive(Context context, Intent intent) {
//广播中的重要数据:
//1.ACTION-》getAction()返回当前广播的类型。!!!需要背下来,
Log.d("NetworkReceiver", "收到广播消息" +intent );
String action = intent.getAction();
//2.判断广播消息的类型,使用网络变化状态为例,
if(action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
ConnectivityManager connectivitManager =(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
//如果是WIFI 就是Context.WIFI_SERVICEI
//如果是短信Context.TELEPHONY_SERVICE
NetworkInfo activeNetworkInfo = connectivitManager.getActiveNetworkInfo();
String netWorkState="无网络";
if (activeNetworkInfo != null) {
//获取枚举类型的 网络状态
NetworkInfo.State state = activeNetworkInfo.getState();
Log.d("NetworkRecevier", "当前状态 " + state);
activeNetworkInfo.getReason();
activeNetworkInfo.getSubtype();//当前是3G,还是WiFI
String typeName = activeNetworkInfo.getTypeName();
int type = activeNetworkInfo.getType();
switch (type){
case ConnectivityManager.TYPE_MOBILE:
if(state==NetworkInfo.State.CONNECTED){
netWorkState="切换到手机网络";
}
break;
case ConnectivityManager.TYPE_WIFI:
if(state==NetworkInfo.State.CONNECTED){
netWorkState="切换到wifi网络";
}
break;
default:
if(state==NetworkInfo.State.CONNECTED){
netWorkState="切换到其他网络";
}
break;
}
Log.d("NetworkRecevier", "TypeName"+typeName );
int subtype = activeNetworkInfo.getSubtype();
switch (subtype){
case ConnectivityManager.TYPE_MOBILE_DUN:
break;
}
String subTypeName = activeNetworkInfo.getSubtypeName();
Log.d("NetworkRecevier", "subTypeName"+subTypeName );
}else{
Log.d("NetworkRecevier", "已经断线");
}
sendNotification(context,"网络变化 ",netWorkState);
}
}
/**
* 发送通知消息
* @param context
* @param content
*/
public static void sendNotification(Context context,String title,String content){
//1.
NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
builder.setSmallIcon(R.mipmap.ic_launcher).setContentTitle(title).setContentText(content);
Notification n = builder.build();
NotificationManagerCompat managerCompat = NotificationManagerCompat.from(context);
managerCompat.notify(188,n);
}
}