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对象,代表着连接成功与否的状态。
本文来自博客园,作者:一个小笨蛋,转载请注明原文链接:https://www.cnblogs.com/paylove/p/18065733
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效