Android 《系统广播》

一.接收系统的分钟广播

TimeReceiver.java

package com.xian.app.broadcast.receiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import java.util.Date;
public class TimeReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if(intent !=null){
            Log.i("xian","接收到一个分钟广播"+new Date().toString());
        }
    }
}

Activity.java

//...省略
@Override
protected void onStart() {
	super.onStart()
   /****注册分钟接收广播器****/
        timeReceiver = new TimeReceiver();
        IntentFilter timeFilter = new IntentFilter(Intent.ACTION_TIME_TICK);
        registerReceiver(timeReceiver,timeFilter);
        /****注册分钟接收广播器****/
}
@Override
protected void onStop() {
        super.onStop();
        unregisterReceiver(timeReceiver);
    }
//省略

二、震动广播

StockReceiver.java

public class StockReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i("xian","Vibrator ***************");
        if(intent !=null &&intent.getAction().equals(MainActivity.BROADCAST_SHOCK)){
            //从系统服务中获取震动管理器
            Vibrator vb = (Vibrator)context.getSystemService(Context.VIBRATOR_SERVICE);
            vb.vibrate(500);
        }
    }
}

触发代码

Intent intent = new Intent(BROADCAST_SHOCK);
//8.0后必须制定setComponent方法指定接收器的完整路径
ComponentName componentName = new ComponentName(this,"com.xian.app.broadcast.receiver.StockReceiver");
intent.setComponent(componentName);
sendBroadcast(intent);

静态注册与权限 AndroidManifest.xml

    <uses-permission android:name="android.permission.VIBRATE" />
    <receiver android:name=".receiver.StockReceiver"
              android:exported="true">
              <intent-filter>
                <action android:name="com.xian.app.broadcast.shock" />
              </intent-filter>
    </receiver>

三、网络变化

NetworkReceiver.java

public class NetworkReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if(intent!=null){
            NetworkInfo  network = intent.getParcelableExtra("networkInfo");
            String text = String.format("收到一个网络变更的广播,网络大类[%s],网络小类[%s],网络制式[%s],网络状态[%s]",
                    network.getTypeName(),
                    network.getSubtypeName(),
                    NetworkUtil.getNetworkClass(network.getSubtype()),
                    network.getState()
            );
            Log.i("xian",text);
        }
    }
}

注册

        /**网络变更接收器**/
        networkReceiver = new NetworkReceiver();
        IntentFilter netFilter = new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE");
        registerReceiver(networkReceiver,netFilter);
        /**网络变更接收器**/

四、分钟广播

TimeReceiver.java

public class TimeReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if(intent !=null){
            Log.i("xian","接收到一个分钟广播"+new Date().toString());
        }

    }
}

注册 onStart() 销毁

 @Override
 protected void onStart() {
        /****注册分钟接收广播器****/
        timeReceiver = new TimeReceiver();
        IntentFilter timeFilter = new IntentFilter(Intent.ACTION_TIME_TICK);
        registerReceiver(timeReceiver,timeFilter);
        /****注册分钟接收广播器****/
}
  @Override
    protected void onStop() {
        super.onStop();
        unregisterReceiver(timeReceiver);
    }

五、AlarmManager 闹钟广播

AlarmReceiver.java

public class AlarmReceiver extends BroadcastReceiver {

    private final Context ctx;
    public static final String ALARM_ACTION="com.xpm.alarm";
    public AlarmReceiver(Context ctx) {
        super();
        this.ctx = ctx;
    }
    @Override
    public void onReceive(Context context, Intent intent) {
        if(intent!=null && intent.getAction().equals(ALARM_ACTION)){
            Log.i("xian","收到闹钟");
            sendAlarm();
        }
    }
    // 发送闹钟广播
    public void sendAlarm(){
        Intent intent = new Intent(ALARM_ACTION);
        // 创建一个用于广播的延迟意图
        // 针对 S+(版本 10000 及更高版本)要求在创建 PendingIntent 时指定 FLAG_IMMUTABLE 或 FLAG_MUTABLE 之一。
        // 强烈考虑使用 FLAG_IMMUTABLE,仅当某些功能依赖于 PendingIntent 是可变的时才使用 FLAG_MUTABLE
        PendingIntent pendingIntent = PendingIntent.getBroadcast(ctx,0,intent,PendingIntent.FLAG_IMMUTABLE);
        // 从系统服务中获取闹钟管理器
        AlarmManager alarmManager = (AlarmManager) ctx.getSystemService(Context.ALARM_SERVICE);
        if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){
            // 允许在空闲时发送广播,Android6.0之后新增的方法
            alarmManager.setAndAllowWhileIdle(AlarmManager.RTC_WAKEUP,1000,pendingIntent);
        }else{
            // 设置一次性闹钟,延迟若干秒后,携带延迟意图发送闹钟广播(但Android6.0之后,set方法在暗屏时不保证发送广播,
            // 必须调用setAndAllowWhileIdle方法)
            alarmManager.set(AlarmManager.RTC_WAKEUP, 1000, pendingIntent);
        }
        // 设置重复闹钟,每隔一定间隔就发送闹钟广播(但从Android4.4开始,setRepeating方法不保证按时发送广播)
        // alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(),
        // 1000, pIntent);
    }
}


