行业知识
广播
2026-11-10 15:04:26
来源:互联网转载
1.什么是广播
2.标准广播
BroadStandardActivity.java
package com.tiger.chapter09;import androidx.appcompat.app.AppCompatActivity;import android.content.Intent;import android.content.IntentFilter;import android.os.Bundle;import android.view.View;import com.tiger.chapter09.receiver.StandardReceiver;public class BroadStandardActivity extends AppCompatActivity implements View.OnClickListener { private StandardReceiver standardReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_broad_standard); findViewById(R.id.btn_send_standard).setOnClickListener(this); } @Override public void onClick(View v) { //发送标准广播 相当于主题 Intent intent = new Intent(StandardReceiver.STRING); sendBroadcast(intent); } @Override protected void onStart() { super.onStart(); standardReceiver = new StandardReceiver(); //代表上下文 注册 广播接收者 相当于订阅 IntentFilter intentFilter = new IntentFilter(StandardReceiver.STRING); //注册接收器,注册之后才能正常接收广播 registerReceiver(standardReceiver,intentFilter); } @Override protected void onStop() { super.onStop(); //在Activity不用的时候就不需要 广播订阅了,先注销接收者 unregisterReceiver(standardReceiver); }} xml
receiver
package com.tiger.chapter09.receiver;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.util.Log;//定义一个标准广播的接收器public class StandardReceiver extends BroadcastReceiver { public static final String STRING ="com.tiger.chapter09.standard"; //一旦接收到标准广播,马上触发接收器的onReceive方法 @Override public void onReceive(Context context, Intent intent) { //先当于订阅主题 if (intent!=null&&intent.getAction().equals(STRING)){ Log.d("ning","收到了标准广播"); } }} 3.有序广播
BroadOrderActivity.java
package com.tiger.chapter09;import androidx.appcompat.app.AppCompatActivity;import android.content.Intent;import android.content.IntentFilter;import android.os.Bundle;import android.view.View;import com.tiger.chapter09.receiver.OrderAReceiver;import com.tiger.chapter09.receiver.OrderBReceiver;public class BroadOrderActivity extends AppCompatActivity implements View.OnClickListener { public static final String ORDER_ACTION = "com.tiger.chapter09.order"; private OrderAReceiver orderAReceiver; private OrderBReceiver orderBReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_broad_order); findViewById(R.id.btn_send_order).setOnClickListener(this); } @Override public void onClick(View v) { //创建一个指定动作的意图 Intent intent =new Intent(ORDER_ACTION); //发送有序广播 sendOrderedBroadcast(intent,null); } @Override protected void onStart() { super.onStart(); //多个接收器处理有序广播的顺序规则为: //1.优先级越大的2接收器,越早收到有序广播 //2.优先级相同的时候,越早注册的接收器越早收到有序广播 orderAReceiver = new OrderAReceiver(); IntentFilter filterA = new IntentFilter(ORDER_ACTION); filterA.setPriority(8); registerReceiver(orderAReceiver,filterA); orderBReceiver = new OrderBReceiver(); IntentFilter filterB = new IntentFilter(ORDER_ACTION); filterB.setPriority(10); registerReceiver(orderBReceiver,filterB); } @Override protected void onStop() { super.onStop(); unregisterReceiver(orderAReceiver); unregisterReceiver(orderBReceiver); }} AOrder
package com.tiger.chapter09.receiver;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.util.Log;import com.tiger.chapter09.BroadOrderActivity;public class OrderAReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent!=null&&intent.getAction().equals(BroadOrderActivity.ORDER_ACTION)){ Log.d("ning","接收器A 收到了有序广播"); } }} BOrder
package com.tiger.chapter09.receiver;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.util.Log;import com.tiger.chapter09.BroadOrderActivity;public class OrderBReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent!=null&&intent.getAction().equals(BroadOrderActivity.ORDER_ACTION)){ Log.d("ning","接收器B 收到了有序广播"); abortBroadcast();//中断广播,此时后面的接收器无法收到该广播 } }} 4.广播的静态注册
activity
package com.tiger.chapter09;import androidx.appcompat.app.AppCompatActivity;import android.content.ComponentName;import android.content.Intent;import android.os.Bundle;import android.view.View;import com.tiger.chapter09.receiver.ShockReceiver;public class BroadStaticActivity extends AppCompatActivity implements View.OnClickListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_broad_static); findViewById(R.id.btn_send_shock).setOnClickListener(this); } @Override public void onClick(View v) { //Android8.0 之后 删除了大部分静态注册,防止退出App后仍在接收广播 //为了让应用能够继续接收静态广播,需要给静态注册的广播指定包名 String fullName = "com.tiger.chapter09.receiver.ShockReceiver"; Intent intent = new Intent(ShockReceiver.SHOCK_ACTION); ComponentName componentName = new ComponentName(this, fullName); intent.setComponent(componentName); sendBroadcast(intent); }} ShockReceiver
package com.tiger.chapter09.receiver;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.os.VibrationEffect;import android.os.Vibrator;import android.util.Log;public class ShockReceiver extends BroadcastReceiver { public static final String SHOCK_ACTION="com.jmj.shock"; @Override public void onReceive(Context context, Intent intent) { if (intent!=null&&intent.getAction().equals(SHOCK_ACTION)){ Log.d("ning","震动一下"); //从系统服务中获取震动管理器 Vibrator vb = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE); //震动需要权限,开启清单权限就不会报错了 vb.vibrate(VibrationEffect.createOneShot(500,50)); } }} 清单文件
5.系统分钟到达广播
Activity
package com.tiger.chapter09;import androidx.appcompat.app.AppCompatActivity;import android.content.Intent;import android.content.IntentFilter;import android.os.Bundle;public class SystemMinuteActivity extends AppCompatActivity { private TimeReceiver timeReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_system_minute); } @Override protected void onStart() { super.onStart(); //创建一个分钟变更的广播接收器 timeReceiver = new TimeReceiver(); IntentFilter filter = new IntentFilter(Intent.ACTION_TIME_TICK); registerReceiver(timeReceiver,filter); } @Override protected void onStop() { super.onStop(); unregisterReceiver(timeReceiver); }} TimeReceiver
package com.tiger.chapter09;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.util.Log;public class TimeReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent!=null){ Log.d("ning","收到一个分钟到达广播"); } }} 6.系统网络变更广播
SystemNetWorkActivity
package com.tiger.chapter09;import androidx.appcompat.app.AppCompatActivity;import android.content.Intent;import android.content.IntentFilter;import android.os.Bundle;import com.tiger.chapter09.receiver.NetWorkReceiver;public class SystemNetWorkActivity extends AppCompatActivity { private NetWorkReceiver netWorkReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_system_net_work); } @Override protected void onStart() { super.onStart(); netWorkReceiver = new NetWorkReceiver(); IntentFilter filter = new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE"); registerReceiver(netWorkReceiver,filter); } @Override protected void onStop() { super.onStop(); unregisterReceiver(netWorkReceiver); }} NetWorkReceiver
package com.tiger.chapter09.receiver;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.net.NetworkInfo;import android.os.Parcelable;import android.util.Log;import com.tiger.chapter09.util.NetworkUtil;public class NetWorkReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent != null) { NetworkInfo networkInfo = intent.getParcelableExtra("networkInfo"); // 收到一个网络变更广播,网络大类为MOBILE,网络小类为HSPA,网络制式为3G,网络状态为DISCONNECTED // 收到一个网络变更广播,网络大类为WIFI,网络小类为,网络制式为未知,网络状态为CONNECTED String text = String.format("收到一个网络变更广播,网络大类为%s," + "网络小类为%s,网络制式为%s,网络状态为%s", networkInfo.getTypeName(), networkInfo.getSubtypeName(), NetworkUtil.getNetworkClass(networkInfo.getSubtype()), networkInfo.getState().toString()); Log.d("ning", text); } }} NetWorkUtil
package com.tiger.chapter09.util;import android.telephony.TelephonyManager;public class NetworkUtil { // 获取数据连接的制式类型 public static String getNetworkClass(int subType) { switch (subType) { case TelephonyManager.NETWORK_TYPE_GPRS: case TelephonyManager.NETWORK_TYPE_EDGE: case TelephonyManager.NETWORK_TYPE_CDMA: case TelephonyManager.NETWORK_TYPE_1xRTT: case TelephonyManager.NETWORK_TYPE_IDEN: return "2G"; case TelephonyManager.NETWORK_TYPE_UMTS: case TelephonyManager.NETWORK_TYPE_EVDO_0: case TelephonyManager.NETWORK_TYPE_EVDO_A: case TelephonyManager.NETWORK_TYPE_HSDPA: case TelephonyManager.NETWORK_TYPE_HSUPA: case TelephonyManager.NETWORK_TYPE_HSPA: case TelephonyManager.NETWORK_TYPE_EVDO_B: case TelephonyManager.NETWORK_TYPE_EHRPD: case TelephonyManager.NETWORK_TYPE_HSPAP: return "3G"; case TelephonyManager.NETWORK_TYPE_LTE: return "4G"; case TelephonyManager.NETWORK_TYPE_NR: return "5G"; default: return "未知"; } }} 7. alarm定时器广播
package com.tiger.chapter09.receiver;import android.app.AlarmManager;import android.app.PendingIntent;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.os.Build;import android.util.Log;public class AlarmReceiver extends BroadcastReceiver { public static final String ALARM_ACTION="com.tiger.chapter09.alarm"; private Context mContext; public AlarmReceiver(Context mContext) { this.mContext = mContext; } @Override public void onReceive(Context context, Intent intent) { if (intent != null&&intent.getAction().equals(ALARM_ACTION)){ Log.d("ning","收到闹钟广播"); 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(mContext, 0, intent, PendingIntent.FLAG_IMMUTABLE); // 从系统服务中获取闹钟管理器 AlarmManager alarmManager = (AlarmManager) mContext.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); }} package com.tiger.chapter09;import androidx.appcompat.app.AppCompatActivity;import android.content.IntentFilter;import android.os.Bundle;import android.view.View;import com.tiger.chapter09.receiver.AlarmReceiver;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); }} 8.竖屏与横屏切换
��
package com.tiger.chapter09;import androidx.annotation.NonNull;import androidx.appcompat.app.AppCompatActivity;import android.content.res.Configuration;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.TextView;public class ChangeDirectionActivity extends AppCompatActivity { private TextView tv_monitor; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_change_direction); tv_monitor = findViewById(R.id.tv_monitor); Log.d("ning","onCreate");//只执行一次,在屏幕旋转之后 } //在配置项变更是触发。比如屏幕方向发生变更等等 @Override public void onConfigurationChanged(@NonNull Configuration newConfig) { super.onConfigurationChanged(newConfig); switch (newConfig.orientation){ case Configuration.ORIENTATION_PORTRAIT: tv_monitor.setText("当前屏幕为竖屏方向"); break; case Configuration.ORIENTATION_LANDSCAPE: tv_monitor.setText("当前屏幕为横屏方向"); break; default: break; } }} 设置只能竖屏或者横屏
screenOrientation = portrait | landscape
9.回到桌面和使用任务列表
package com.tiger.chapter09;import androidx.annotation.NonNull;import androidx.appcompat.app.AppCompatActivity;import android.app.PictureInPictureParams;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.content.res.Configuration;import android.os.Build;import android.os.Bundle;import android.text.TextUtils;import android.util.Log;import android.util.Rational;public class ReturnDesktopActivity extends AppCompatActivity { private DesktopReceiver desktopReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_return_desktop); //因为按了Home或任务键 所以要在onCreate 和 Destroy 来注册 广播 要不然,stop就监听不到了 desktopReceiver = new DesktopReceiver(); IntentFilter filter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); registerReceiver(desktopReceiver,filter); } @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(desktopReceiver); } //在进入画中画模式或退出画中画模式时触发 @Override public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode, @NonNull Configuration newConfig) { super.onPictureInPictureModeChanged(isInPictureInPictureMode, newConfig); if (isInPictureInPictureMode){ //进入了画中画模式 Log.d("ning","进入了画中画模式"); }else { //退出了画中画模式 Log.d("ning","退出了画中画模式"); } } //定义一个返回到桌面的广播接收器 private class DesktopReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent != null && intent.getAction().equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) { //回到桌面或者切换到任务列表的主题广播 String reason = intent.getStringExtra("reason"); if (!TextUtils.isEmpty(reason) && (reason.equals("homekey") || reason.equals("recentapps"))) { //Android 8.0 开始才提供画中画模式 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && !isInPictureInPictureMode()) { //进入画中画模式 创建画中画模式的参数构造器 PictureInPictureParams.Builder builder = new PictureInPictureParams.Builder(); //设置宽高比例值,第一个参数表示分子,第二个参数表示分母 // 下面的10/5 =2,表示画中画窗口的宽度是高度的两倍 Rational rational = new Rational(10, 5);//宽 高 10 : 5 builder.setAspectRatio(rational); //进入画中画模式 enterPictureInPictureMode(builder.build()); } } } } }} 清单文件 开启画中画支持
下一篇:现在需要怎么装服务器才好?