资讯专栏INFORMATION COLUMN

安卓基础之BroadcastReceiver

luckyyulin / 593人阅读

摘要:注册方法发送方法注意与中的对应张风捷特烈注销方法附录布局文件发送广播注销广播注册广播三安卓基础之有序广播先讲个场景小故事从前,有个小男孩捡到一颗漂亮的石头,他想去卖,价格元。在开启时注册广播用来监听屏幕的关闭,关闭时移除广播。

一、静态广播注册
MainActivity.java
public class MainActivity extends AppCompatActivity {

    @BindView(R.id.btn_send)
    Button mBtnSend;
    @BindView(R.id.btn_unregister)
    Button mBtnUnregister;
    @BindView(R.id.btn_register)
    Button mBtnRegister;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
    }

    @OnClick({R.id.btn_send})
    public void onViewClicked(View view) {
        switch (view.getId()) {
            case R.id.btn_send:
                Intent intent = new Intent();
                //注意setAction与AndroidManifest中的action对应
                intent.setAction("com.toly1994.aii_broadcastreceiver.StaticBR");
                intent.putExtra("msg" , "张风捷特烈");
                sendBroadcast(intent);
                break;
        }
    }
}
静态注册广播接受者:StaticBR.java
/**
 * 作者:张风捷特烈
 * 时间:2018/4/14:16:22
 * 邮箱:1981462002@qq.com
 * 说明:静态注册广播接受者
 */
public class StaticBR extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {

        String msg = intent.getStringExtra("msg");
        ToastUtil.show(context, msg + "
第一个简单广播创建成功!");
    }
}
静态注册:app/src/main/AndroidManifest.xml

            
                
            
        
经测试,Android8.0无法收到静态广播,Android7.0可以法收到静态广播  
静态注册一大好处是可以跨程序使用,A程序中的BroadcastReceiver可以在B程序中使用
Android8.0静态广播解决方案:intent.setComponent(new ComponentName(包全名,类全名))
intent.setComponent(new ComponentName("com.toly1994.aii_broadcastreceiver",
                        "com.toly1994.aii_broadcastreceiver.StaticBR"));

二、动态注册
在未注册之前,点击发送无效果,在注册后点击发送有效果,在注销之后点击无效果。  
点击的三个核心代码见下。

注册方法:
IntentFilter filter = new IntentFilter();
filter.addAction("com.toly1994.aii_broadcastreceiver.register");
mReceiver = new StaticBR();
registerReceiver(mReceiver, filter);
发送方法:
Intent intent = new Intent();
//注意setAction与AndroidManifest中的action对应
intent.setAction("com.toly1994.aii_broadcastreceiver.register");
intent.putExtra("msg", "张风捷特烈");
sendBroadcast(intent);
注销方法:
if (mReceiver != null) {
    unregisterReceiver(mReceiver);
    mReceiver = null;
}
附录:布局文件:activity_main.xml



    

    

三、安卓基础之BroadcastReceiver有序广播
先讲个场景小故事:
从前,有个小男孩捡到一颗漂亮的石头,他想去卖,价格1元。
男孩(Boy)大喊:"我有一个漂亮的石头,只卖1元",一个石匠买了这个石头。
石匠(Stonemason)大喊:"我有一个漂亮的石头,只卖1000元。"一个雕刻家买了这个石头。
雕刻家(Graver)大喊:"我有一个漂亮的石头,只卖10w元。"一个宝石家买了这个石头。
宝石家(RubyMan)大喊:"我有一个漂亮的石头,只卖1000w元。"收藏家买了这个石头。
收藏家(Collector)不喊了,静静地收藏起来。男孩用一元买了一个棒棒糖,开心地吃着。故事结束。

按照这个顺序,只要某个人不喊了,任何一个环节都可以被打断,而导致石头的价格出现差异。这就是有序广播的作用。

1.男孩广播接收者:BR1_Boy.java
public class BR1_Boy extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        //[1]获取到发送广播携带的数据
        String content = getResultData();
        //[2]展示到Toast上
        Toast.makeText(context, "男孩:" + content, Toast.LENGTH_LONG).show();
//        [2.1]终止广播
//        abortBroadcast();
        //[3]传递数据
        setResultData("我有一个漂亮的石头,只卖1000元");
    }
}
2.石匠广播接收者:BR2_Stonemason.java
public class BR2_Stonemason extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        //[1]获取到发送广播携带的数据
        String content = getResultData();
        //[2]展示到Toast上
        Toast.makeText(context, "石匠:" + content, Toast.LENGTH_LONG).show();
//        [2.1]终止广播
//        abortBroadcast();
        //[3]传递数据
        setResultData("我有一个漂亮的石头,只卖10W元");
    }
}
3.雕刻家广播接收者:BR3_Graver.java
public class BR3_Graver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        //[1]获取到发送广播携带的数据
        String content = getResultData();
        //[2]展示到Toast上
        Toast.makeText(context, "雕刻家:" + content, Toast.LENGTH_LONG).show();
