可持续 Android 应用的最佳编码实践

news/2024/4/28 0:59:26/文章来源:https://blog.csdn.net/u011897062/article/details/130006384

可持续 Android 应用的最佳编码实践

在这里插入图片描述

可持续 Android 应用的最佳实践概述

一些Android最佳实践的建议

使用约束Workers

您可以使用 WorkRequest 类请求在应用程序中执行的任务:

WorkRequest myWorkRequest = new OneTimeWorkRequest.Builder(MyWork.class).build();
WorkManager.getInstance(myContext).enqueue(myWorkRequest);

但是我们也可以在这些 WorkRequest 上使用 Constraints,例如,指示该任务只应在设备充电(插入)时运行:

Constraints constraints = new Constraints.Builder().setRequiresCharging(true).build();
WorkRequest myWorkRequest = new OneTimeWorkRequest.Builder(MyWork.class).setConstraints(constraints).build();
WorkManager.getInstance(myContext).enqueue(myWorkRequest);

它允许在有意义的时候延迟计算,从而节省能量。

融合定位 API

Android API 提供获取设备 GPS 坐标的服务,并监听其值的定期更新:

import android.location.LocationManager;LocationManager locationManager = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);

但是有一个由谷歌维护的 API 的替代方案,声称消耗更少:

import com.google.android.gms.location.FusedLocationProviderClient;FusedLocationProviderClient fusedClient = LocationServices.getFusedLocationProviderClient(this);
fusedClient.requestLocationUpdates(mRequest, mCallback, null);

不要对帧率太贪心

帧速率对能耗有直接影响。60 fps 是默认值,所以如果不相关,请注意不要设置更高的值:

Surface s = mySurfaceView.getHolder().getSurface();
s.setFrameRate(90f, FRAME_RATE_COMPATIBILITY_FIXED_SOURCE);

如果您可以接受,请将此值减小到 30,例如:

s.setFrameRate(30f, FRAME_RATE_COMPATIBILITY_FIXED_SOURCE);

忽略电池优化

Android 具有优化电池消耗的原生智能机制。所以除非你有充分的理由,否则我们不应该请求忽略它们的许可:

<uses-permissionandroid:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>

不要让屏幕一直处于“开启”状态

默认情况下,您的操作系统会在用户闲置设备时关闭屏幕。您可以调整您的 Android 应用程序以始终保持屏幕打开,但这会对电池产生巨大影响,因此如果您的上下文允许,您应该避免它:

<RelativeLayout xmlns:android="<http://schemas.android.com/apk/res/android>"....android:keepScreenOn="true"> <!-- avoid this -->...
</RelativeLayout>

避免传感器泄漏

您可以注册到传感器以收听其值(例如加速度计):

sensorManager = (SensorManager) getActivity().getSystemService(Context.SENSOR_SERVICE);
accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
sensorManager.registerListener(this, accelerometer, 20000);

重要的是不要忘记注销;否则,您的应用即使在后台也会继续接收和计算数据。因此,为避免这种情况,您需要注销

sensorManager.unregisterListener(this);

传感器合并

和前面的例子类似,调用registerListener方法时:

sensorManager = (SensorManager) getActivity().getSystemService(Context.SENSOR_SERVICE);
accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
sensorManager.registerListener(this, accelerometer, 20000);

您可以选择使用名为maxReportLatencyUs的第 4 个参数来重载调用:

sensorManager.registerListener(this, accelerometer, 20000, 190000);

文档将此描述为“事件在报告给应用程序之前可以延迟的最长时间(以微秒为单位)。较大的值可以降低与传感器相关的功耗”。值为 0 表示调用上面的第一个方法。将事件视为单个批次而不是多个小批次。

避免广泛的版本范围

为避免APK包体积过大,即嵌入过多不必要的组件,您应尽量限制 SDK 版本的版本范围:

