Android入门第48天-静态BroadCast之接受开机广播

news2024/11/24 5:41:44

简介

我们在之前的BroadCast章节中写了动态BroadCast。但我们提过一笔BroadCast也有静态之分,而静态的BroadCast主要用于监听一些如:开机广播、SIM卡拨出插入等广播。这些广播都为静态注册广播事件。因此我们今天就以一个App监听Android开机广播为例子说明静态广播的使用方法以及如何收听开机广播。

课程目标

  1. 进一步使用Android Stduio如何模拟开机、关机;
  2. 了解AVD的冷启动、快速启动模式;
  3. 静态广播的写法;
  4. 开机广播的处理以及相应的权限-permission;

网上几乎所有的例子都没有讲清这个开机广播,Android的开机广播事件叫“android.intent.action.BOOT_COMPLETED”,为了Receive它你必须在全局的AndroidManifest里加入至少以下两个Permission。

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.WAKE_LOCK"/>

同时,你不能只是简单按下Android Studio模拟器里的这个按钮

开始课程

设计一个静态Receiver

我们设计一个自己的Receiver。

        <receiver
            android:name="org.mk.android.demoreceivebootcomplete.BootCompleteReceiver"
            android:enabled="true"
            android:exported="true"
            android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>

 把这段xml放置于AndroidManifest.xml文件中并且设置相应的uses:permission,全设完后的AndroidManifest.xml文件如下

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.READ_CONTACTS"/>
    <uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>
    <uses-permission android:name="android.permission.WAKE_LOCK"/>
    <application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.DemoReceiveBootComplete"
        tools:targetApi="31">
        <receiver
            android:name="org.mk.android.demoreceivebootcomplete.BootCompleteReceiver"
            android:enabled="true"
            android:exported="true"
            android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>

        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

            <meta-data
                android:name="android.app.lib_name"
                android:value="" />
        </activity>
    </application>

</manifest>

此处和网上到处乱抄甚至机器翻译的混乱的知识库有3处区别:

  • 区别1:我们在uses:permission还要加入android.permission.WAKE_LOCK;
  • 区别2:在receiver中需要指定全包路径而不是.BootCompleteReceiver这样的简写;
  • 区别3:在receiver标签内还需要设android:permission;

下面来书写BootCompleteReceiver类

BootCompleteReceiver类

package org.mk.android.demoreceivebootcomplete;

import android.app.AlertDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.util.Log;
import android.view.WindowManager;

public class BootCompleteReceiver extends BroadcastReceiver {
    public final static String TAG="mytag";
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i(TAG,">>>>>>receive broadcast"+intent.getAction());

    }
}

非常简单,只要监听到了手机开机,它就会打印一条LOG。

activiti_main.xml

Android Studio在new->empty activity时默认的hello world

<?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:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

MainActivity.java

Android Studio在new->empty activity时默认的hello world

package org.mk.android.demoreceivebootcomplete;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

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

如何运行看效果

网上又是一堆错的。

第一步操作:设置AVD高级模式

按照下图:

第二步操作:设置app开机模式为Cold boot模式

然后在下拉出的“Show Advanced Settings”里

把默认启动方式如果是“Quick boot”,那么请把它改成“Cold boot”。因为Quick boot是自动记录上一次手机的运行状态,它不能模拟真机的开关机。这个BOOT_COMPLETE事件就是在真正的关机开机时才发生的,举例来说,我长按着Android手机的顶部按钮10秒后卡断电源这样的关机后再开机才能触发这个BOOT_COMPLETE事件,而且只能触发一次。

 如果只是短按一下手机顶部按钮->黑屏->再短按一下手机顶部按钮->亮屏,这种叫Quick boot,这种是不能触发BOOT_COMPLETE事件的。

因此网上的教程都没有说透这一个点,导致我们的初学者不知道配了多少个uses:permission、试了无数次就是无法触发这个BOOT_COMPLETE事件并浪费了大量的时间只为了触发一下这个事件的效果。

第三步操作:在AVD“已启动”模式下进行强制关机开机

你可以先把应用连同AVD先启动起来如下图,以下这样的状态就是AVD已启动模式。

