Je développe une application Android dans laquelle je souhaite afficher la notification Push.
Il s'est bien affiché dans la plupart des appareils, sauf les téléphones Xiaomi (j'utilise Redmi Note 4). Le problème que j'ai trouvé est, c'est à cause de l'option Autostart fournie par Xiomi qui sera désactivée par défaut et l'utilisateur doit l'activer manuellement.
Mais je me demande que certaines des applications Android Android que je pourrais voir activer cette option sans aucune interaction utilisateur Ex: WhatsApp. Si j'essaie de réinstaller WhatsApp et de voir l'option Autostart, elle est activée!
Je ne peux pas convaincre notre client en disant que c'est la caractéristique d'appareils similaires à Xiomi car il souligne certaines applications qui fonctionnent bien comme l'exemple que j'ai mentionné ci-dessus.
Cette question a été posée par d'autres personnes
Ajouter mon application à la liste des applications AutoStart dans Android par programme
Mais je ne pouvais pas voir de réponses pour eux et publier ici avec l'espoir que quelqu'un aura une réponse à cela.
La fonction de démarrage automatique sera activée automatiquement lorsque vous téléchargerez l'application depuis Playstore si xiaomi OS le souhaite en tant qu'applications comme Amazon, google IO etc ne sont pas non plus autorisés à démarrer automatiquement, dans ce cas, vous devez allez dans Autorisations de sécurité -> démarrage automatique -> puis activez le démarrage automatique à partir de là.Vous ne pouvez pas faire le démarrage automatique de l'application par code tout ce que vous pouvez faire est que vous pouvez afficher une boîte de dialogue pour activer le démarrage automatique et amener l'utilisateur à l'activité de démarrage automatique, mais ce n'est pas un bonne option car vous ne pouvez pas vérifier si le démarrage automatique est activé ou non.Ceci est fait par Mi dans MIUI8 pour économiser la batterie.Ce problème a gaspillé mes 2 jours XD
Vous pouvez vous référer à cet article .
Pour les appareils xiaomi, oppo, vivo, etc. pour activer l'option de démarrage automatique par programme
String manufacturer = Android.os.Build.MANUFACTURER;
try {
Intent intent = new Intent();
if ("xiaomi".equalsIgnoreCase(manufacturer)) {
intent.setComponent(new ComponentName("com.miui.securitycenter", "com.miui.permcenter.autostart.AutoStartManagementActivity"));
} else if ("oppo".equalsIgnoreCase(manufacturer)) {
intent.setComponent(new ComponentName("com.coloros.safecenter", "com.coloros.safecenter.permission.startup.StartupAppListActivity"));
} else if ("vivo".equalsIgnoreCase(manufacturer)) {
intent.setComponent(new ComponentName("com.vivo.permissionmanager", "com.vivo.permissionmanager.activity.BgStartUpManagerActivity"));
} else if ("Letv".equalsIgnoreCase(manufacturer)) {
intent.setComponent(new ComponentName("com.letv.Android.letvsafe", "com.letv.Android.letvsafe.AutobootManageActivity"));
} else if ("Honor".equalsIgnoreCase(manufacturer)) {
intent.setComponent(new ComponentName("com.huawei.systemmanager", "com.huawei.systemmanager.optimize.process.ProtectActivity"));
}
List<ResolveInfo> list = getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
if (list.size() > 0) {
startActivity(intent);
}
} catch (Exception e) {
e.printStackTrace();
}
Pour autant que je sache, WhatsApp est sur la liste blanche sur le démarrage automatique de l'appareil Xiaomi. Vous ne pouvez rien y faire. Bien sûr, votre application sera ajoutée à la liste blanche par Xiaomi si elle a finalement remporté autant de popularité sur WhatsApp. Jusqu'à ce que cela se produise, vous ne pouvez demander à l'utilisateur de l'activer manuellement qu'en affichant la fonction Démarrage automatique avec quelque chose comme ceci:
try {
Intent intent = new Intent();
if ("xiaomi".equalsIgnoreCase(Android.os.Build.MANUFACTURER)) {
intent.setComponent(new ComponentName("com.miui.securitycenter",
"com.miui.permcenter.autostart.AutoStartManagementActivity"));
}
// context is your Context
List<ResolveInfo> list = context.getPackageManager()
.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
if (list.size() > 0) {
context.startActivity(intent);
}
} catch (Exception e) {
Log.d("PERMISSION", e.toString());
}
Veuillez noter que je n'ai pas testé le code de l'appareil Xiaomi actuel.
Peu d'applications populaires s'exécutent en arrière-plan sans être tuées pendant le cycle de nettoyage de la mémoire (de nombreux fabricants OEM populaires personnalisent la pile ROM pour l'optimisation de la batterie/mémoire), car ils sont "sur liste blanche" par ces fabricants. Pour votre application, vous pouvez la mettre en liste blanche manuellement (via les "paramètres" correspondants pour les appareils) ou de manière pragmatique en redirigeant les utilisateurs vers la page des paramètres correspondants pour mettre la liste en liste blanche. Pragmatiquement, vous pouvez faire comme ci-dessous:
Ajoutez les autorisations ci-dessous dans le fichier manifeste de l'application: `
<uses-permission Android:name="oppo.permission.OPPO_COMPONENT_SAFE"/>
<uses-permission Android:name="com.huawei.permission.external_app_settings.USE_COMPONENT"/>`
Redirigez votre compte vers le paramètre de démarrage automatique:
if (Build.BRAND.equalsIgnoreCase("xiaomi")) {
Intent intent = new Intent();
intent.setComponent(new
ComponentName("com.miui.securitycenter",
"com.miui.permcenter.autostart.AutoStartManagementActivity"));
startActivity(intent);
} else if (Build.MANUFACTURER.equalsIgnoreCase("oppo")) {
try {
Intent intent = new Intent();
intent.setClassName("com.coloros.safecenter",
"com.coloros.safecenter.permission.startup.StartupAppListActivity");
startActivity(intent);
} catch (Exception e) {
try {
Intent intent = new Intent();
intent.setClassName("com.oppo.safe",
"com.oppo.safe.permission.startup.StartupAppListActivity");
startActivity(intent);
} catch (Exception ex) {
try {
Intent intent = new Intent();
intent.setClassName("com.coloros.safecenter",
"com.coloros.safecenter.startupapp.StartupAppListActivity");
startActivity(intent);
} catch (Exception exx) {
}
}
}
}
Référence de démarrage automatique pour les autres OEM
J'ai testé cette méthode et cela a fonctionné mais la fiabilité est toujours une question car le système prend du temps (environ 2 minutes sur les appareils PoccoF9 et Xiomi) pour redémarrer le service tué.
Mais en tant qu'utilisateur, nous pouvons empêcher les services d'arrière-plan de l'application de se tuer tous ensemble comme ci-dessous:
Mais, de cette façon, le statut de verrouillage de l'application sera réinitialisé au redémarrage sur la plupart des appareils.
EDIT: Après avoir observé le comportement (sur RedmiS3 de Xiomi, Android V6.0) du service Foreground voici l'analyse :
Même après avoir activé le "démarrage automatique" par programme (via l'intervention de l'utilisateur, comme expliqué ci-dessus), le service ne redémarre pas toujours (le service ne redémarre que quelques fois, mais la plupart du temps, il ne le fait pas).
De plus, si je recherche "Démarrage automatique" dans les paramètres de l'appareil, je ne peux pas voir mon application dans la liste Démarrage automatique. Il semble que la méthode ci-dessus ne fournisse que l'autorisation de démarrage automatique mais ne l'active pas, PAS SÛR!. Et, si j'ajoute mon application dans la liste "AutoStart" via les paramètres de l'appareil, mon service est redémarré (bien que cela prenne un certain temps).
Le redémarrage du service tué dans le rappel onTaskRemoved () pourrait être une autre option, mais ce rappel est appelé de manière surprenante lorsque le service est tué. Ce rappel n'est exécuté que lorsque l'application est correctement fermée par une pression sur la touche Retour. Si nous minimisons l'application (état Pause), ce rappel n'est jamais appelé lors de l'arrêt du service. (À la recherche de la raison)
Récemment, j'ai trouvé un autre moyen, le service tué pourrait être redémarré via l'événement de notification GCM. Je doute que la météo du GCM fonctionne lorsque l'application est tuée sur les appareils ou non (je dois vérifier cela et vérifier le comportement). Mais celui-ci est sûr " Ces OEM ont fait de la vie du programmeur un enfer! ).