android {defaultConfig {applicationId “com.example.app"minSdkVersion 7targetSdkVersion 23versionCode 1versionName “1.0}
}

使用 WebP 图片

这不是特定于 Android 的,而是涉及几乎所有嵌入图像的移动应用程序。WebP 是一种经过优化的格式,WebP的每张图片都应该优先使用。

…/res/
…/res/drawable/background.png => prefer background.webplogo.jpeg => prefer logo.webp

参考

https://medium.com/promyze/green-it-best-coding-practices-for-sustainable-android-apps-680cc4730383

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

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

相关文章

深度学习-第R3周——天气预测

深度学习-第R3周——天气预测深度学习-第R3周——天气预测一、前言二、我的环境三、导入数据集三、探索式数据分析1、数据相关性探索2、是否会下雨1、预测明天是否会下雨2、预测今天是否会下雨3、探索两个分类变量之间的关系。4、 归一化处理&#xff0c;以生成百分比形式的数据…

【网络安全必看】

web 渗透这个东西学起来如果没有头绪和路线的话&#xff0c;是非常烧脑的。 理清 web 渗透学习思路&#xff0c;把自己的学习方案和需要学习的点全部整理&#xff0c;你会发现突然渗透思路就有点眉目了。 程序员之间流行一个词&#xff0c;叫 35 岁危机&#xff0c;&#xff…

[ 常用工具篇 ] 渗透神器 whatweb 安装使用详解

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

[学习笔记] 1. 机器学习前置知识

视频链接所有数据集下载地址&#xff1a;数据集 1. 机器学习前置知识 目录1. 机器学习概述1.1 机器学习算法分类1.1.1 监督学习1.1.2 无监督学习1.1.3 半监督学习1.1.4 强化学习1.2 模型评估1.2.1 分类模型评估1.2.2 回归模型评估1.3 拟合1.3.1 欠拟合1.3.2 过拟合2. Matplotli…

请求分页管理方式(中断 缺页中断)

目录 关于中断&#xff08;不管是内中断还是外中断&#xff09;&#xff08;先补充&#xff09; 页表机制 缺页中断机构&#xff08;缺页中断&#xff09; 关于内中断外中断 ​编辑 地址变换机构 关于中断&#xff08;不管是内中断还是外中断&#xff09;&#xff08;先补…

【C++】静态类成员

类中静态成员的特点是&#xff1a;无论创建了多少对象&#xff0c;程序都只创建一个静态类变量副本。也就是说&#xff0c;类的所有对象共享同一个静态成员&#xff0c;就像家中的电话可被全体家庭使用一样。 但是注意&#xff0c;不能在类声明中初始化静态成员变量&#xff0c…

牛客网算法八股刷题系列(六)正则化与偏差、方差的联系

牛客网算法八股刷题系列——正则化与偏差、方差的联系题目描述正确答案&#xff1a;C\mathcal CC题目解析场景构建λ⇔Bias\lambda \Leftrightarrow \text{Bias}λ⇔Bias拉格朗日乘数法角度权重衰减角度(包含λ⇔Variance\lambda \Leftrightarrow \text{Variance}λ⇔Variance解…

基于html+css的内容旋转

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

一起学 WebGL:绘制一个点

大家好&#xff0c;我是前端西瓜哥。 本文讲解如何用 WebGL 绘制一个点。 WebGL WebGL 是浏览器支持的一种绘制图形的 API&#xff0c;是一个标准。我们可以通过 Canvas 元素 在网页的特定区域绘制 2D 和 3D 图形。 相比 Canvas 2D&#xff0c;WebGL 利用了 GPU 的计算能力…

真给科技企业丢脸,在美国亚马逊做普通工人,你会吃不饱肚子

亚马逊公司&#xff08;Amazon&#xff09;&#xff0c;成立于1995年&#xff0c;是全球最大的一家科技创新型电子商务公司&#xff0c;是全球电子商务的最老资格。自从2015年底&#xff0c;亚马逊在俄亥俄州哥伦布市运营大型仓库&#xff0c;如今的亚马逊已经成为俄亥俄州最大…

基于C#语言专业开发的一套:医院手麻系统源码

手术室麻醉信息管理系统源码&#xff0c;手麻系统源码&#xff0c;C#手术麻醉系统源码 相关技术&#xff1a;C#语言前端框架&#xff1a;Winform后端框架&#xff1a;WCF数据库&#xff1a;sqlserver开发工具:VS2019 文末获取联系&#xff01; 系统概述&#xff1a; 手术麻醉…

全国青少年信息素养大赛2023年python·必做题模拟一卷

全国青少年电子信息智能创新大赛 python必做题模拟一卷 一、单选题 1. 以下哪种输入结果不可能得到以下反馈&#xff1a; 重要的事情说三遍&#xff1a;安全第一&#xff01;安全第一&#xff01;安全第一&#xff01;&#xff08; &#xff09; A、print("重要事情说…

Redis 如何配置读写分离架构(主从复制)?

文章目录Redis 如何配置读写分离架构&#xff08;主从复制&#xff09;&#xff1f;什么是 Redis 主从复制&#xff1f;如何配置主从复制架构&#xff1f;配置环境安装 Redis 步骤通过命令行配置从节点通过配置文件配置从节点redis 主从复制优点redis 主从复制缺点Redis 如何配…

Git仓库集成到VScode

前提是一种安装了Git&#xff0c;这里就不再介绍安装过程&#xff0c;进入Git官网进行下载安装即可。 这里用Gitee作为远程仓库演示&#xff0c;首先在gitee上新建仓库 新建完毕&#xff0c;生成了HTTPS地址&#xff0c;复制该远程仓库地址。 来到vscode&#xff0c;在没有仓库…

五.microchip 代理贝能的sam d51(LQFP100PIN)与LAN9253 电机控制开发板使用总结(3)

五.microchip 代理贝能的sam d51(LQFP100PIN)与LAN9253 电机控制开发板使用总结&#xff08;3&#xff09; 3.4 板子相关外设配置 3.4.1 板子MCU硬件 的LAN9253连接接口 pin numpin idcus_namefuncmodedirlatchpush uppush downdir str1PA00GPIO_PA0_D0GPIOINYNORMAL2PA01GP…

leetcode:只出现一次的数字 Ⅲ(详解)

前言&#xff1a;内容包括&#xff1a;题目&#xff0c;代码实现&#xff0c;大致思路&#xff0c;代码解读 题目&#xff1a; 给你一个整数数组 nums&#xff0c;其中恰好有两个元素只出现一次&#xff0c;其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任…

DOS批处理文件---内嵌参数变量扩充功能

1 内嵌参数变量 1.1 介绍 内嵌参数变量指&#xff1a;%i&#xff0c;其中i为大于等于0的整数。如%0&#xff0c; %1&#xff0c; %2&#xff0c;... 1.2 作用 可以客制化功能。 1.3 案例 批处理文件&#xff1a;main_Param.bat echo off && setlocal ENABLEDELA…

Solidworks学习一

目录页面介绍&#xff1a;视图操作&#xff1a;实例圆柱&#xff1a;直线的绘制&#xff1a;草图的保存和不保存&#xff1a;绘制工具&#xff1a;切线弧&#xff1a;转换实体引用&#xff1a;交叉曲线&#xff1a;等距实体&#xff1a;移动复制&#xff1a;约束&#xff1a;约…

MyBatisPlus-DQL编程控制

MyBatisPlus-DQL编程控制3&#xff0c;DQL编程控制3.1 条件查询3.1.1 条件查询的类3.1.2 环境构建3.1.3 构建条件查询3.1.4 多条件构建3.1.5 null判定3.2 查询投影3.2.1 查询指定字段3.2.2 聚合查询3.2.3 分组查询3.3 查询条件3.3.1 等值查询3.3.2 范围查询3.3.3 模糊查询3.3.4…

一起学 WebGL:动态绘制点

大家好&#xff0c;我是前端西瓜哥。上一篇文章讲解了如何绘制一个点。但这个点的信息是写死在渲染器源码中的&#xff0c;也就是硬编码。 这是系列文章&#xff0c;如果你是初学者&#xff0c;你需要看上一篇文章才好理解这节课的内容。 《一起学 WebGL&#xff1a;绘制一个点…