Активность не начинается, пока не включится экран

Моя служба запускает действие следующим образом:

Intent intent = new Intent(context, CallMonitor.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

это происходит в CallMonitor.onCreate():

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);

На большинстве устройств активность (вызванная из службы) будит устройство, включает экран и отображается.

Но, например, на Galaxy Tab 4 действие вызывается только в том случае, если экран уже включен. Если экран выключен и сервис вызывает активность, она отображается с задержкой — будет отображаться сразу после включения экрана.

В действии также есть голосовой вывод. Когда Galaxy S4 выключен, он не воспроизводится, а сразу после повторного включения экрана.

Какие-либо предложения? Я не хочу использовать WakeLock!


person almisoft    schedule 02.02.2018    source источник


Ответы (1)


Похоже, это ограничение устройства, и я не знаю, как можно обойти это без использования WakeLock. У нас есть действительно старый фрагмент кода, который вы можете модифицировать под свои нужды, и который почти всегда работал у нас:

public static void bringToFront() {
    try {
        PowerManager pm = (PowerManager) MainActivity.getAppContext().getSystemService(Context.POWER_SERVICE);
        PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.ON_AFTER_RELEASE, "ALARM");
        wl.acquire();
        KeyguardManager keyguardManager = (KeyguardManager) MainActivity.getAppContext().getSystemService(Activity.KEYGUARD_SERVICE);
        KeyguardManager.KeyguardLock lock = keyguardManager.newKeyguardLock(KEYGUARD_SERVICE);
        lock.disableKeyguard();
        if (MainActivity.getAppActivity() != null) {
            MainActivity.getAppActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
        }
    } catch(Exception e){
        e.printStackTrace();
        Log.w(TAG, "bringToFront Err: "+e.toString());
    }
}
person JensV    schedule 02.02.2018