广播机制-案例

news2025/1/21 17:58:42

广播机制-案例

1.静态注册案例-接收开机广播

1.案例:接收开机的广播

  1. 创建自定义的BroadcastReceiver用于处理监听到的系统广播。
//接收系统开机的广播事件
public class BootCompleteReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "开机成功!", Toast.LENGTH_SHORT).show();
    }
}

  1. 注册广播接收器。
   <receiver android:name=".BootCompleteReceiver"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
        </receiver>
  1. 开启权限。
   <!--接收开机广播的权限-->
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

重启手机。

2.静/动态注册案例-发送广播

2.1动态注册的方式发送标准广播

  • 发送标准广播
  • 设置要发送的数据
  • 不带权限

(1)布局文件

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="发送标准广播"
        android:textSize="30dp"
        android:onClick="sendBroadcast" />

(2)Java代码

    //点击按钮发送标准广播
    public void sendBroadcast(View view) {
        //设置发送的数据
        Intent intent =new Intent();
        intent.setAction("com.lxz.app8");
        intent.putExtra("code","我是张三!");
        //动态注册
        IntentFilter filter=new IntentFilter();
        filter.addAction("com.lxz.app8");
        BroadcastReceiver1 receiver=new BroadcastReceiver1();
        registerReceiver(receiver,filter);
        //发送广播
        sendBroadcast(intent);

    }

(3)自定义广播接收器

//接收标准广播
public class BroadcastReceiver1 extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "接收信息:"+intent.getStringExtra("code"), Toast.LENGTH_SHORT).show();
    }
}

(4)效果图

2.2在1的基础上设置权限

(1)manifest中定义和设置权限

    <!--定义权限-->
    <permission android:name="com.lxz.app.permission"/>
    <!--设置权限-->
    <uses-permission android:name="com.lxz.app.permission"/>

(2)布局文件

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="发送标准广播(带权限)"
        android:textSize="30dp"
        android:onClick="sendBroadcast2" />

(3)发送广播的Java代码

  //点击按钮发送标准广播(带权限)
    public void sendBroadcast2(View view) {
        //设置发送的数据
        Intent intent =new Intent();
        intent.setAction("com.lxz.app8");
        intent.putExtra("code","我是张三!有权限!");
        //动态注册
        IntentFilter filter=new IntentFilter();
        filter.addAction("com.lxz.app8");
        BroadcastReceiver1 receiver=new BroadcastReceiver1();
        registerReceiver(receiver,filter);

        //设置权限
        String str="com.lxz.app.permission";
        //发送广播
        sendBroadcast(intent,str);

    }

(4)广播接收器

//接收标准广播
public class BroadcastReceiver1 extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "接收信息:"+intent.getStringExtra("code"), Toast.LENGTH_SHORT).show();
    }
}

(5)效果图

2.3有序广播的测试

  • 采用静态注册的方式
  • 设置优先级

(1)布局文件


    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="发送有序广播"
        android:textSize="30dp"
        android:onClick="sendOrderBroadcast1" />

(2)发送有序广播的方法

 //点击按钮发送有序广播
    public void sendOrderBroadcast1(View view) {
        //设置发送的数据
        Intent intent =new Intent();
        intent.setAction("com.lxz.app8");
        intent.putExtra("code","请依次报号!");

        //发送广播-参数2代表的是自定义的权限
        sendOrderedBroadcast(intent,null);

    }

(3)注册代码

    <!--注册广播-->
        <receiver android:name=".BroadcastOrderReceiver"
            android:exported="true"
            >
            <intent-filter android:priority="0">
                <action android:name="com.lxz.app8"/>
            </intent-filter>
        </receiver>
        <receiver android:name=".BroadcastOrderReceiver1"
            android:exported="true"
            >
            <intent-filter android:priority="1">
                <action android:name="com.lxz.app8"/>
            </intent-filter>
        </receiver>
        <receiver android:name=".BroadcastOrderReceiver2"
            android:exported="true"
            >
            <intent-filter android:priority="2">
                <action android:name="com.lxz.app8"/>
            </intent-filter>
        </receiver>
        <receiver android:name=".BroadcastOrderReceiver3"
            android:exported="true"
            >
            <intent-filter android:priority="3">
                <action android:name="com.lxz.app8"/>
            </intent-filter>
        </receiver>

