Optimizing resource usage and preventing unnecessary battery drain are critical considerations in Android development. Failing to release sensor resources when they are no longer needed can lead to prolonged device activity, negatively impacting battery life. Common Android sensors, such as cameras, GPS, and microphones, provide a method to release resources after they are not in use anymore.
This rule identifies situations where a sensor is not released after being utilized, helping developers maintain efficient and battery-friendly applications.
release() method:
android.os.PowerManager.WakeLock android.net.wifi.WifiManager$MulticastLock android.hardware.Camera android.media.MediaPlayer android.media.MediaRecorder android.media.SoundPool android.media.audiofx.Visualizer android.hardware.display.VirtualDisplay close() method
android.hardware.camera2.CameraDevice removeUpdates() method:
android.location.LocationManager unregisterListener() method:
android.hardware.SensorManager Ensure that resources are released when they are no longer needed. This can be done by calling the appropriate release method, such as
release(), removeUpdates(), unregisterListener(), or stop().
android.os.PowerManager.WakeLock
public void method() {
PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "My Wake Lock");
wakeLock.acquire(); // Noncompliant
// do some work...
}
public void method() {
PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "My Wake Lock");
wakeLock.acquire(); // Compliant
// do some work...
wakeLock.release();
}
android.media.MediaPlayer
public void method() {
MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.sound_file_1);
mediaPlayer.start(); // Noncompliant
// do some work...
}
public void onCreate() {
MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.sound_file_1);
mediaPlayer.start(); // Compliant
// do some work...
wakeLock.release();
}
android.hardware.SensorManager
public void method() {
SensorManager sensorManager = getSystemService(SENSOR_SERVICE);
Sensor accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
sensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL); // Noncompliant
// do some work...
}
public void method() {
SensorManager sensorManager = getSystemService(SENSOR_SERVICE);
Sensor accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
sensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL); // Compliant
// do some work...
sensorManager.unregisterListener(this);
}