//        [2.1]终止广播
//        abortBroadcast();
        //[3]传递数据
        setResultData("我有一个漂亮的石头,只卖1000W元");
    }
}
4.宝石家广播接收者:BR4_RubyMan.java
public class BR4_RubyMan extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        //[1]获取到发送广播携带的数据
        String content = getResultData();
        //[2]展示到Toast上
        Toast.makeText(context, "宝石家:" + content, Toast.LENGTH_LONG).show();
//        [2.1]终止广播
//        abortBroadcast();
        //[3]传递数据
        setResultData("我有一个漂亮的石头,价值1000W元");
    }
}
5.收藏家广播接收者:BR5_Collector.java
/**
 * 最终的receiver 不需要再清单文件里面配置
 */
public class BR5_Collector extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String content = getResultData();
        Toast.makeText(context, "收藏家:" + content, Toast.LENGTH_LONG).show();
    }
}
6.记得注册:app/src/main/AndroidManifest.xml




7.StoneStoryActivity.java
public class StoneStoryActivity extends AppCompatActivity {

    @BindView(R.id.id_btn_send)
    Button mIdBtnSend;
    @BindView(R.id.id_btn_reg)
    Button mIdBtnReg;
    private BR1_Boy mBr1_boy;
    private BR2_Stonemason mBr2_stonemason;
    private BR3_Graver mBr3_graver;
    private BR4_RubyMan mBr4_rubyMan;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_story);
        ButterKnife.bind(this);
    }

    @OnClick({R.id.id_btn_send, R.id.id_btn_reg})
    public void onViewClicked(View view) {
        switch (view.getId()) {
            case R.id.id_btn_send:
                Intent intent_order = new Intent();
                intent_order.setAction("www.toly1994.com");
                sendOrderedBroadcast(intent_order, null,
                        new BR5_Collector(), null, 1, 
                        "我有一个漂亮的石头,只卖1元", null);
                break;
            case R.id.id_btn_reg://动态注册所有
                IntentFilter filter = new IntentFilter();
                filter.addAction("www.toly1994.com");
                mBr1_boy = new BR1_Boy();
                mBr2_stonemason = new BR2_Stonemason();
                mBr3_graver = new BR3_Graver();
                mBr4_rubyMan = new BR4_RubyMan();
                registerReceiver(mBr1_boy, filter);
                registerReceiver(mBr2_stonemason, filter);
                registerReceiver(mBr3_graver, filter);
                registerReceiver(mBr4_rubyMan, filter);
                break;
        }
    }
}

8.如果石匠截断,不喊了,直接卖给收藏家
public class BR2_Stonemason extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        //[1]获取到发送广播携带的数据
        String content = getResultData();
        //[2]展示到Toast上
        Toast.makeText(context, "石匠:" + content, Toast.LENGTH_LONG).show();
//        [2.1]终止广播
        abortBroadcast();
        //[3]传递数据
        setResultData("我有一个漂亮的石头,价值1000元");
    }
}
附录、activity_story.xml



    

四、BroadcastReceiver实现锁、开屏、短信监听
1.按电源键,屏幕锁屏,再按电源键屏幕打开。在Activity开启时注册广播用来监听屏幕的关闭,Activity关闭时移除广播。  
2.这里只能在该Activity中监听,退出后BroadcastReceiver被注销,后面将会结合Service增强应用范围
3.后面也会结合传感器进行摇晃开屏,暗环境锁屏功能
4.短信监听,可以当收到短信时处理,比如提醒、备份、上传网络、删除、自动回复等

1:InnerActivity.java
public class InnerActivity extends AppCompatActivity {
    private ScreenReceiver mScreenReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_gary);
        ButterKnife.bind(this);
        regist();
    }

    /**
     * 动态的去注册屏幕解锁和锁屏的广播
     */
    private void regist() {
        // [1]动态的去注册屏幕解锁和锁屏的广播
        mScreenReceiver = new ScreenReceiver();
        // [2]创建intent-filter对象
        IntentFilter filter = new IntentFilter();
        // [3]添加要注册的action
        filter.addAction("android.intent.action.SCREEN_OFF");
        filter.addAction("android.intent.action.SCREEN_ON");
        // [4]注册广播接收者
        registerReceiver(mScreenReceiver, filter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //当activity销毁的时候  取消注册广播接收者
        unregisterReceiver(mScreenReceiver);
    }
}
2:广播接收者:ScreenReceiver.java
public class ScreenReceiver extends BroadcastReceiver {

    private static final String TAG = "ScreenReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {
        //[1]获取到当前广播的事件类型
        String action = intent.getAction();
        //[2]对当前广播事件类型做一个判断
        if ("android.intent.action.SCREEN_OFF".equals(action)) {
            Log.i(TAG, "屏幕锁屏了");
        } else if ("android.intent.action.SCREEN_ON".equals(action)) {
            Log.i(TAG, "屏幕解锁了");
        }
    }
}

