Appwidget开发基本介绍

本篇主要对appwidget开发进行简单介绍,为后续漏洞挖掘相关做前置铺垫

appwidget简介

官方解释如下:

  • 应用微件是可以嵌入其他应用(如主屏幕)并接收定期更新的微型应用视图。这些视图称为界面中的微件,您可以使用应用微件提供程序发布微件。能够容纳其他应用微件的应用组件称为应用微件托管应用。下面的屏幕截图显示了音乐应用微件。

实际也就是桌面的小组件,现在的主流app基本都会搞这个东西,如下
在这里插入图片描述

appwidget开发流程

androidmanifest.xml声明receiver
定义appwidget的元数据【基本特性样式】
书写appwidget的layout布局文件
实现extends AppWidgetProvider的widget

1.androidmanifest声明

        <receiverandroid:name=".NewAppWidget"android:exported="false"><intent-filter><action android:name="android.appwidget.action.APPWIDGET_UPDATE" /></intent-filter><meta-dataandroid:name="android.appwidget.provider"android:resource="@xml/new_app_widget_info" /></receiver>

2.AppWidgetProviderInfo 元数据

demo

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"android:description="@string/app_widget_description"android:initialKeyguardLayout="@layout/new_app_widget"android:initialLayout="@layout/new_app_widget"android:minWidth="40dp"android:minHeight="40dp"android:previewImage="@drawable/example_appwidget_preview"android:previewLayout="@layout/new_app_widget"android:resizeMode="horizontal|vertical"android:targetCellWidth="1"android:targetCellHeight="1"android:updatePeriodMillis="86400000"android:widgetCategory="home_screen" />

一些属性注解

  • initialLayout:指定微件的布局资源
  • minWidth、minHeight:默认情况下微件的最小占用空间
  • minResizeWidth、minResizeHeight:微件的绝对最小大小。意思这个是下限,小于这个标准微件就不能用了
  • minResizeWidth、minResizeHeight:指定微件可以调整到的最小宽高
  • previewImage:微件的预览显示设置
  • resizeMode:设置微件大小调整的规则
    • horizontal
    • vertical
    • none【默认】
  • widgetCategory:微件是否可以显示在主屏幕 (home_screen) 以及锁定屏幕 (keyguard)上【高于android5.0则只有home_screen可用】
  • configure:配置微件的activity【可选】
  • updatePeriodMillis:配合下面的onUpdate回调方法,确定微件的更新频率

3.layout布局文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"style="@style/Widget.Appwidget.AppWidget.Container"android:layout_width="match_parent"android:layout_height="match_parent"android:theme="@style/Theme.Appwidget.AppWidgetContainer"><TextViewandroid:id="@+id/appwidget_text"style="@style/Widget.Appwidget.AppWidget.InnerView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerHorizontal="true"android:layout_centerVertical="true"android:layout_margin="8dp"android:contentDescription="@string/appwidget_text"android:text="@string/appwidget_text"android:textSize="24sp"android:textStyle="bold|italic" />
</RelativeLayout>

支持的布局

  • RemoteViews 对象
    • FrameLayout
    • LinearLayout
    • RelativeLayout
    • GridLayout
    • ViewStub
  • 微件类【不支持下列类的后代】
    • AnalogClock
    • Button
    • Chronometer
    • ImageButton
    • ImageView
    • ProgressBar
    • TextView
    • ViewFlipper
    • ListView
    • GridView
    • StackView
    • AdapterViewFlipper

4.AppWidgetProvider的周期函数

onUpdate()【核心】(默认生成)

  • 按照指定的时间间隔updatePeriodMillis更新微件
  • 还有一个规则
    • 如果声明配置了对应的activity,则在微件被创建时由activity来执行首次更新
    • 如果没有配置对应的activity,则在微件被创建时该方法也会被调用
    @Overridepublic void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {// There may be multiple widgets active, so update all of themfor (int appWidgetId : appWidgetIds) {updateAppWidget(context, appWidgetManager, appWidgetId);}}

onAppWidgetOptionsChanged()

  • 每次调整应用微件大小的时候会被调用
    @Overridepublic void onAppWidgetOptionsChanged(Context context, AppWidgetManager appWidgetManager, int appWidgetId, Bundle newOptions) {super.onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId, newOptions);}

onDeleted(Context, int[])

  • 每次删除应用微件实例的时候会被调用
    @Overridepublic void onDeleted(Context context, int[] appWidgetIds) {super.onDeleted(context, appWidgetIds);}

