zoukankan      html  css  js  c++  java
  • Android四大组件:BroadcastReceiver的使用

    BroadcastReceiver

    作用:

    监听 / 接收 应用 App 发出的广播消息,并 做出响应

    应用场景:

    • Android不同组件间的通信(含 :应用内 / 不同应用之间)
    • 多线程通信
    • 与 Android 系统在特定情况下的通信

    如:电话呼入时、网络可用时、耳机插入时

    初步使用BroadcastReceiver:实现向BroadcastRecever发送消息,在控制台输出BroadcastReceiver接收到的消息

    步骤一:

    activity_main.xml布局:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context="com.contentprovide.liuliu.brodcast_demo1.MainActivity">
    
    <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="传送消息"
        />
    
    </LinearLayout>
    

    步骤二:

    创建一个BroadcastReceiver(自定义类继承BroadcastReceiver,重写onReceive方法),

    package com.contentprovide.liuliu.brodcast_demo1;
    
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    
    public class MyReceiver extends BroadcastReceiver {
    
    
        @Override
        public void onReceive(Context context, Intent intent) {
    
            String s = intent.getStringExtra("date");
    
            System.out.println("===================接收到的消息是:"+s);
    
        }
    }
    

     这一步系统会在AndroidManifest.xml文件中自动静态注册BroadcastReceiver

    步骤三: Java代码向广播接收器传递信息

    package com.contentprovide.liuliu.brodcast_demo1;
    
    import android.content.Intent;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    
    public class MainActivity extends AppCompatActivity {
    
        Button btn;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            btn = (Button) findViewById(R.id.btn);
    
            btn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
    
                    Intent intent = new Intent(MainActivity.this, MyReceiver.class);
                    intent.putExtra("date", "11111");
    //                传送消息
                    sendBroadcast(intent);
    
                }
            });
    
    
        }
    
    
    }
    

    实现效果: 

     

     动态注册和注销BroadcastReceiver


    在Android Studio中一键创建BroadcastReceiver时系统会自动的静态注册,但是很多时候为了优化程序,在需要的时候动态注册,不需要时及时注销

    步骤一:activity_main.xml布局文件:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context="com.contentprovide.liuliu.brodcast_demo2.MainActivity">
    
    
        <Button
            android:id="@+id/btn_send"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="传送消息" />
    
        <Button
            android:id="@+id/btn_reg"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="注册接收器" />
    
        <Button
            android:id="@+id/btn_unreg"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="注销接收器" />
    
    
    </LinearLayout>
    

     步骤二:创建BroadcastRecever,声明一个对象用作广播接收器的类型

    MyReceiver.java

    package com.contentprovide.liuliu.brodcast_demo2;
    
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    
    public class MyReceiver extends BroadcastReceiver {
    
    //声明一个字符串变量储存当前广播接收器的路径,用作接收广播的类型
        public static final String Path = "com.contentprovide.liuliu.brodcast_demo2";
    
        @Override
        public void onReceive(Context context, Intent intent) {
    
            String s = intent.getStringExtra("date");
    
            System.out.println("===================接收到的消息是:"+s);
    
        }
    }
    

     步骤三:使用Java代码动态注册和注销广播接收器

    package com.contentprovide.liuliu.brodcast_demo2;
    
    import android.content.Intent;
    import android.content.IntentFilter;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    
    public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    
    
        Button btn_send, btn_reg, btn_unreg;
    
        Intent intent;
    
        MyReceiver myReceiver = null;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            btn_send = (Button) findViewById(R.id.btn_send);
            btn_reg = (Button) findViewById(R.id.btn_reg);
            btn_unreg = (Button) findViewById(R.id.btn_unreg);
    
            btn_send.setOnClickListener(this);
            btn_reg.setOnClickListener(this);
            btn_unreg.setOnClickListener(this);
    
            intent = new Intent(MyReceiver.Path);
    
    
        }
    
        @Override
        public void onClick(View view) {
            switch (view.getId()) {
                case R.id.btn_send:
                    intent.putExtra("date", "11111");
                    sendBroadcast(intent);
                    break;
                case R.id.btn_reg:
    //添加判断语句是为了防止重复注册和重复注销
                    if (myReceiver == null) {
                        myReceiver = new MyReceiver();
    //                     设置接收广播的类型,在实例化后面的括号中调用在MyReceiver.java中声明的字符串变量
                        IntentFilter intentFilter = new IntentFilter(myReceiver.Path);
    //                    注册广播接收器
                        registerReceiver(myReceiver, intentFilter);
                    }
    
                    break;
                case R.id.btn_unreg:
    
                    if (myReceiver != null) {
    //                    注销广播接收器
                        unregisterReceiver(myReceiver);
                        myReceiver = null;
                    }
                    break;
            }
        }
    
    
    }
    

     实现效果:在点击注册播放器前点击传送消息,控制台没有消息输出。先点击注册播放器再点击发送消息,控制台有消息输出。点击注销播放器后再点击发送消息,控制台也没有消息输出

    • Android中内置了多个系统广播:只要涉及到手机的基本操作(如开机、网络状态变化、拍照等等),都会发出相应的广播
    • 每个广播都有特定的Intent - Filter(包括具体的action),Android系统广播action如下:
    系统操作action
    监听网络变化 android.net.conn.CONNECTIVITY_CHANGE
    关闭或打开飞行模式 Intent.ACTION_AIRPLANE_MODE_CHANGED
    充电时或电量发生变化 Intent.ACTION_BATTERY_CHANGED
    电池电量低 Intent.ACTION_BATTERY_LOW
    电池电量充足(即从电量低变化到饱满时会发出广播 Intent.ACTION_BATTERY_OKAY
    系统启动完成后(仅广播一次) Intent.ACTION_BOOT_COMPLETED
    按下照相时的拍照按键(硬件按键)时 Intent.ACTION_CAMERA_BUTTON
    屏幕锁屏 Intent.ACTION_CLOSE_SYSTEM_DIALOGS
    设备当前设置被改变时(界面语言、设备方向等) Intent.ACTION_CONFIGURATION_CHANGED
    插入耳机时 Intent.ACTION_HEADSET_PLUG
    未正确移除SD卡但已取出来时(正确移除方法:设置--SD卡和设备内存--卸载SD卡) Intent.ACTION_MEDIA_BAD_REMOVAL
    插入外部储存装置(如SD卡) Intent.ACTION_MEDIA_CHECKING
    成功安装APK Intent.ACTION_PACKAGE_ADDED
    成功删除APK Intent.ACTION_PACKAGE_REMOVED
    重启设备 Intent.ACTION_REBOOT
    屏幕被关闭 Intent.ACTION_SCREEN_OFF
    屏幕被打开 Intent.ACTION_SCREEN_ON
    关闭系统时 Intent.ACTION_SHUTDOWN
    重启设备 Intent.ACTION_REBOOT

    注:当使用系统广播时,只需要在注册广播接收者时定义相关的action即可,并不需要手动发送广播,当系统有相关操作时会自动进行系统广播

    推荐相关博客:https://www.jianshu.com/p/ca3d87a4cdf3

  • 相关阅读:
    求一个字符串中连续出现次数最多的子串
    LintCode: Longest Common Substring
    LintCode: O(1) Check Power of 2
    LintCode: Fizz Buzz
    LintCode: 3 Sum
    LintCode: Two Sum
    LintCode: Sort Colors
    LintCode: Median of two Sorted Arrays
    LintCode: Search A 2d Matrix
    Lintcode: Sqrt(X)
  • 原文地址:https://www.cnblogs.com/lyd447113735/p/8410755.html
Copyright © 2011-2022 走看看