(4)广播接收者

  • 注册顺序从上到下
  • 优先级从下到上
  • 响应的时候从下到上

  • 代码从下到上依次为
public class BroadcastOrderReceiver3 extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "接收信息:"+intent.getStringExtra("code")+"我是3号", Toast.LENGTH_SHORT).show();
        Bundle bundle=getResultExtras(true);
        System.out.println("----第3个接收器---");
        System.out.println("附加信息---"+bundle.getString("other"));
        bundle.putString("other",bundle.getString("other")+",我是3号!");
        setResultExtras(bundle);

    }
}

public class BroadcastOrderReceiver2 extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "接收信息:"+intent.getStringExtra("code")+"我是2号", Toast.LENGTH_SHORT).show();
        Bundle bundle=getResultExtras(true);
        System.out.println("----第2个接收器---");
        System.out.println("附加信息---"+bundle.getString("other"));
        bundle.putString("other",bundle.getString("other")+",我是2号!");
        setResultExtras(bundle);


    }
}

public class BroadcastOrderReceiver1 extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "接收信息:"+intent.getStringExtra("code")+"我是1号", Toast.LENGTH_SHORT).show();
        Bundle bundle=getResultExtras(true);
        System.out.println("----第1个接收器---");
        System.out.println("附加信息---"+bundle.getString("other"));
        bundle.putString("other",bundle.getString("other")+",我是1号!");
        setResultExtras(bundle);
        //停止广播的传递
        abortBroadcast();
        System.out.println("阻断传播");
    }
}

public class BroadcastOrderReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "接收信息:"+intent.getStringExtra("code")+"我是0号", Toast.LENGTH_SHORT).show();
        Bundle bundle=getResultExtras(true);
        System.out.println("----第0个接收器---");
        System.out.println("附加信息---"+bundle.getString("other"));
    }
}

(5)效果图

3.本地广播案例-简单的发送和接收

1.参考代码

(1)布局文件代码

 <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="发送本地广播"
        android:textSize="30dp"
        android:onClick="localBroadcast" />

(2)发送本地广播的Java代码

    //发送本地广播
    public void localBroadcast(View view) {
        //设置数据
        Intent intent=new Intent();
        intent.setAction("com.lxz.localapp");
        intent.putExtra("code","我是本地广播");
        //动态注册
        LocalBroadReceiver receiver=new LocalBroadReceiver();
        IntentFilter filter=new IntentFilter();
        filter.addAction("com.lxz.localapp");
        LocalBroadcastManager manager=LocalBroadcastManager.getInstance(getApplicationContext());
        manager.registerReceiver(receiver,filter);

        //发送广播
        manager.sendBroadcast(intent);
    }

(3)本地广播接收者的代码

//接收本地广播
public class LocalBroadReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "接收信息:"+intent.getStringExtra("code"), Toast.LENGTH_SHORT).show();
    }
}

(4)效果图

4.本地广播案例-仿qq下线

待实现

1.案例要求

  • 像QQ一样,正在运行的QQ,如果我们用别的手机再次登陆自己的账号,前面这个是会提醒账户在别的终端登录,然后把我们打开的app都关掉,然后回到登陆页面。LoginActivity.java
  • 注意:需要在模拟器中设置—应用-左上角— —打开应用信息—设置出现在其它应用上

2.参考代码

(1)项目目录结构

(2)ActivityCtroller代码。

  • 用于管理所有的Activity
//Activity管理类
public class ActivityController {
    //保存Activity
   private static List<Activity> list=new ArrayList<>();
   //添加Activity
   public  static void addActivity(Activity activity){
        list.add(activity);
   }
    //删除Activity
    public  static void removeActivity(Activity activity){
        list.remove(activity);
    }
    //结束所有的Activity
    public static void finishAllActivity(){
        for (Activity a:list){
           if (!a.isFinishing()){
               a.finish();
           }
        }
    }
}

