FLAG_TURN_SCREEN_ON并不总是有效

she*_*lll 10 android screen wakeup

我从BroadcastReceiver启动一个活动,它由alaram(RTC_WAKEUP类型)触发.在onCreate的那个活动我添加这些标志

getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
    WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
    WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON |
    WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON        
);
Run Code Online (Sandbox Code Playgroud)

问题是有时(大约10%的情况)屏幕无法打开.警报被正确触发(我这里是通知的声音,这也是在接收器的onReceive()中触发的.然后,如果我按下电话的电源按钮,屏幕会亮起,显示我的活动,并立即关闭.那个,电源按钮工作正常.这发生在android 2.3.7上,这里是onReceive()方法

@Override
public void onReceive(Context context, Intent intent) {
    m_Context = context;

    Bundle extras = intent.getExtras();
    final int id = extras.getInt("timer_id");

    Intent activityIntent = new Intent(m_Context, MyActivity.class);
    activityIntent.putExtra("timer_id", id);
    activityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
    m_Context.startActivity(activityIntent);

    // and now load the alarm sound and play it for the desired time
    showFinishedNotification();
}
Run Code Online (Sandbox Code Playgroud)

我想避免使用PowerManager,因为它需要一个权限,并且标志是首选的方式.

什么可能是一个问题?logcat没有显示任何问题......

Mat*_*hew 8

我在这里参加派对有点晚了,但我已经和我斗争了一段时间了,终于找到了让屏幕每次都解锁的方法.我在onAttachToWindow()事件中添加了标志.通常我是从WakefulBroadcastReceiver执行此操作,因此屏幕平滑过渡,但这取决于用例.

@Override
public void onAttachedToWindow() {
    super.onAttachedToWindow();
    //Screen On
    getWindow().addFlags(
            WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                    | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
                    | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
                    | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
}

private void clearFlags() {
    //Don't forget to clear the flags at some point in time.
    getWindow().clearFlags(
                WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                        | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
                        | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
                        | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
}
Run Code Online (Sandbox Code Playgroud)


Cam*_*iro 7

根据我对这个主题的经验和研究:

  • FLAG_TURN_SCREEN_ON不能用来打开屏幕打开和关闭多次,在你的应用程序.

  • 所述FLAG_TURN_SCREEN_ON只能使用一次打开屏幕时ON 创建新活动(最好是在onCreate()方法)或当重新创建的图.

现在,您可以通过以下方式解决此限制:

  • 启动一个新活动并在那里设置标志,然后完成活动(由用户或以编程方式)让屏幕关闭.
  • params.screenBrightness参数设置为尽可能"昏暗",有时屏幕"显示为OFF".然后,您可以增加亮度以"打开"屏幕.但是,这通常不起作用,因为屏幕仍然暗淡但可见,如果用户锁定电话,这也不起作用.
  • 使用Power Manager Wakelock(这仍然有效,但Android不赞成使用此功能,因此他们不鼓励使用此技术).但是,据我所知,这是我可以让应用程序可靠地打开/关闭屏幕的唯一方法.

这些都不是理想的(实际上它们感觉像黑客)但只是使用更适合您的应用需求的那个.

你可以在这里阅读更多:


Com*_*are 4

问题是有时(大约10%的情况)屏幕不亮

如果我不得不猜测,设备会在活动开始之前重新进入睡眠状态。返回后onReceive(),设备可以并且将会重新进入睡眠状态,返回后需要一段时间onReceive()您的活动才会开始。

同样的场景,但替换startActivity()startService(),这就是我必须编写 的原因WakefulIntentService,它使用 aWakeLock来确保设备保持唤醒状态足够长的时间以使其完成工作,然后释放WakeLock.