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 @   一个小笨蛋  阅读(28)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示