(3)BaseActivity,是登录成功界面的基类,可以注册BroadcastReceiver。

  • 注意必须添加
  • android.intent.category.DEFAULT
public class BaseActivity extends AppCompatActivity {
    private LoginOutReceiver receiver;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ActivityController.addActivity(this);
    }

    @Override
    protected void  onResume() {
        super.onResume();
        //注册广播
        IntentFilter filter = new IntentFilter();
        filter.addAction("com.lxz.loginout");
        filter.addCategory("android.intent.category.DEFAULT");
        receiver = new LoginOutReceiver();
        registerReceiver(receiver, filter);


    }

    @Override
    protected void onPause() {
        super.onPause();

        if (receiver!=null){
            unregisterReceiver(receiver);
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

    }
}

(4)登录界面的Activity。

//仿qq下线
public class LoginActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
    }

    //方法:登录
    public void login(View view) {
        EditText account=findViewById(R.id.account);
        EditText password=findViewById(R.id.password);
        System.out.println(account+","+password);
        if (account.getText().toString().equals("root")&&password.getText().toString().equals("123456")){
             Toast.makeText(this, "登录成功!", Toast.LENGTH_SHORT).show();
            Intent intent=new Intent();
            intent.setClass(getApplicationContext(),LoginSuccessActivity.class);
            startActivity(intent);
            finish();
        }
        else{
            Toast.makeText(this, "账号或密码错误!", Toast.LENGTH_SHORT).show();
        }


    }
}

(5)登录界面activity对应的布局文件。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".LoginActivity">

    <TableLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:stretchColumns="1">

        <TableRow>

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:inputType="text"
                android:text="账号:"
                android:textSize="30dp" />

            <EditText
                android:id="@+id/account"
                android:text="root"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="账号(root)"
                android:inputType="text"
                android:maxLines="1"
                android:textSize="30dp" />
        </TableRow>

        <TableRow>

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:inputType="text"
                android:text="密码:"
                android:textSize="30dp" />

            <EditText
                android:id="@+id/password"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="密码(123456)"
                android:inputType="text"
                android:maxLines="1"
                android:text="123456"
                android:textSize="30dp" />
        </TableRow>
    </TableLayout>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="login"
        android:text="登录"
        android:textSize="30dp" />
</LinearLayout>

(6)登录成功Activity,LoginSuccessActivity的代码。

  • 发送广播
//登录成功后的界面
public class LoginSuccessActivity extends BaseActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login_success);
        //当登录后的Activity添加到管理类中去
        ActivityController.addActivity(this);


    }

    //方法:强制下线(发布广播)
    public void outlogin(View view) {
            Intent intent=new Intent();
            intent.setAction("com.lxz.loginout");
            intent.addCategory("android.intent.category.DEFAULT");
           sendBroadcast(intent);
    }

}

(7)activity_login_success布局文件代码。

  • 有一个强制下线的按钮。
<?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"
    android:orientation="vertical"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".LoginSuccessActivity">

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="outlogin"
        android:text="强制下线"
        android:textSize="30dp" />
</LinearLayout>

(8)LoginOutReceiver广播接收器代码。

  • 设置一个Dialog用于弹窗
  • 我目前测试了本地广播和系统广播发现本地广播的context会报错,可能是因为进程号不统一导致的。
//强制下线的界面
public class LoginOutReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        AlertDialog.Builder builder=new AlertDialog.Builder(context);
        builder.setTitle("Error")
                .setMessage("您的账号在另外一台设备登录,程序即将回到登录界面!")
                .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        ActivityController.finishAllActivity();
                        Toast.makeText(context, "退出成功!", Toast.LENGTH_SHORT).show();
                        Intent intent1=new Intent();
                        intent1.setClass(context,LoginActivity.class);
                        context.startActivity(intent1);
                    }
                })
                ;
                builder.create().show();    }
}

(9)效果图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/116167.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023跨境出海指南:马来西亚网红营销白皮书

