直到屏幕打开后,活动才会开始

时间:2018-02-02 11:17:44

标签: android screen wakelock keyguard

我的服务启动了这样的活动:

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!

1 个答案:

答案 0 :(得分:0)

看起来这是一个设备限制,我不知道如何在不使用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());
    }
}