MIUI 10 не позволяет сервису начать работу - Xiaomi Redmi Note

9

Мое приложение имеет сервис и активность. Из сервиса активность вызывается с помощью следующего кода:

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

даже без флагов, как правило, окно активности отображается с правильной компоновкой. Однако на Xiaomi Redmi Note 4 с Android 7 макет активности не отображается. Я вижу только следующую строку в logcat:

I / временная шкала: временная шкала: Activity_launch_request time: 281438674 намерение: намерение {flg = 0x30000000 cmp = com.test.app / .MainActivity}

Я полагаю, что это не проблема Android 7 (API 24), потому что на другом устройстве с Android 7 служба может успешно запустить действие. Я думаю, MIUI препятствует запуску активности из сервиса.

Я попытался изменить способ определения активности в манифесте. Я также попробовал с несколькими разными флагами. Все мои тесты провалились. Я не смог начать работу. Хуже всего то, что в журналах нет ошибок / исключений.

Любые идеи по этому поводу, пожалуйста?

илкер актуна
источник
Та же проблема на MIUI 11.
AlexS

Ответы:

12

На экране «Информация о приложении» в приложении «Системные настройки»> «Другие разрешения»> «Отображать всплывающие окна при работе в фоновом режиме».

Это, кажется, введено в MIUI 11.

Изменить: вот кусок кода, который я использую. Я добавляю это в список разрешений в 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);
}

ОБНОВЛЕНИЕ: чтобы проверить, предоставлено ли это разрешение, вы можете использовать уже работающую службу и запустить фиктивную прозрачную операцию, а при onCreateобратном вызове LocalBroadcastManagerили аналогичном, и вы будете знать, что оно предоставлено. Это уродливое решение, но для некоторых оно может быть полезным.

Алекс Ньюман
источник
благодарю вас. это действительно проблема. Есть ли способ запросить это разрешение в приложении? или добавить это программно?
Илкер Актуна
Ни о чем я не знаю. Я перенаправляю на экран информации о приложении и говорю им, чтобы он включался, если они на MIUI ..
Алекс Ньюман
но для этого нужно запустить приложение. как ты делаешь это ? через уведомления?
Илкер Актуна
Я делаю это, когда запрашиваю другое необходимое разрешение при первой настройке приложения. Так что из основного приложения, а не из службы.
Алекс Ньюман
1
Действительно полезная информация для MIUI, так как просто дает разрешение начать работу с Фонового сервиса без изменения какого-либо кода.
Паначе