用鼠标长按“开关”按钮直到出现以下第二个界面

点Restart按钮,出现以下界面

然后你要等一会,大概在15-30秒不等,然后你会得到这样的界面

最后在这个过渡界面再过2-3秒后,Android充分开机后你就可以收到以下这条消息了。

这就是Android真正的“开机收到开机广播”,网上教程统统没说清。每次你要触发这个“开机”事件,你可以每次在AVD已启动情况下点【Restart】按钮,这样才能每次触发和验证你要在开机事件被你安装在手机的APP监听到时才要去做的一些事

请自己动一下手吧。

 

 

 

 

 

 

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

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

相关文章

[附源码]Node.js计算机毕业设计高校科研项目申报管理信息系统Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

三次握手四次挥手和SSL/TLS握手

http(TCP)三次握手四次挥手&#xff1a; 三次握手&#xff1a; SYN&#xff1a;同步位。SYN1 表示进行一个连接请求。 ACK&#xff1a;确认位。ACK1 表示确认有效&#xff0c;ACK0 表示确认无效。 ack&#xff1a;确认号。等于对方发送的序号1。 seq&#xff1a;序号。 握手…

高通Ride软件开发包使用指南(6)

高通Ride软件开发包使用指南&#xff08;6&#xff09;6.2使用SDK设置配置QDrive平台6.3生成SDK配置文件6.4 QDrive功能验证6.2使用SDK设置配置QDrive平台 配置平台 $ cd ~/qride/platform $ ./setup.sh [Platform SOC] 该脚本根据IP地址检测平台&#xff0c;然后推送摄像头Q…

【信息奥赛题解】位数问题(详细题解 C++ 代码)

&#x1f4da; 位数问题 &#x1f680; 题目浏览 【题目名称】位数问题 【题目描述】 在所有的 NNN 位数中&#xff0c;有多少个数中有偶数个数字 333 ? 由于结果可能很大&#xff0c;你只需要输出这个答案对 123451234512345 取余的值。 【输入】 读入一个数 N(N≤1000…

【Redis】数据类型操作一 (key/String/List)

文章目录0、Redis键(key)1、Redis字符串(String)2、Redis列表(List)实操0、Redis键(key)1、Redis字符串(String)2、Redis列表(List)0、Redis键(key) 切换数据库 select dbid select 8 清空数据库 flushdb &#xff08;清空当前库&#xff09; flushall &#xff08;通杀全部库…

python机器学习与深度学习在气象中如何应用??如台风预报数据智能订正、预测风电场的风功率、预测浅水方程模式

Python是功能强大、免费、开源&#xff0c;实现面向对象的编程语言&#xff0c;在数据处理、科学计算、数学建模、数据挖掘和数据可视化方面具备优异的性能&#xff0c;这些优势使得Python在气象、海洋、地理、气候、水文和生态等地学领域的科研和工程项目中得到广泛应用。可以…

年终洞察:日本正兴起一波“反向海淘”

这两天&#xff0c;正在日本备婚的李杨&#xff08;化名&#xff09;收到了“漂洋过海”从Starday跨境电商服务平台买来的喜庆装饰品&#xff0c;“这些烘托传统中国婚礼的独特装饰品在日本是很难买到的”从她打开Starday跨境电商服务平台&#xff0c;选择心仪的装饰品并并下单…

[附源码]Python计算机毕业设计高校线上教学系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

mysql查询基础

查询执行图 查询顺序 explain 参数说明 Id: MySQL QueryOptimizer 选定的执行计划中查询的序列号。表示查询中执行select 子句或操作表的顺序,id 值越大优先级越高,越先被执行。id 相同,执行顺序由上至下 Select_type: 一共有9中类型,只介绍常用的4种: SIMPLE: 简单的 select 查…

前端——给图形绘制阴影

给图形绘制阴影 在HTML5中&#xff0c;使用canvas元素可以给图形添加阴影效果。添加阴影效果时&#xff0c;只需利用图形上下文对象的几个关于阴影绘制的属性就可以了&#xff0c;这几个属性如下。 shadowOffsetX——阴影的横向位移量。 shadowOffsetY——阴影的纵向位移量。…

