Pour éviter de décharger la batterie, un appareil Android inactif tombe rapidement endormi(e). Cependant, il peut arriver qu'une application doive réactiver l'écran. ou le CPU et le garder activé pour terminer un travail.
L'approche à adopter dépend des besoins de votre application. Toutefois, en règle générale, est d'adopter l'approche la plus légère possible pour minimiser l'impact de votre application sur les ressources système. Les sections suivantes décrire comment gérer les cas où le comportement de sommeil par défaut de l'appareil est incompatible avec les exigences de votre application.
Alternatives à l'utilisation des wakelocks
Avant d'ajouter la prise en charge des wakelocks à votre application, déterminez si son utilisation sont compatibles avec l'une des solutions alternatives suivantes:
Si votre application effectue des téléchargements HTTP de longue durée, envisagez d'utiliser
DownloadManager
Si votre application synchronise des données à partir d'un serveur externe, envisagez de créer un adaptateur de synchronisation.
Si votre application repose sur des services d'arrière-plan, envisagez d'utiliser JobScheduler ou Firebase Cloud Messaging pour déclencher ces services à des intervalles spécifiques.
Si vous devez maintenir l'application associée en cours d'exécution chaque fois qu'un appareil associé à portée, utilisez le Gestionnaire d'appareils Companion.
Gardez l'écran allumé
Certaines applications, telles que des jeux ou des applications de films, doivent laisser l'écran allumé. La
Le meilleur moyen d'y parvenir est d'utiliser
FLAG_KEEP_SCREEN_ON
dans votre activité (et uniquement dans une activité, jamais dans un service ou une autre application) ;
). Exemple :
Kotlin
class MainActivity : Activity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) } }
Java
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); } }
L'avantage de cette approche est que, contrairement aux wakelocks (décrits dans la section Conserver les (CPU activé)), aucune autorisation spéciale n'est requise. De plus, la plate-forme gère correctement l'utilisateur qui passe d'une application à l'autre, sans que celle-ci n'ait besoin de s'inquiéter de libérer les ressources inutilisées.
Vous pouvez aussi implémenter cela dans le fichier XML de mise en page de votre application, en utilisant
Attribut android:keepScreenOn
:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:keepScreenOn="true"> ... </RelativeLayout>
L'utilisation de android:keepScreenOn="true"
équivaut à utiliser
FLAG_KEEP_SCREEN_ON
Vous pouvez utiliser la méthode la plus adaptée à votre application. L’avantage de définir
l'indicateur programmatique dans votre activité est qu'il vous permet
en effaçant l'indicateur par programmation
et en autorisant ainsi l'écran à tourner
désactivée.
Mode Veille pour la télévision
À la télévision,
FLAG_KEEP_SCREEN_ON
doit être utilisé pour éviter
que l'appareil entre
Mode Veille
pendant la lecture vidéo en cours. Lorsque FLAG_KEEP_SCREEN_ON
n'est pas défini
par l'activité au premier plan, l'appareil passe automatiquement en mode Veille
après une période d'inactivité.
Laisser le processeur allumé
Si vous devez maintenir le processeur en cours d'exécution afin d'effectuer un travail avant que le
l'appareil se met en veille, vous pouvez
Fonctionnalité de service système PowerManager
appelés wakelocks. Les wakelocks permettent à votre application de contrôler l'état de l'alimentation
de l'appareil hôte.
La création et le maintien de wakelocks peuvent avoir un impact considérable sur l'état
de la batterie. Vous ne devez donc utiliser les wakelocks qu'en cas d'absolue nécessité.
et maintenez-les le plus rapidement possible. Par exemple, vous ne devriez jamais avoir
utiliser un wakelock dans une activité. Comme décrit ci-dessus, si vous souhaitez conserver
écran activé dans votre activité, utilisez
FLAG_KEEP_SCREEN_ON
Un cas légitime d'utilisation d'un wakelock pourrait être un service d'arrière-plan qui doit utiliser un wakelock pour que le CPU reste en cours d’exécution pour faire son travail lorsque l’écran est désactivée. Là encore, cette pratique doit être minimisée en raison de son impact de la batterie.
Pour utiliser un wakelock, vous devez d'abord ajouter le
Autorisation WAKE_LOCK
à
le fichier manifeste de votre application:
<uses-permission android:name="android.permission.WAKE_LOCK" />
Si votre application inclut un broadcast receiver qui utilise un service pour effectuer un travail, Voici comment définir un wakelock directement:
Kotlin
val wakeLock: PowerManager.WakeLock = (getSystemService(Context.POWER_SERVICE) as PowerManager).run { newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyApp::MyWakelockTag").apply { acquire() } }
Java
PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE); WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyApp::MyWakelockTag"); wakeLock.acquire();
Pour déverrouiller le wakelock, appelez
wakelock.release()
Votre revendication auprès du processeur est alors levée. Il est important de débloquer un wakelock
dès que votre application a fini de l'utiliser pour éviter de vider la batterie.