web-dev-qa-db-fra.com

MIUI 10 ne laisse pas le service démarrer l'activité - Xiaomi Redmi Note

Mon application a un service et une activité. Depuis le service, l'activité est appelée avec le code suivant:

Intent intent = new Intent(getApplicationContext(), MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

même sans les drapeaux, normalement la fenêtre d'activité est affichée avec sa disposition correcte. Cependant, sur Xiaomi Redmi Note 4 avec Android 7, la disposition des activités n'est pas affichée. Je ne vois que la ligne suivante sur logcat:

I/Chronologie: Chronologie: Activity_launch_request time: 281438674 intention: Intent {flg = 0x30000000 cmp = com.test.app/.MainActivity}

Je pense que ce n'est pas un problème Android 7 (API 24) car sur un autre appareil avec Android 7, le service peut démarrer l'activité avec succès. Je suppose que MIUI empêche le lancement de l'activité du service.

J'ai essayé de changer la façon dont l'activité était définie dans le manifeste. J'ai également essayé avec plusieurs drapeaux différents. Tous mes tests ont échoué. Je n'ai pas réussi à démarrer l'activité. Le pire problème est qu'il n'y a aucune erreur/exception dans les journaux.

Des idées à ce sujet s'il vous plaît?

8
ilker Aktuna

Dans l'écran Informations sur l'application depuis l'application Paramètres système> Autres autorisations> Afficher les fenêtres contextuelles lors de l'exécution en arrière-plan.

Cela semble introduit dans MIUI 11.

Edit: voici un bout de code que j'utilise. J'ajoute cela dans une liste d'autorisations dans un RecyclerView.

Class<?> c = Class.forName("Android.os.SystemProperties");
Method get = c.getMethod("get", String.class);
String miui = (String) get.invoke(c, "ro.miui.ui.version.name");
if (miui != null && miui.contains("11")) {
            PermissionData mPopup = new PermissionData();
            mPopup.text = "Other permissions > Display pop-up while in background";
            mPopup.onClickListener = new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                    Uri uri = Uri.fromParts("package", getPackageName(), null);
                    intent.setData(uri);
                    startActivity(intent);
                }
            };

            mPermissionData.add(mPopup);
}

MISE À JOUR: Pour vérifier si cette autorisation est accordée, vous pouvez utiliser un service déjà en cours d'exécution et lancer une activité transparente factice, et dans le onCreate rappeler sur un LocalBroadcastManager ou similaire et vous saurez que c'est accordé. C'est une solution laide, mais elle peut être utile pour certains.

10
Alex Newman