提面优秀资格上岸浙大MBA经验分享

三百多天的备考&#xff0c;终于等来了一个好的结果。曾经的我也一直在犹豫到底要不要放弃对于浙大的执念&#xff0c;虽然说我的工作是还行&#xff0c;但是我的第一学历只是一个不入流的二本院校&#xff0c;当时咨询的老师说是对于浙大提面来说&#xff0c;我肯定是要吃学历…

MobSDK引进相关问题

1、进入全球领先的数据智能科技平台-MobTech袤博mob官网 首先注册帐号、核验身份、选择开发者平台 2、创建项目的appkey和对应的appSecret 进入开发者模式后&#xff0c;对应以下几个选项模块&#xff08;以短信验证模块为例&#xff09;&#xff0c;点击开始使用 跳转到个人…

[附源码]Nodejs计算机毕业设计基于的宠物领养管理系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

怎么将语音转为文字?不如试试这几个语音转文字软件app

随着时代的发展&#xff0c;现在许多小伙伴会将重要却来不及整理的内容&#xff0c;用录音或是语音的方式记录下来&#xff0c;之后再进行整理。但是在整理的时候&#xff0c;有些人可能会因为需要多听几遍音频才能完成工作而感到痛苦&#xff0c;毕竟这样做&#xff0c;花费的…

Elasticsearch版本升级实践、注意事项

版本关系 从官方文档看可以发现两个大版本升级需要关注到具体的版本&#xff0c;比如想从 5.x 版本升级到 7.x 版本&#xff0c;就必须先升级到 6.8 版本&#xff0c;再从 6.8 升级到 7.x 版本。 检查是否可以升级 1. 版本号确认 2. 通过API检查是否存在过期的用法 # ES 6.xG…

【夯实Kafka知识体系及基本功】「实践操作篇」单机部署实践手册(2.8.0)

来一段舞蹈 前提回顾 下载kafka wget https://archive.apache.org/dist/kafka/0.8.0/kafka_2.8.0-0.8.0.tar.gz或者 curl -O https://archive.apache.org/dist/kafka/0.8.0/kafka_2.8.0-0.8.0.tar.gz解压缩 tar -vxf kafka_2.8.0-0.8.0.tar.gz修改配置 修改conf/server.pro…

IAA品类洞察:扫描品类加快变现,如何抓住增长机遇?

易观分析&#xff1a;工具产品是IAA行业中的经典品类&#xff0c;开发门槛较低、变现模式成熟。从近期的商业化表现来看&#xff0c;我们关注到其中的扫描品类呈现高速增长之势&#xff0c;正释放出更多的发展潜力&#xff1a; ①行业方面&#xff1a;扫描品类的用户规模已超2千…

chatGPT实战之「基于你的数据库,为你智能生成SQL」

chatGPT为你生成SQL的落地效果演示 这几天很很多粉丝进行了深度交流&#xff0c;发现大家对于SQL学习或者编写都遇到过困难&#xff0c;因此勇哥突发奇想是否可以借助chatGPT来帮一下大家呢&#xff1f;于是就开启了chatGPT的落地之旅。从官网了解到chatGPT支持49种场景的&…

【webpack】使用webpack api打包一个最简单的js资源

简单了解一下webpack 本质上&#xff0c;webpack是一个用于现代javascript应用程序的静态模块打包工具。当webpack处理应用程序时&#xff0c;它会在内部从一个或多个入口点构建一个依赖图&#xff0c;然后将项目中所需要的每一个模块组合成一个或多个bundles&#xff0c;它们均…

前端_Vue_5.列表渲染

文章目录一、列表渲染1.1. v-for1.2. v-for 与对象1.3. 在 v-for 里使用范围值1.4. \<template\> 上的 v-for1.5. v-for 与 v-if1.6. 通过key管理状态1.7. 组件上使用 v-for1.8. 数组变化侦测1.8.1. 变更方法1.8.2. 替换一个数组1.9. 展示过滤或排序后的结果一、列表渲染…