可持续 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

猜你喜欢

转载自blog.csdn.net/u011897062/article/details/130006384