我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android广播机制原理与开发的方法是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android广播机制原理与开发的方法是什么

今天小编给大家分享一下Android广播机制原理与开发的方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

广播机制简介

  • 标准广播:完全异步执行,广播发出后,所有广播接收器几乎都同一时刻收到这条广播(无法被截断)

  • 有序广播:同步执行,广播发出后同一时刻只会有一个广播接收器能收到这条广播消息,前面的接收器可以截断正在传递的广播

Android广播机制原理与开发的方法是什么

接收系统广播

广播接收器可在代码中注册和AndroidManifest.xml中注册,前者为动态注册,后者被称为静态注册。

动态注册监听网络变化

示例代码:

public class MainActivity extends AppCompatActivity {    private IntentFilter intentFilter;    private NetworkChangeReceiver networkChangeReceiver;    @Override    protected void onCreate(Bundle savedInstanceState){        super.onCreate(savedInstanceState);        setContentView((R.layout.activity_main));        intentFilter= new IntentFilter();        intentFilter.addAction("android.net.conn.CONNECTIVITY_VHANGE");        networkChangeReceiver = new NetworkChangeReceiver();        registerReceiver(networkChangeReceiver, intentFilter);    }    @Override    protected void onDestroy(){        super.onDestroy();        unregisterReceiver(networkChangeReceiver);    }    class NetworkChangeReceiver extends BroadcastReceiver {        @Override        public void onReceive(Context context, Intent intent){            ConnectivityManager connectionManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);            NetworkInfo networkInfo = connectionManager.getActiveNetworkInfo();            if(networkInfo != null && networkInfo.isAvailable()){                Toast.makeText(context, "network is available", Toast.LENGTH_SHORT).show();            }else {                Toast.makeText(context, "network is unavailable", Toast.LENGTH_SHORT).show();            }            Toast.makeText(context, "network changes", Toast.LENGTH_SHORT).show();        }    }}

静态注册实现开机启动

<receiver            android:name=".BootCompleteReceiver"            android:enabled="true"            android:exported="true"></receiver>

Export属性表示是否允许这个广播接收器接收本程序以外的广播,enable表示是否使用这个广播接收器。

<receiver            android:name=".BootCompleteReceiver"            android:enabled="true"            android:exported="true">            <intent-filter>                <action android:name="android.intent.action.BOOT_COMPLETED"/>            </intent-filter>        </receiver>

添加了filter就可以过滤了

可以通过左键新建-》其它来新建静态注册广播

广播接收器中不允许开线程,当onReceive方法运行较长时间而没结束时,程序就会报错,所以其中不能添加过多的逻辑或任何耗时操作。

发送自定义广播

发送标准广播

