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

可持续 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-permission
    android: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 7
    targetSdkVersion 23
    versionCode 1
    versionName “1.0}
}

使用 WebP 图片

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

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

参考

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Calvin880828

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值