短信监听
1、InnerActivity#regist
//注册短信广播接收者
IntentFilter smsFilter = new IntentFilter();
smsFilter.addAction("android.provider.Telephony.SMS_RECEIVED");
mSmsReceiver = new SmsReceiver();
registerReceiver(mSmsReceiver, smsFilter);
2、InnerActivity#onDestroy
unregisterReceiver(mSmsReceiver);//注销短信广播接收者
3、短信广播接收者:SmsReceiver.java
public class SmsReceiver extends BroadcastReceiver {

    //当短信到来的时候 就会执行这个方法
    @Override
    public void onReceive(Context context, Intent intent) {
        //[1]获取发短信送的号码  和内容
        Object[] objects = (Object[]) intent.getExtras().get("pdus");
        for (Object pdu : objects) {
            //[2]获取smsmessage实例
            SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) pdu);
            //[3]获取发送短信的内容
            String body = smsMessage.getMessageBody();
            Date date = new Date(smsMessage.getTimestampMillis());//时间
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            //[4]获取发送者
            String address = smsMessage.getOriginatingAddress();
            String receiveTime = format.format(date);
            Log.e("SmsReceiver", "body:" + body + "---" + address+"---"+receiveTime);
        }
    }
}
4、添加权限
    
    
    
5、安卓5.1,实验结果如下:(6.0以上注意动态权限)
E/SmsReceiver: body:hello---+8613167727310---2018-08-24 21:50:13

后记、
1.声明:
1.本文由张风捷特烈原创,转载请注明  
2.欢迎广大编程爱好者共同交流
3.个人能力有限,如有不正之处欢迎大家批评指证,必定虚心改正
4.看到这里,感谢你的喜欢与支持
2.连接传送门:

更多安卓技术欢迎访问:安卓技术栈
我的github地址:欢迎star
张风捷特烈个人网站:http://www.toly1994.com

3.联系我
QQ:1981462002   
邮箱:1981462002@qq.com
微信:zdl1994328

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/14416.html

相关文章

  • 安卓实战项目-动态桌面-简单实现

    摘要:先上效果图准备,桌面是一个小视频,要求,符合手机尺寸,最好不要超过,我这个只有几,开发环境,由于没后更新。 先上效果图showImg(https://segmentfault.com/img/bVWrXZ?w=315&h=588); 准备:1,桌面是一个小视频,要求,符合手机尺寸,最好不要超过100M,我这个只有几M 2,开发环境,由于没后更新。使用的还是Android studio...

    Tonny 评论0 收藏0
  • 安卓第四周Service,Broadcast Receiver,Widget,Webview

    摘要:表示可以水平拉伸,表示可以竖直拉伸可以被显示的位置。表示可以将添加到桌面,表示可以被添加到锁屏界面。在本例,由于此时在尚未有相关数据,创建实例时不能有效进行数据设置。机器重启,实例在主页上显示,会再次调用当被删除时被触发。 无聊的前言: 又是艰苦卓绝的一周,我这种人又想放弃了,真是无语。之前看了视频还以为挺简单,周五也做了一点点,自信满满留到周日下午完成。于是周六和朋友出去,聊了国家和...

    douzifly 评论0 收藏0
  • 安卓开发笔记(十一):SharedPrefences储存

    摘要:一利用将数据储存于当中这里主要是创建一个对象,这样才可以调用其中的方法,后面的东西照抄就可以了这里主要是根据传递到文件里的数据的类型来运用不同的函数进行编写这行代码的意思是通过就能够把二将数据从当中读取并进行更新前面的参数表示的是前面使用的一.利用SharedPrefences将数据储存于data.txt当中   package com.example.lenovo.studyittwo;...

    LiveVideoStack 评论0 收藏0
  • 安卓开发笔记(九):广播动态注册实现监听网络变化

    摘要:一中的广播主要分两种类型标准广播和有序广播。有序广播的工作流程如下有序广播工作示意图二注册广播的方式有两种,在代码中注册动态注册和在中注册静态注册。接下来先通过动态注册的方式编写一个能够监听网络变化的程序,学习一下广播接收器的基本用法。一. Android 中的广播主要分两种类型:标准广播和有序广播。 标准广播(Normal broadcasts)   是一种完全异步执行的广播,在广播发...

    Leo_chen 评论0 收藏0
  • 四年来Android面试大纲,作为一个Android程序员

    摘要:再附一部分架构面试视频讲解本文已被开源项目学习笔记总结移动架构视频大厂面试真题项目实战源码收录 Java反射(一)Java反射(二)Java反射(三)Java注解Java IO(一)Java IO(二)RandomAccessFileJava NIOJava异常详解Java抽象类和接口的区别Java深拷贝和浅拷...

    不知名网友 评论0 收藏0

发表评论

0条评论

luckyyulin

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<