当前的东南亚市场可谓是是企业出海的大热门&#xff0c;马来西亚作为东南亚地区的第三大经济体&#xff0c;其发展形势也是一片大好。疫情出现后&#xff0c;马来西亚的娱乐和消费转移到线上&#xff0c;对社媒的依赖也催发了网红经济的发展。本文Nox聚星就和大家探讨一下&…

海康威视人脸识别设备对接(一)环境搭建

需要对接海康威视人脸识别设备&#xff0c;这里选择明眸门禁&#xff0c;还有其他的没研究过 打开海康威视开放平台 https://open.hikvision.com/ 选择开放体系&#xff0c;一直选择到设备集成SDK 这里我选择设备网络SDK 点击查看详情 选择对应的版本&#xff0c;我用笔记…

AD入门学习—原理图的绘制3

目录 2.4 CAN&24C02及DS18B20温度传感单元的绘制 2.5 USB单元的绘制 2.6 SD卡及TFT单元的绘制 2.7 NRF24L01单元的绘制 2.8 COM口及PS/2接口的绘制 2.9 DCDC电源输入单元的绘制 2.10 原理图的统一编号及编译检查 学习目录 2.4 CAN&24C02及DS18B20温度传感单元的绘制…

Vue基本指令

1、前端技术的发展&#xff08;html、CSS、JavaScript&#xff09; ​ &#xff08;1&#xff09;jQuery&#xff1a;是对JavaScript进行了封装&#xff0c;使得操作DOM、事件处理、动画处理、ajax交互变得非常简洁、方便。是JavaScript的 库。 ​ &#xff08;2&#xff09…

Moonbeam与Wormhole的Relayer Engine之间的跨链互连合约

如果您不了解Moonbeam&#xff0c;用一句话简单概括来说Moonbeam是跨链通信的中心枢纽。像Axelar、LayerZero和Hyperlane等的协议允许不同EVM上的智能合约互相通信&#xff0c;为Web3 dApp解锁功能方面前所未见的规模。但就目前来说&#xff0c;上述的几个协议的智能合约通信仅…

计算机网络——数据报与虚电路

简介 本篇接上一篇数据交换的内容继续 分组交换其实包含数据报交换和虚电路交换 数据报方式&#xff1a;为网咯层提供外连接服务 虚电报&#xff1a;为网络层提供连接服务 无连接服务&#xff1a;不事先为分组传输确定传输的路径&#xff0c;每个分组独立确定传输路径&#x…

如何实现带动画的动态面包屑,来看看?

大家好&#xff0c;我是派大星&#xff0c;最近在自己手动搭建一个后台管理平台&#xff0c;将其命名为 “雷达行动 Radar-Solution” &#xff0c;在开发的过程中对比了一下其他已经成型的后台解决方案&#xff0c;发现都存在一个共性&#xff0c;就是在Layout的头部都有一个面…

分布式理论之分布式事务

写在前面 我们知道&#xff0c;像MySQL的InnoDB存储引擎提供了事务的能力&#xff0c;严格遵守AICD的事务要求&#xff0c;但是在分布式环境中&#xff0c;一个请求会在多个服务实例存在多个事务&#xff0c;如购物&#xff0c;会有订单系统&#xff0c;支付系统&#xff0c;物…

springboot够用就好系列-1.自定义LengthJudge注解校验字段长度

类似NonNull注解标注在参数之上&#xff0c;表示对应的值不可以为空&#xff0c;利用java的元注解及注解处理器实现检查属性长度的功能。 目录 程序效果 实现过程 样例代码 参考资料 程序效果 截图1.用户名超长提示 检查登录时“用户名”、“密码”字段的长度&#xff0c;此…

安全智能分析 环境迁移

环境迁移 Platfor m Ops for AI 作为整合了 DataOps、MLOps、ModelOps 的复杂技术平台&#xff0c;在项目开发时仅使用一套系统无法支撑平台的稳定搭建&#xff0c;往往需要开发系统、集成测试系统、正式 环境系统在项目生命周期 中协作配合。将表、索引、并发程序、配置内容等…

