广播

Android工程搭建

  • BroadCastReceiver
    • 一、BroadCastReceiver介绍
  • 二、如何实现广播
      • A、广播接受者
      • B、广播发送方:sendBroadcast(Intent意图对象)
  • 三、代码
        • A、无序广播
            • 静态注册
            • 动态注册
        • B、有序广播
        • C、发送的方法
            • 1.无序 : sendBroadcast()
            • 2.有序 : sendOrderBroadcast()
            • 3. 粘性 : sendStickyBroadcast()
  • 四、系统广播

BroadCastReceiver

一、BroadCastReceiver介绍

广播_第1张图片

BroadCastReceiver广播接受者,安卓四大组件之一
广播三要素:
(1)广播发送者 :       发送广播
(2)广播接收者(调频):      用于接收广播
(3)要处理的事情  :处理广播的相关信息, Intent有图对象
广播的使用场景:
(1)同一APP下多个组件之间传递数据(Activity/Fragment/Service之间传递数据)
(2)2个APP之间传递数据
技能get点:
(1)自定义广播接受者
(2)使用广播接受者进行电话拦截和短信拦截和系统电量的变化

二、如何实现广播

A、广播接受者

(1)自定义类继承BroadcastReceiver,重写onReceive方法
(2)注册广播(安卓的四大组件都需要注册)
静态注册:在清单文件中
动态注册:在代码中注册(注册和接触注册)

B、广播发送方:sendBroadcast(Intent意图对象)

静态注册和动态注册的区别:假如说Activity是接受者:
动态注册:
(1)广播会跟Activity的生命周期的结束而结束;
(2)自由的控制注册和取消,有很大的灵活性
(3)动态注册在结束应用时就会消失
静态注册:
(1)广播不会跟随Activity的生命周期的结束而结束,一直存在,即使应用程序关闭,也会被唤醒接受广播
(2)全局的广播
(3)静态注册除非下载应用,否则会一直存在

三、代码

注册、解除注册

onCreate():注册广播调用Context的registerReceiver()方法
onDestory():解除注册调用Context的unregisterReceiver()方法

A、无序广播

public class MyBroadcast extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if(intent.getAction().equals("com.xh.broad")){
            String mes = intent.getStringExtra("mes");
            Toast.makeText(context, "开始广播:"+mes, Toast.LENGTH_SHORT).show();
        }
    }
}
静态注册

清单文件注册

		<!-- 注册广播 -->
        <receiver android:name=".MyBroadcast">
            <intent-filter>
                <!-- 频道 -->
                <action android:name="com.xh.broad" />
            </intent-filter>
        </receiver>
动态注册
		protected void onCreate(Bundle savedInstanceState) {
		     super.onCreate(savedInstanceState);
		     setContentView(R.layout.activity_main);
			//动态注册广播
		     myBroadcast2 = new MyBroadcast2(this);
		     IntentFilter intentFilter = new IntentFilter();
		     intentFilter.addAction("com.xh.broad.dong");
		     registerReceiver(myBroadcast2,intentFilter);
		}
		@Override
		    protected void onDestroy() {
		        super.onDestroy();
		        //销毁广播
		        unregisterReceiver(myBroadcast2);
		    }

B、有序广播

特点

无序广播无法掐断广播
有序广播可以掐断广播
优先级从大到小

有序广播的方法

			//掐断广播
            abortBroadcast();

清单注册

		<!-- 有序广播:范围-10001000 -->
        <receiver android:name=".order.MyBroadcast_wu">
            <intent-filter android:priority="-1000"><!-- 优先级 -->
                <action android:name="com.xh.order"></action>
            </intent-filter>
        </receiver>
        <receiver android:name=".order.MyBroadcast_you">
            <intent-filter android:priority="1000">
                <action android:name="com.xh.order"></action>
            </intent-filter>
        </receiver>

C、发送的方法

1.无序 : sendBroadcast()
2.有序 : sendOrderBroadcast()
3. 粘性 : sendStickyBroadcast()

四、系统广播

https://blog.csdn.net/cc_want/article/details/82344899

public class MainActivity extends AppCompatActivity {
    MyBroad myBroad;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        myBroad = new MyBroad();
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(Intent.ACTION_BATTERY_CHANGED);//电量改变
        intentFilter.addAction(Intent.ACTION_BATTERY_LOW);//低电量
        intentFilter.addAction(Intent.ACTION_BATTERY_OKAY);//电量充足
        intentFilter.addAction(Intent.ACTION_SCREEN_ON);//开屏
        intentFilter.addAction(Intent.ACTION_SCREEN_OFF);//锁屏
        intentFilter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);//飞行模式改变
        intentFilter.addAction(Intent.ACTION_CAMERA_BUTTON);//按下拍照键时
        intentFilter.addAction(Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE);//正在移动APP时,发出的广播
        intentFilter.addAction(Intent.ACTION_HEADSET_PLUG);//在耳机口上插入耳机时发出的广播
        registerReceiver(myBroad,intentFilter);

    }
}
public class MyBroad extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if(intent.getAction().equals(Intent.ACTION_BATTERY_CHANGED)){//电量发生改变
            int level = intent.getIntExtra("level", 0);
            Toast.makeText(context, "当前电量:"+level, Toast.LENGTH_SHORT).show();
        }else if(intent.getAction().equals(Intent.ACTION_BATTERY_LOW)){//低电量
            Toast.makeText(context, "当前电量过低,请及时充电!", Toast.LENGTH_SHORT).show();
        }else if(intent.getAction().equals(Intent.ACTION_BATTERY_OKAY)){//电量充足
            Toast.makeText(context, "电量充足!", Toast.LENGTH_SHORT).show();
        }else if(intent.getAction().equals(Intent.ACTION_SCREEN_OFF)){//锁屏
            Toast.makeText(context, "锁屏!", Toast.LENGTH_SHORT).show();
        }else if(intent.getAction().equals(Intent.ACTION_SCREEN_ON)){//开屏
            Toast.makeText(context, "开屏!", Toast.LENGTH_SHORT).show();
        }else if(intent.getAction().equals(Intent.ACTION_AIRPLANE_MODE_CHANGED)){//飞行模式改变
            Bundle extras = intent.getExtras();
            String state = extras.get("state").toString();
            if(state.equals("true")){
                Toast.makeText(context, "开启飞行:"+state, Toast.LENGTH_SHORT).show();
            }else if(state.equals("false")){
                Toast.makeText(context, "关闭飞行:"+state, Toast.LENGTH_SHORT).show();
            }
        }else if(intent.getAction().equals(Intent.ACTION_CAMERA_BUTTON)){//按下拍照键
            Toast.makeText(context, "拍照了:", Toast.LENGTH_SHORT).show();
        }else if(intent.getAction().equals(Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE)){//正在移动APP时,发出的广播
            Toast.makeText(context, "正在移动APP时,发出的广播:", Toast.LENGTH_SHORT).show();
        }else if(intent.getAction().equals(Intent.ACTION_HEADSET_PLUG)){//在耳机口上插入耳机时发出的广播
            boolean state = intent.hasExtra("state");
            if(state){
                int extra = intent.getIntExtra("state", 0);
                if(extra==0){
                    Toast.makeText(context, "拔出耳机", Toast.LENGTH_SHORT).show();
                }else{
                    Toast.makeText(context, "插入耳机", Toast.LENGTH_SHORT).show();
                }
            }
        }
    }
}

你可能感兴趣的:(Android第二个月)