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,一经查实,立即删除!

相关文章

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

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

Sakila数据库和World数据库

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

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;输出这个二叉树的前序遍历字符串、中序遍历字符串、后序遍历字符串、结点数目、二叉树高度(上述每一个…

计算UDP报文CRC校验的总结

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

MQ - 消息系统

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

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

文章目录 总览带权路径长度哈夫曼树的定义哈夫曼树的构造法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

解决:UnboundLocalError: local variable ‘js’ referenced before assignment

解决&#xff1a;UnboundLocalError: local variable ‘js’ referenced before assignment 文章目录 解决&#xff1a;UnboundLocalError: local variable js referenced before assignment背景报错问题报错翻译报错位置代码报错原因解决方法今天的分享就到此结束了 背景 在使…

实战案例:chatglm3 基础模型多轮对话微调

chatglm3 发布了&#xff0c;这次还发了base版本的模型&#xff0c;意味着我们可以基于这个base模型去自由地做SFT了。 本项目实现了基于base模型的SFT。 base模型 https://huggingface.co/THUDM/chatglm3-6b-base由于模型较大&#xff0c;建议离线下载后放在代码目录&#…

OSG编程指南:专栏内容介绍及目录

1、专栏介绍 OpenSceneGraph&#xff08;OSG&#xff09;场景图形系统是一个基于工业标准 OpenGL 的软件接口&#xff0c;它让程序员能够更加快速、便捷地创建高性能、跨平台的交互式图形程序。本专栏基于 OSG 3.6.5版本进行源码的编写及扩展&#xff0c;也通用于其他OSG版本的…

OpenTelemetry系列 - 第2篇 Java端接入OpenTelemetry

目录 一、架构说明二、方式1 - 自动化2.1 opentelemetry-javaagent.jar&#xff08;Java8 &#xff09;2.2 使用opentelemetry-javaagent.jar完成自动注入2.3 配置opentelemetry-javaagent.jar2.4 使用注解&#xff08;WithSpan, SpanAttribute&#xff09;2.5.1 代码集成WithS…

【栈和队列(2)】

文章目录 前言队列队列方法队列模拟实现循环队列练习1 队列实现栈 前言 队列和栈是相反的&#xff0c;栈是先进后出&#xff0c;队列是先进先出&#xff0c;相当于排队打饭&#xff0c;排第一的是最先打到饭出去的。 队列 队列&#xff1a;只允许在一端进行插入数据操作&…

20、Resnet 为什么这么重要

&#xff08;本文已加入“计算机视觉入门与调优”专栏&#xff0c;点击专栏查看更多文章信息&#xff09; resnet 这一网络的重要性&#xff0c;上一节大概介绍了一下&#xff0c;可以从以下两个方面来有所体现&#xff1a;第一是 resnet 广泛的作为其他神经网络的 back bone&…

Redis集合对象

一. 编码 集合对象的编码可以是intset或者hashtable。 intset编码的集合对象使用整数集合作为底层实现&#xff0c;集合对象包含的所有元素都保存在整数集合里面。 127.0.0.1:6379> sadd numbers 1 3 5 (integer) 3 127.0.0.1:6379> object encoding numbers "ints…

使用凌鲨进行内网穿透

为了方便在本地进行开发和调试工作&#xff0c;有时候需要安全地连接内网或Kubernetes集群中的服务。 在net proxy server中可以限制访问用户&#xff0c;也可以设置端口转发的密码。 使用 连接端口转发服务 列出可转发端口 可转发端口是服务端设置的&#xff0c;不会暴露真…