码迷,mamicode.com
首页 > 移动开发 > 详细

Android四大组件:BroadcastReceiver的使用

时间:2018-02-03 21:59:11      阅读:237      评论:0      收藏:0      [点我收藏+]

标签:tools   parent   val   插入   android   tps   break   mode   studio   

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

 

Android四大组件:BroadcastReceiver的使用

标签:tools   parent   val   插入   android   tps   break   mode   studio   

原文地址:https://www.cnblogs.com/lyd447113735/p/8410755.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!