Android BroadcastReceiver广播(一):基本使用
一、什么是广播
BroadcastReceiver是android 系统的四大组件之一,本质上就是一个全局的监听器,用于监听系统全局的广播消息,可以方便的实现系统中不同组件之间的通信。
程序可以通过调用context的sendBroadcast()方法来启动指定的BroadcastReceiver.
二、广播的生命周期
BroadcastReceiver生命周期只有十秒左右,如果在onReceive()内做超过十秒的事情,就会报错。所以广播中不要执行耗时操作,可以考虑启动一个Service来完成操作。
三、注册BroadcastReceiver
广播分为两种:静态注册和动态注册
1.静态注册
AndroidManifest.xml文件中配置
特点:常驻形广播,程序推出后,广播依然存在。
在AndroidManifest中进行注册后,不管该应用程序是否处于活动状态,都会进行监听,比如某个程序是监听 内存 的使用情况的,当在手机上安装好后,
不管该应用程序是处于什么状态,都会执行改监听方法中的内容。
goal:创建广播,新建一个类,继承自BroadcastReceiver,并重写onReceive()方法,在manifest文件中注册该广播,再发送广播
2.动态注册
代码中动态指定广播地址并注册
在代码中进行注册后,当应用程序关闭后,就不再进行监听。如果是在Activity中进行的注册和解注册,则生命周期是跟随该Activity的。
特点:非常驻型,广播会跟随程序的生命周期的结束而结束
goal:新建内部类,继承BroadcastReceiver,并重写onReceive()方法,在onStart()中注册广播,在onStop()中解除注册广播,在发送广播
A、Send
1.1 activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical"> <Button android:id="@+id/btn1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="btn1" android:textSize="32sp" /> <Button android:id="@+id/btn2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="btn2" android:textSize="32sp" /> </LinearLayout>
1.2 MainActivity.java
package com.gatsby.intentfiltersend; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.view.Gravity; import android.view.View; import android.widget.Button; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity implements View.OnClickListener { Button btn1, btn2; CrushReceiver crushReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } public void initView() { btn1 = (Button) findViewById(R.id.btn1); btn2 = (Button) findViewById(R.id.btn2); btn1.setOnClickListener(this); btn2.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn1: CrushRegister(); //发送动态广播 Intent intent1 = new Intent(); intent1.setAction("com.android.crushGril"); intent1.putExtra("key", "CrsuhGril"); sendBroadcast(intent1); break; case R.id.btn2: //发送静态广播 Intent intent2 = new Intent(); intent2.setAction("com.android.gatsby"); sendBroadcast(intent2); break; } } //动态注册广播 public void CrushRegister() { //实例化IntentFilter对象 IntentFilter filter = new IntentFilter(); filter.addAction("com.android.crushGril"); crushReceiver = new CrushReceiver(); //注册广播接收 registerReceiver(crushReceiver, filter); } class CrushReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { //通过继承 BroadcastReceiver建立动态广播接收器 String action = intent.getAction(); if (action.equals("com.android.crushGril")) { //通过吐司验证接收到广播 Toast toast = Toast.makeText(context, "动态广播:" + action + " value-->" + intent.getStringExtra("key"), Toast.LENGTH_SHORT); toast.setGravity(Gravity.TOP, 0, 0);//将吐司设置在屏幕顶端 toast.show(); } } } /*动态注册需在Acticity生命周期onPause通过 *unregisterReceiver()方法移除广播接收器, * 优化内存空间,避免内存溢出 */ @Override protected void onPause() { super.onPause(); unregisterReceiver(crushReceiver); } //在销毁时要与广播解绑 @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(crushReceiver); } }
1.3.XHService 动态注册广播
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | public void SerialPortWrite(String strcmd) { try { byte [] bytes = strcmd.getBytes(); mOutputBuffer.clear(); mOutputBuffer.put(bytes); mSerialPort.write(mOutputBuffer, bytes.length); Thread.sleep( 200 ); } catch (Exception e) { e.printStackTrace(); } } XHService(Context context) { Log.d(TAG, "enter XHService" ); mContext=context; XHService_SerialInit(); IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_TIME_CHANGED); filter.addAction(Intent.ACTION_SCREEN_ON); filter.addAction(Intent.ACTION_SCREEN_OFF); filter.addAction(Intent.ACTION_BOOT_COMPLETED); filter.addAction( "com.xinhua.scheduled" ); filter.addAction( "com.xinhua.ethernet_static" ); filter.addAction( "com.xinhua.ethernet_enable" ); filter.addAction( "com.xinhua.ethernet_dhcp" ); filter.addAction( "xy.update.third.apk.start" ); filter.addAction( "com.xinhua.scheduledSysOrApi" ); context.registerReceiver(mIntentReceiver, filter); mEthManager = (EthernetManager) mContext.getSystemService(Context.ETHERNET_SERVICE); mTelephonyManager = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE); if (SystemProperties.get( "persist.rild.libpath" , "/system/lib/libreference-ril-ls-u8300.so" ) .equals( "/system/lib/libreference-ril-huawei-me909s.so" )){ Thread thread = new Thread(NetChceck); thread.start(); } mHandler = new xhHandler(FgThread.get().getLooper()); } |
mIntentReceiver 广播接收
1 2 3 4 5 6 7 8 9 10 | BroadcastReceiver mIntentReceiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { Log.d(TAG, "receiver intent :" +intent.getAction()); if (intent.getAction().equals(Intent.ACTION_TIME_CHANGED)) { SetMcuTime(); } |
B、Receiver 静态注册广播、传递信息到活动页面Activity
2.1 activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical"> <Button android:id="@+id/btn1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="btn1" android:textSize="32sp" /> <TextView android:id="@+id/tv1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="绘梨衣" android:textSize="64sp" /> </LinearLayout>
2.2 AndroidManifest.xml
<receiver android:name=".MyCrushBroadcastReceiver"> <intent-filter> <action android:name="com.android.crushGril" /> <action android:name="com.android.gatsby"/> </intent-filter> </receiver>
2.3 MainActivity.java
package com.gatsby.broadcastreceiver; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity implements View.OnClickListener { Button btn1; TextView tv1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } public void initView() { tv1 = (TextView) findViewById(R.id.tv1); btn1 = (Button) findViewById(R.id.btn1); btn1.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.btn1: MyCrushBroadcastReceiver myCrushBroadcastReceiver = new MyCrushBroadcastReceiver(); Log.d("gatsby","receive value!"+myCrushBroadcastReceiver.getGatsbySting()); tv1.setText(myCrushBroadcastReceiver.getGatsbySting()); break; } } }
2.3 MyCrushBroadcastReceiver.java
package com.gatsby.broadcastreceiver; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.widget.Toast; public class MyCrushBroadcastReceiver extends BroadcastReceiver { static String gatsbyString; @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (action.equals("com.android.crushGril")) { Toast toast = Toast.makeText(context, "静态广播CrushGril:" + action + " value->" + intent.getStringExtra("key"), Toast.LENGTH_SHORT); toast.show(); } else if (action.equals("com.android.gatsby")) { gatsbyString = "Gatsby receive CrushGril"; Toast toast = Toast.makeText(context, "静态广Gatsby:->" + action + " value->", Toast.LENGTH_SHORT); toast.show(); } } //处理返回信息 public static String getGatsbySting() { return gatsbyString; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】