触发

public class AlarmActivity extends AppCompatActivity implements View.OnClickListener {

    private AlarmReceiver alarmReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_alarm);
        findViewById(R.id.btn_alarm).setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        alarmReceiver.sendAlarm();
    }

    @Override
    protected void onStart() {
        super.onStart();
        alarmReceiver = new AlarmReceiver(getApplicationContext());
        IntentFilter filter = new IntentFilter(AlarmReceiver.ALARM_ACTION);
        registerReceiver(alarmReceiver, filter);
    }

    @Override
    protected void onStop() {
        super.onStop();
        unregisterReceiver(alarmReceiver);
    }
}

六,网络状态变更(转)

权限

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

监听广播的两种方式

(1)在AndroidManifest.xml配置文件中声明。

<receiver android:name=".NetworkConnectChangedReceiver" >
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
                <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
                <action android:name="android.net.wifi.STATE_CHANGE" />
            </intent-filter>
</receiver>

(2)在代码中注册

IntentFilter filter = new IntentFilter();
        filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
        filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
        filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
        registerReceiver(new NetworkConnectChangedReceiver(), filter);

NetworkConnectChangedReceiver

NetworkConnectChangedReceiver.java

package com.per.networkconnectdome;
 
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.wifi.WifiManager;
import android.os.Parcelable;
import android.util.Log;
 
public class NetworkConnectChangedReceiver extends BroadcastReceiver {
    private String getConnectionType(int type) {
        String connType = "";
        if (type == ConnectivityManager.TYPE_MOBILE) {
            connType = "3G网络数据";
        } else if (type == ConnectivityManager.TYPE_WIFI) {
            connType = "WIFI网络";
        }
        return connType;
    }
 
    @Override
    public void onReceive(Context context, Intent intent) {
        if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(intent.getAction())) {// 监听wifi的打开与关闭,与wifi的连接无关
            int wifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, 0);
            Log.e("TAG", "wifiState:" + wifiState);
            switch (wifiState) {
                case WifiManager.WIFI_STATE_DISABLED:
                    break;
                case WifiManager.WIFI_STATE_DISABLING:
                    break;
            }
        }
        // 监听wifi的连接状态即是否连上了一个有效无线路由
        if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(intent.getAction())) {
            Parcelable parcelableExtra = intent
                    .getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
            if (null != parcelableExtra) {
                // 获取联网状态的NetWorkInfo对象
                NetworkInfo networkInfo = (NetworkInfo) parcelableExtra;
                //获取的State对象则代表着连接成功与否等状态
                NetworkInfo.State state = networkInfo.getState();
                //判断网络是否已经连接
                boolean isConnected = state == NetworkInfo.State.CONNECTED;
                Log.e("TAG", "isConnected:" + isConnected);
                if (isConnected) {
                } else {
 
                }
            }
        }
        // 监听网络连接,包括wifi和移动数据的打开和关闭,以及连接上可用的连接都会接到监听
        if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) {
            //获取联网状态的NetworkInfo对象
            NetworkInfo info = intent
                    .getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
            if (info != null) {
                //如果当前的网络连接成功并且网络连接可用
                if (NetworkInfo.State.CONNECTED == info.getState() && info.isAvailable()) {
                    if (info.getType() == ConnectivityManager.TYPE_WIFI
                            || info.getType() == ConnectivityManager.TYPE_MOBILE) {
                        Log.i("TAG", getConnectionType(info.getType()) + "连上");
                    }
                } else {
                    Log.i("TAG", getConnectionType(info.getType()) + "断开");
                }
            }
        }
    }
}

在onReceive方法里面,我们可以获取从广播而来的Intent中的数据,这包含很多有用的信息,其中
ConnectivityManager : 主要管理和网络连接相关的操作
WifiManager: 管理和wifi相关的信息
TelephonyManager: 管理和手机、运营商等的相关信息
NetworkInfo类包含了对wifi和mobile两种网络模式连接的详细描述,通过getState()方法获取的State对象,代表着连接成功与否的状态。

posted @ 2024-03-11 11:28  一个小笨蛋  阅读(42)  评论(0)    收藏  举报