@Override    protected void onCreate(Bundle savedInstanceState){        super.onCreate(savedInstanceState);        setContentView((R.layout.activity_main));        Button button = (Button)findViewById(R.id.button);        button.setOnClickListener(new View.OnClickListener(){            @Override            public void onClick(View v){                Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");                sendBroadcast(intent);            }        });    }

通过点击按钮发送广播

public class myBroadcastReceiver extends BroadcastReceiver {    @Override    public void onReceive(Context context, Intent intent) {        Toast.makeText(context, "receiverd in myBroadcastReceiver", Toast.LENGTH_SHORT).show();    }}

这里是自定义的接收器

<receiver            android:name=".myBroadcastReceiver"            android:enabled="true"            android:exported="true">            <intent-filter>                <action android:name="com.example.broadcasttest.MY_BROADCAST"/>            </intent-filter>        </receiver>

在xml中定义过滤的广播类型

发送有序广播

广播是一种跨进程的通信方式

protected void onCreate(Bundle savedInstanceState){        super.onCreate(savedInstanceState);        setContentView((R.layout.activity_main));        Button button = (Button)findViewById(R.id.button);        button.setOnClickListener(new View.OnClickListener(){            @Override            public void onClick(View v){                Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");                sendOrderedBroadcast(intent, null);            }        });    }

只需要修改一行代码 sendOrederedBroadcast即可发送有序广播,同时在接收器的xml文件中可以设置优先级

<receiver            android:name=".myBroadcastReceiver"            android:enabled="true"            android:exported="true"><!--            在这里设置优先级-->            <intent-filter android:priority="100">                <action android:name="com.example.broadcasttest.MY_BROADCAST"/>            </intent-filter>        </receiver>

如果想要在接收到广播之后就让广播停止继续传递呢,修改onReceive的代码即可

public void onReceive(Context context, Intent intent) {        Toast.makeText(context, "receiverd in myBroadcastReceiver", Toast.LENGTH_SHORT).show();//        停止继续传递        abortBroadcast();    }

使用本地广播

前面我们发送和接收的广播全部属于系统全局广播,即发出的广播可以被其他任何应用程序接收到,并且我们也可以接收来自于其他任何应用程序的广播。这样就很容易引起安全性的问题,比如说我们发送的一些携带关键性数据的广播有可能被其他的应用程序截获,或者其他的程序不停地向我们的广播接收器里发送各种垃圾广播。

使用本地广播则发出的广播只能在应用程序内部传递,并且接收器也只能接收来自本应用程序发出的广播。

public class MainActivity extends AppCompatActivity {    private IntentFilter intentFilter;    private LocalReceiver localReceiver;    private LocalBroadcastManager localBroadcastManger;    @Override    protected void onCreate(Bundle savedInstanceState){        super.onCreate(savedInstanceState);        setContentView((R.layout.activity_main));        localBroadcastManger = LocalBroadcastManager.getInstance(this); //获取实例        Button button = (Button) findViewById(R.id.button);        button.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                Intent intent = new Intent("com.example.broadcasttest.LOCAL_BROADCAST");                localBroadcastManger.sendBroadcast(intent); //发送本地广播            }        });        intentFilter = new IntentFilter();        intentFilter.addAction("com.example.broadcasttest.LOCAL_BROADCAST");        localReceiver = new LocalReceiver();        localBroadcastManger.registerReceiver(localReceiver, intentFilter); //注册本地广播监听器    }    @Override    protected void onDestroy(){        super.onDestroy();        localBroadcastManger.unregisterReceiver(localReceiver);    }    class LocalReceiver extends BroadcastReceiver {        @Override        public void onReceive(Context context, Intent intent){            Toast.makeText(context, "received local broadcast", Toast.LENGTH_SHORT).show();        }    }}

代码的不同主要在于需要首先获取实例,然后还要有注册。

需要注意的是,本地广播无法通过静态注册来接收。

使用广播实现强制下线功能

强制下线功能首先需要实现下关闭所有的活动的功能,新建一个ActivityCollector类管理所有的活动

public class ActivityCollector {    public static List<Activity> activities = new ArrayList<>();    public static void addActivity(Activity activity){        activities.add(activity);    }    public static void removeActivity(Activity activity){        activities.remove(activity);    }    public static void finishAll(){        for(Activity activity:activities){            if(!activity.isFinishing()){                activity.finish();            }        }    }}

然后创建baseActivity类作为活动的父类,代码如下:

public class BaseActivity extends AppCompatActivity {    private ForceOfflineReceiver receiver;    @Override    protected void onCreate(Bundle savedInstanceState){        super.onCreate(savedInstanceState);        ActivityCollector.addActivity(this);    }    @Override    protected void onResume(){        super.onResume();        IntentFilter intentFilter = new IntentFilter();        intentFilter.addAction("com.example.broadcastbestpractice.FORCE_OFFLINE");        receiver = new ForceOfflineReceiver();        registerReceiver(receiver, intentFilter);    }    @Override    protected void onPause(){        super.onPause();        if(receiver != null){            unregisterReceiver(receiver);            receiver = null;        }    }    @Override    protected void onDestroy(){        super.onDestroy();        ActivityCollector.removeActivity(this);    }    class ForceOfflineReceiver extends BroadcastReceiver{        @Override        public void onReceive(final Context context, Intent intent){            AlertDialog.Builder builder = new AlertDialog.Builder(context);            builder.setTitle("warning");            builder.setMessage("You are forced to be offline");            builder.setCancelable(false);            builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {                @Override                public void onClick(DialogInterface dialogInterface, int which) {                    ActivityCollector.finishAll(); //销毁所有活动                    Intent intent = new Intent(context, LoginActivity.class);                    context.startActivity(intent); //重新启动loginActivity                }            });            builder.show();        }    }}

我们可以注意到,之前编写注册和销毁接收器的时候是在onCreate和onDestroy这两个函数里的,但是上面代码中却写在了onResume和onPause里面,这是因为我们每次都只需要在栈顶的活动接收广播,非栈顶活动没必要接收这条广播。

除此之外,我们创建一个登陆的活动,在活动页面上放置输入框,并编写登录逻辑

<?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayout 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:id="@+id/container"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingBottom="@dimen/activity_vertical_margin"    tools:context=".ui.login.LoginActivity">    <LinearLayout        android:orientation="horizontal"        android:layout_width="match_parent"        android:layout_height="60dp"        tools:ignore="MissingConstraints">        <TextView            android:layout_width="90dp"            android:layout_height="wrap_content"            android:layout_gravity="center_horizontal"            android:textSize="18sp"            android:text="Account:"/>        <EditText            android:layout_width="0dp"            android:layout_height="wrap_content"            android:id="@+id/account"            android:layout_weight="1"            android:layout_gravity="center_horizontal"/>    </LinearLayout>    <LinearLayout        android:orientation="horizontal"        android:layout_width="match_parent"        android:layout_height="60dp"        tools:ignore="MissingConstraints">        <TextView            android:layout_width="90dp"            android:layout_height="wrap_content"            android:layout_gravity="center_horizontal"            android:textSize="18sp"            android:text="password:"/>        <EditText            android:layout_width="0dp"            android:layout_height="wrap_content"            android:id="@+id/password"            android:layout_weight="1"            android:layout_gravity="center_horizontal"/>    </LinearLayout>    <Button        android:layout_width="match_parent"        android:layout_height="60dp"        android:id="@+id/login"        android:text="Login"        tools:ignore="MissingConstraints"></Button></androidx.constraintlayout.widget.ConstraintLayout>
public class LoginActivity extends AppCompatActivity {    private EditText accountEdit;    private EditText passwordEdit;    private Button login;    @Override    protected void onCreate(Bundle savedInstanceState){        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_login);        accountEdit = (EditText) findViewById(R.id.account);        passwordEdit = (EditText) findViewById(R.id.password);        login = (Button) findViewById(R.id.login);        login.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                String account = accountEdit.getText().toString();                String password = passwordEdit.getText().toString();                //如果账号是admin 且密码是123456则登录成功                if(account.equals("admin") && password.equals("123456")){                    Intent intent = new Intent(LoginActivity.this, MainActivity.class);                    startActivity(intent);                    finish();                }else {                    Toast.makeText(LoginActivity.this, "account is invalid", Toast.LENGTH_SHORT).show();                }            }        });    }}

这样就模拟了登录的窗口,然后在mainActivity中加入触发强制下线的代码

public class MainActivity extends BaseActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        Button forceOffline = (Button) findViewById(R.id.force_offline);        forceOffline.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Intent intent = new Intent("com.example.broadcastbestpractice.FROCE_OFFLINE");                sendBroadcast(intent);            }        });    }}

这样逻辑就差不多了,下面去AndroidManifest.xml中修改下程序入口即可。

以上就是“Android广播机制原理与开发的方法是什么”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android广播机制原理与开发的方法是什么

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android广播机制原理与开发的方法是什么

今天小编给大家分享一下Android广播机制原理与开发的方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。广播机制简介
2023-07-05

Android广播机制原理与开发

Android广播机制就是在Android中,有一些操作完成以后,会发送广播,比如说发出一条短信,或打出一个电话,如果某个程序接收了这个广播,就会做相应的处理
2023-02-23

Android开发之Kotlin委托的原理与使用方法是什么

今天小编给大家分享一下Android开发之Kotlin委托的原理与使用方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧
2023-07-05

android Handler机制的原理是什么

Android中的Handler机制是用来实现线程之间的通信的一种机制。它的原理是基于消息队列和消息循环。每个线程都有自己的消息队列,当一个线程需要与其他线程进行通信时,它可以创建一个Handler对象,并将消息发送到其他线程的消息队列中。
2023-09-20

android handler的机制和原理是什么

Android中的Handler机制是用于在不同线程之间进行消息传递和任务调度的一种机制。它的原理是基于消息队列和Looper。1. 消息队列(MessageQueue):每个线程都有一个消息队列,用于存放待处理的消息。Handler通过向
2023-08-24

Android开机动画制作的方法是什么

Android开机动画通常是通过修改系统文件来实现的。具体方法如下:获取Root权限:首先需要获取Root权限,以便能够修改系统文件。可以通过Root手机或使用Root工具(如Magisk、SuperSU等)来获取Root权限。查找系统文件
2023-10-26

android中事件分发机制的实现原理是什么

android中事件分发机制的实现原理是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。android中的事件处理,以及解决滑动冲突问题都离不开事件分发机制,androi
2023-05-30

Scala+Eclipse+Android手机开发的方法是什么

本篇内容介绍了“Scala+Eclipse+Android手机开发的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!众所周知Andr
2023-06-17

android组件化开发的原理是什么

Android组件化开发的原理是将一个大型的应用程序拆分成多个独立的组件,每个组件包含自己的功能模块和界面,然后通过定义清晰的接口和通信方式,将这些组件进行解耦和集成。这样做的目的是提高开发效率、降低维护成本、增加代码重用性和模块化程度。
2023-10-22

Android音频开发录制音频的方法是什么

这篇文章主要讲解了“Android音频开发录制音频的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Android音频开发录制音频的方法是什么”吧!首先看下音频录制跟播放效果简图:上
2023-06-21

android事件分发与处理的方法是什么

Android事件分发与处理的方法主要有以下几种:1. 触摸事件分发处理:Android中的触摸事件主要包括按下、移动、抬起等动作。在ViewGroup中,通过dispatchTouchEvent()方法将触摸事件分发给子View进行处理,
2023-09-13

Android handle-message的发送与处理方法是什么

在Android中,`Handler`类用于发送和处理消息。发送消息:1. 创建一个`Handler`对象。2. 创建一个`Message`对象,用于包含要发送的消息内容。3. 使用`Handler`对象的`sendMessage()`方法
2023-08-11

android控件开发的方法是什么

Android控件开发的方法主要有以下几种:1. 基于XML布局文件进行控件的开发:可以使用XML布局文件来定义控件的外观和布局,然后在Java代码中通过findViewById()方法获取到控件对象,并进行相关操作。2. 自定义控件:可以
2023-09-14

qt信号与槽机制的原理是什么

Qt的信号与槽(Signals and Slots)机制是Qt的一个重要特性,用于处理对象之间的事件通信。它的原理基于C++的特性和Qt的元对象系统。在使用信号与槽机制前,首先需要定义一个信号和一个槽。信号是一个声明,它是一个在特定事件发生
2023-09-27

android组件化开发的方法是什么

Android组件化开发的方法有以下几种:1. 模块化开发:将整个项目拆分为多个独立的模块,每个模块独立开发、编译和运行。每个模块可以是一个功能模块、业务模块或者公共模块,模块之间通过依赖关系进行交互。通过模块化开发可以提高代码的复用性和可
2023-10-10

Android开发导出apk的方法是什么

Android开发导出apk的方法有两种:1. 使用Android Studio:在Android Studio中,选择菜单中的“Build” -> “Build Bundle(s)/APK(s)” -> “Build APK(s)”即可导
2023-10-12

Java程序的开发与运行原理是什么

这篇文章主要介绍“Java程序的开发与运行原理是什么”,在日常操作中,相信很多人在Java程序的开发与运行原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java程序的开发与运行原理是什么”的疑惑有所
2023-06-16

android开机自启动的方法是什么

Android开机自启动的方法有以下几种:1. 使用BroadcastReceiver:创建一个继承自BroadcastReceiver的类,在类中重写onReceive方法,在onReceive方法中处理开机自启动的逻辑,并在Androi
2023-08-12

jspXCMS开发环境下部署的方法和原理是什么

这篇“jspXCMS开发环境下部署的方法和原理是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“jspXCMS开发环境下部
2023-06-26

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录