广播有发射塔,有收音机
比如说升级系统,先检测一下电量,电量够才能升级
BroadcastReceiver就相当于一个收音机 (广播接收者)
标准广播:广播发出后,所有的收音机(BroadcastReceiver)会在同一时刻接收到这条广播消息,效率高,无法被截断。
有序广播:链式传递消息,同一时刻只有一个收音机能收到消息,这个收音机收到后下一个收音机才能接着收到。
系统会自动发出很多广播,比如开机广播,电池电量变化广播 想要收到这些广播就需要BroadcastReceiver(收音机)
想用收音机就得去相关部门申请使用无线电,BroadcastReceiver需要注册,注册之后就能接收到广播了。
在代码中动态注册或者在AndroidMainfest.xml中静态注册。
如何创建一个收音机(BroadcastReceiver)? 让一个类继承BroadcastReceiver并重写onReceive()方法就行了,当有广播时onReceive()方法就会执行。
示例一:用动态注册的方法编写一个能够监听时间变化的程序
package com.example.chargelisten; import androidx.appcompat.app.AppCompatActivity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.view.View; import android.widget.TextView; import java.util.Calendar; import java.util.TimeZone; public class MainActivity extends AppCompatActivity { TimeChangeReceiver timeChangeReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //新建一个收音机 timeChangeReceiver = new TimeChangeReceiver(); //新建一个意图过滤器 //意图过滤器会过滤 动作 类别 数据 //action category data IntentFilter intentFilter = new IntentFilter(); //过滤出系统发出的值为android.intent.action.TIME_TICK的广播动作,相当于设置收音机频道 //TICK就是每分钟收广播一次 intentFilter.addAction(Intent.ACTION_TIME_TICK); //注册广播 这里的this就是 context 设置把收音机和频道注册一下 this.registerReceiver(timeChangeReceiver,intentFilter); //取消注册,要不会内存泄漏 if (timeChangeReceiver != null){ this.unregisterReceiver(timeChangeReceiver); } } /*广播不作为内部类的话会报错*/ class TimeChangeReceiver extends BroadcastReceiver { TextView textView; //获取时间 Calendar calendar; @Override public void onReceive(Context context, Intent intent) { //获取实例 calendar = Calendar.getInstance(); //设置时区 calendar.setTimeZone(TimeZone.getTimeZone("GMT+8:00")); textView = findViewById(R.id.textView1); textView.setText("收到了时间变化的广播 现在分钟是: "+calendar.get(calendar.MINUTE)); } } }
原文:https://www.cnblogs.com/tuyaojiao/p/15241866.html