新手想做短视频可以选择什么领域,这三个可以无脑尝试

大家好&#xff0c;我是蝶衣王的小编 对于小白来说&#xff0c;如果你想通过短视频来赚钱&#xff0c;你不能在流行的领域去做。因为坑不是你能接受的&#xff0c;而且有太多的同行&#xff0c;你的竞争优势没法显现出来。下面分享一下新手适合做的短视频领域​。 一、盘点类型…

海思嵌入式开发-001-基于Ubuntu20.04搭建开发环境

海思嵌入式开发-001-基于Ubuntu20.04搭建开发环境一、虚拟机安装ubuntu20.041、安装虚拟机VMware2、基于虚拟机安装ubuntu20.04二、开发环境配置1、参考资料2、问题汇总一、虚拟机安装ubuntu20.04 1、安装虚拟机VMware 主机配置为Windows 10系统&#xff0c;CPU为i7-8550U 4核…

虹科新闻|ATTO 宣布支持 Apple 最新操作系统 macOS® 13 Ventura

一、即时发布 近期&#xff0c;虹科的合作伙伴ATTO公司宣布支持Apple最新操作系统macOS13 Ventura&#xff0c;所有HK-ATTO适配器、软件和实用程序都已经过新操作系统的测试和验证。 ATTO 34年来为数据密集型计算环境提供网络、存储连接和基础架构解决方案的全球领导者&#…

一文读懂什么是低代码开发?

世界在应用程序上运行&#xff0c;商业世界也不例外。面对变化&#xff0c;企业过去依赖的传统应用程序开发流程可能不再有效。从头开始构建软件解决方案需要花费数月甚至数年的时间来规划、设计、测试和部署。当您的组织需要快速解决方案时&#xff0c;等待负担过重的开发人员…

真实世界的人工智能应用落地——OpenAI篇 ⛵

&#x1f4a1; 作者&#xff1a;韩信子ShowMeAI &#x1f4d8; 深度学习实战系列&#xff1a;https://www.showmeai.tech/tutorials/42 &#x1f4d8; 本文地址&#xff1a;https://www.showmeai.tech/article-detail/414 &#x1f4e2; 声明&#xff1a;版权所有&#xff0c;转…

CVE-2018-1273漏洞复现

今天继续给大家介绍渗透测试相关知识&#xff0c;本文主要内容是CVE-2018-1273漏洞复现。 免责声明&#xff1a; 本文所介绍的内容仅做学习交流使用&#xff0c;严禁利用文中技术进行非法行为&#xff0c;否则造成一切严重后果自负&#xff01; 再次强调&#xff1a;严禁对未授…

Web3中文|未来的工作模式:VR头显、元宇宙和供应商协作

根据Meta最近发布的一份关于未来工作模式的报告&#xff0c;大约三分之一的美英劳动力在进行远程办公&#xff0c;因此企业必须重新定义工作方式和管理机制&#xff0c;并探索元宇宙和虚拟现实等创新领域。 报告称&#xff1a;“这将推动企业寻求更具创造性和创新性的方法来凝…

canal中间件集成springboot实战落地

目录 一、数据库开启相关权限功能&#xff1a; 二、canal 服务端配置启动&#xff1a;从官网下载程序和源码到本地环境 三、canal客户端配置启动&#xff1a; canal中间件集成springboot实战落地开始分享&#xff0c;这是目前互联网很常见的中间件&#xff0c;监听数据库变化…

Harbor镜像仓库的安装以及Docker从Harbor上传与下载镜像

Harbor镜像仓库的安装与使用 简介&#xff1a;Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器&#xff0c;除了Harbor这个私有镜像仓库外&#xff0c;还有Docker官方提供的Registry。相对Registry&#xff0c;Harbor具有很多优势,本文主要介绍Harbor镜像仓库的安…

Serivice案例

Serivice启动方式案例 1.案例1&#xff1a;-start方式启动 1.1创建服务 //服务类 public class MyService extends Service {//创建服务调用一次Overridepublic void onCreate() {System.out.println("onCreate");Toast.makeText(this, "onCreate", Toast.…