【问题标题】:Android Activity Not Showing When Screen is Woken Up and Lock Screen Not Disabling唤醒屏幕且未禁用锁定屏幕时未显示 Android Activity
【发布时间】:2012-10-19 17:49:48
【问题描述】:

我有一个BroadcastReceiver,它以Activity 开头。如果在屏幕打开时启动Activity,它会显示并且一切正常。但是,在 ICS 和 JB 设备上(我尚未测试 GB 或 HC,但 Froyo 不存在该问题)如果在屏幕关闭时启动 Activity,则不会禁用锁屏,并且不会禁用活动当手机解锁时显示(通过手动解锁或使用我为后 Froyo 设备输入的代码)。

为什么,至少在 ICS 和 JB 设备上,如果没有下面提到的代码,锁屏不会被禁用,为什么在启动 Activity 时如果屏幕关闭,活动不显示?

代码如下:

BroadcastReceiver

Intent alarmAlert = new Intent(context, AlarmGoneOffActivity.class);
alarmAlert.putExtra(MyAlarmManager.ALARM_NUM_ID, alarm.ID);
alarmAlert.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | 
                    Intent.FLAG_ACTIVITY_NO_USER_ACTION);
context.startActivity(alarmAlert);

AlarmGoneOffActivity.onCreate():

setContentView(R.layout.alarm_gone_off);

final Window win = getWindow();
win.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN | 
             WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | 
             WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | 
             WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON,
             WindowManager.LayoutParams.FLAG_FULLSCREEN | 
             WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | 
             WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | 
             WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
}

//so far all of my post froyo devices (ICS and JB no more GB)
// don't bypass the lockscreen unless we use this
if(Build.VERSION.SDK_INT > Build.VERSION_CODES.FROYO) {
    KeyguardManager  myKeyGuard = 
                    (KeyguardManager)getSystemService(Context.KEYGUARD_SERVICE);
    KeyguardLock myLock = myKeyGuard.newKeyguardLock("ShabbosAlarm");
    myLock.disableKeyguard();
}

编辑:我真的不想使用KeyguardLock.disableKeyguard(),因为它会导致键盘保护在KeyguardLock.reenableKeyguard() 之前被禁用,这很不方便。有什么解决办法吗?

Edit2:我现在可以确认该问题仅存在于 ICS 及更高版本上。是否进行了某些更改以防止键盘锁被禁用?即使有,为什么手动解锁屏幕时我的Activity 不显示?

【问题讨论】:

  • 是否安装了任何设备策略管理器?检查doc。如果安装了 DPM,它就不起作用
  • 我想你误会了。使用KeyguardLock.disableKeyguard() 工作正常。这是解决问题的方法。
  • @Eliezer 你解决过这个问题吗?我面临着完全相同的问题,无论我如何弄乱窗口标志,键盘保护都不会禁用......
  • @brandall 不幸的是我还没有解决这个问题,虽然我有一段时间没有真正专注于那个应用程序。如果找到解决方案,我会更新。
  • @Eliezer - 谢谢。经过一夜的努力,我设法在没有使用 Keyguard 许可的情况下解决了它。我将在今天晚些时候发布我的答案

标签: android android-activity android-screen android-windowmanager


【解决方案1】:

这是我用来实现此目的的基本实现。它适用于 2.3-4.3 的用户。我敢肯定,您可以从这里开始构建它。我创建了这个非常短暂的活动,只是为了处理这个事件 - 如果需要,您可以将它用作帮助类:

import android.app.Activity;
import android.os.Bundle;
import android.view.WindowManager;

public class BlankActivity extends Activity {

    @Override
    public void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        getWindow().setFlags(
                WindowManager.LayoutParams.FLAG_FULLSCREEN | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
                        | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON,
                WindowManager.LayoutParams.FLAG_FULLSCREEN | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
                        | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);


        // Your code here - Or if it doesn't trigger, see below
    }

    @Override
    public void onAttachedToWindow() {

        // You may need to execute your code here

    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);

        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {

        } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {

        }
    }

    @Override
    public void onPause() {
        super.onPause();

        finish();
    }
}

在清单中:

    <activity
        android:name="com.your.package.BlankActivity"
        android:clearTaskOnLaunch="true"
        android:configChanges="keyboardHidden|orientation|screenSize"
        android:excludeFromRecents="true"
        android:launchMode="singleInstance"
        android:noHistory="true"
        android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" >
    </activity>

与其他相关帖子相反,半透明主题没有引起问题,也不需要将布局添加到 Activity。

希望它也对你有用。

【讨论】:

  • 另外,您能否进一步解释一下将其作为“短期活动”的必要性?
  • @ForrestBice 这确实对我有用。我想我可能不得不稍微改变它才能让它与我正在做的事情一起工作,但它应该按原样工作。
  • 我没有写关于它是一个短暂的活动的部分,但我认为他的意思是他写了一个Activity 作为finishs 在onPause 的例子。跨度>
  • @Eliezer 感谢您的回复。 “android:clearTaskOnLaunch”等选项有多重要?清单中是否还需要“FLAG_SHOW_WHEN_LOCKED”等的任何权限?我现在正在尝试这个。感谢您的帮助!
【解决方案2】:

此代码对我有用。我把它放在 OnCreate 活动中

private fun wakeScreen() {
    val window = getWindow();
    window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON or
            WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD or
            WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED or
            WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON)
}

我把这个放在活动清单上

<activity android:name=".Alarm.AlarmNotifActivity"
        android:showOnLockScreen="true"
        android:showWhenLocked="true"
        android:launchMode="singleInstance"/>

希望它会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    相关资源
    最近更新 更多