onEnabled(Context)(默认生成)

  • 首次创建应用微件实例的时候会被调用【数据库创建打开等】
    @Overridepublic void onEnabled(Context context) {// Enter relevant functionality for when the first widget is created}

onDisabled(Context)(默认生成)

  • 删除应用微件的最后一个实例时会被调用【删除数据库等】
    @Overridepublic void onDisabled(Context context) {// Enter relevant functionality for when the last widget is disabled}

onReceive(Context, Intent)

  • 针对每个广播调用该方法
    @Overridepublic void onReceive(Context context, Intent intent) {super.onReceive(context, intent);}

如果想看实际效果的话,可以直接android studio建一个默认的appwidget,然后分析生成的源码

官方链接

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

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

相关文章

MySQL学习day04(一)

DQL学习&#xff08;Data Query Language数据查询语言&#xff09; DQL-语法&#xff1a; select 字段列表 from 表名列表 where 条件列表 group by 分组字段列表 having 分组后条件别表 order by 排序字段列表 limit 分页参数 基本查询条件查询&#xff08;where&#xff09;…

打板选股的方法

打板选股是一种短线投资策略&#xff0c;主要通过观察和分析股票的涨停板情况来进行选股。以下是一些常用的打板选股方法&#xff1a; 首板选股&#xff1a;在市场开盘后&#xff0c;迅速查看所有股票的涨停情况&#xff0c;找出第一个涨停的股票。这种方法需要投资者有较强的市…

软件工程精品课程教学网站的设计与实现

系统功能需求分析 本系统要求采用Browser/Server模式设计开发&#xff0c;可以作为一般高等院校的网络学堂&#xff1b;可以为教师的辅助教学或者网络教学提供一个完善的教学网站&#xff1b;学生可以利用本教学网站来完成一些课程的学习任务。 2.2.1 功能划分 《软件工程》教学…

Sakila数据库和World数据库

Sakila数据库和World数据库 安装MySQL8.2的时候多出两个样例数据库 Sakila数据库和World数据库 Sakila数据库是一个关于DVD租赁的样例数据库&#xff0c;用于展示MySQL的各种功能和特性。Sakila数据库中包含了多个表&#xff0c;包括电影、演员、客户、租赁记录等&#xff0c;可…

二叉树k层的叶子结点个数

文章目录 1 题目2 思路2.1 思路12.2 思路2 3 代码实现3.1 思路13.2 思路23.3 完整的代码案例 1 题目 假设二叉树采用二叉链表存储结构&#xff0c;设计一个算法求其指定的第k层&#xff08;k>1&#xff0c;跟是第1层&#xff09;的叶子结点个数。 2 思路 2.1 思路1 设置…

Oracle(2-6) Backup and Recovery Overview

文章目录 一、基础知识1、Categories of Failures 故障类别2、Causes of Statement Failures 语句失败的原因故障情况Resolutions 决议 3、User Process Failures 用户进程失败故障情况Resolutions 决议 4、Possible User Errors 用户错误类型故障情况Resolutions 决议 5、Inst…

实验6 二叉树操作

0x01 实验目的 掌握二叉树的基本概念&#xff0c;二叉树的存储结构使用链表。 0x02 实验内容 输入一个完全二叉树的层次遍历字符串&#xff0c;创建这个二叉树&#xff0c;输出这个二叉树的前序遍历字符串、中序遍历字符串、后序遍历字符串、结点数目、二叉树高度(上述每一个…

什么是缓存雪崩、缓存击穿、缓存穿透?

一、缓存雪崩 当某一个时刻出现大规模的缓存失效的情况&#xff0c;那么就会导致大量的请求直接打在数据库上面&#xff0c;导致数据库压力巨大&#xff0c;如果在高并发的情况下&#xff0c;可能瞬间就会导致数据库宕机。这时候如果运维马上又重启数据库&#xff0c;马上又会…

计算UDP报文CRC校验的总结

概述 因公司项目需求&#xff0c;遇到需要发送带UDP/IP头数据包的功能&#xff0c;经过多次尝试顺利完成&#xff0c;博文记录以备忘。 环境信息 操作系统 ARM64平台的中标麒麟Kylin V10 工具 tcpdump、wireshark、vscode 原理 请查看大佬的博文 UDP伪包头定义&#x…

关于Maxscript你了解多少?

MAXScript是Autodesk 3dMax的内置脚本语言。MAXScript为3dMax用户提供了以下功能&#xff1a; 编写程序使用的大部分方面的脚本&#xff0c;如建模、动画、材质、渲染等。 通过命令行侦听器窗口以交互方式控制程序。 在自定义实用工具面板卷展栏或无模式窗口中打包脚本&…

MQ - 消息系统

消息系统 1、消息系统的演变 在大型系统中&#xff0c;会需要和很多子系统做交互&#xff0c;也需要消息传递&#xff0c;在诸如此类系统中&#xff0c;你会找到源系统&#xff08;消息发送方&#xff09;和 目的系统&#xff08;消息接收方&#xff09;。为了在这样的消息系…

力扣二叉树--第三十七天

前言 废话不多说&#xff0c;能学到东西&#xff01;功不唐捐&#xff01; 内容 一、二叉搜索树的最小绝对差 530. 二叉搜索树的最小绝对差 给你一个二叉搜索树的根节点 root &#xff0c;返回 树中任意两不同节点值之间的最小差值 。 差值是一个正数&#xff0c;其数值等…

JAVA代码优化:Spring中redis的工具类

基于Spring框架和Redis的缓存工具类。该类提供了一系列方法用于操作Redis缓存&#xff0c;包括设置缓存对象、设置缓存超时时间、获取缓存对象、删除对象、缓存List、Set、Map等操作。通过这些方法可以方便地对Redis进行数据缓存和读取操作。同时&#xff0c;该类使用了Spring的…

【PyTorch】数据集

文章目录 1. 创建数据集1.1. 直接继承Dataset类1.2. 使用TensorDataset类 2. 数据集的划分3. 加载数据集4. 将数据转移到GPU 1. 创建数据集 主要是将数据集读入内存&#xff0c;并用Dataset类封装。 1.1. 直接继承Dataset类 必须要重写__getitem__方法&#xff0c;用于根据索…

【代码随想录算法训练营-第二天】【数组】977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II

977.有序数组的平方 看完思路后一遍AC 思路剖析&#xff1a; 因为提到了时间复杂度为O(n)&#xff0c;自然想到只能遍历一遍又因为只规定了时间复杂度&#xff0c;但是没有规定空间复杂度&#xff0c;所以可以考虑在定义一个数组【这一步没有考虑出来&#xff0c;是看了思路的…

数据结构和算法-哈夫曼树以相关代码实现

文章目录 总览带权路径长度哈夫曼树的定义哈夫曼树的构造法1法2 哈夫曼编码英文字母频次总结实验内容&#xff1a; 哈夫曼树一、上机实验的问题和要求&#xff08;需求分析&#xff09;&#xff1a;二、程序设计的基本思想&#xff0c;原理和算法描述&#xff1a;三、调试和运行…

Matter学习笔记(3)——交互模型

一、简介 1.1 交互方式 交互模型层定义了客户端和服务器设备之间可以执行哪些交互。发起交互的节点称为发起者&#xff08;通常为客户端设备&#xff09;&#xff0c;作为交互的接收者的节点称为目标&#xff08;通常为服务器设备&#xff09;。 节点通过以下方式进行交互&a…

Spring Initial 脚手架国内镜像地址

官方的脚手架下载太慢了&#xff0c;并且现在没有了Java8的选项&#xff0c;所以找到国内的脚手架镜像地址&#xff0c;推荐给大家。 首先说官方的脚手架 官方的脚手架地址为&#xff1a; https://start.spring.io/ 但是可以看到&#xff0c;并没有了Java8的选项。 所以推荐…

3dMax拼图生成工具Puzzle2D使用教程

Puzzle2D for 3dsMax拼图生成工具使用教程 Puzzle2D简介&#xff1a; 2D拼图随机生成器&#xff08;英文&#xff1a;Puzzle2D&#xff09; &#xff0c;是一款由#沐风课堂#用MAXScript脚本语言开发的3dsMax建模小工具&#xff0c;可以随机创建2D可编辑样条线拼图图形。可批量…

【tensorflow学习-选择动作】 学习tensorflow代码调用过程

a actor.choose_action(s) def choose_action(self, s):s s[np.newaxis, :]return self.sess.run(self.action, {self.s: s}) # get probabilities for all actions输入&#xff1a;s 输出&#xff1a;self.sess.run(self.action, {self.s: s}) &#xff1a;a