一些Android最佳实践的建议
您可以使用 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);
它允许在有意义的时候延迟计算,从而节省能量。
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=""
....
android:keepScreenOn="true">
...
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”
}
}
这不是特定于 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