当屏幕唤醒时,Android活动未显示,锁屏未禁用

7
我有一个广播接收器(BroadcastReceiver),它启动了一个活动(Activity)。如果屏幕开着时启动该活动,则会显示一切正常。但是,在ICS和JB设备上(我尚未测试GB或HC,但在Froyo上不存在此问题),如果在屏幕关闭时启动该活动,则锁屏不会被禁用,并且在手机解锁时不会显示该活动(无论是手动解锁还是使用我放置的代码后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()之前一直处于禁用状态,这很不方便。有什么解决办法吗?

编辑2: 我现在可以确认该问题仅存在于ICS及以上版本中。是否有什么更改防止键盘锁被禁用?即使有,为什么我的Activity在屏幕被手动解锁时也没有显示?


有没有安装任何设备策略管理器?请查看文档。如果已安装DPM,则它将无法工作。 - nandeesh
我认为你误解了。使用KeyguardLock.disableKeyguard()是有效的,这是解决问题的方法。 - Eliezer
@Eliezer 你解决了吗?我面临着完全相同的问题,无论我如何调整窗口标志,键盘保护程序都无法禁用... - brandall
@brandall 很抱歉,我还没有解决这个问题,虽然我有一段时间没有专注于那个应用程序。如果我找到解决方案,我会进行更新。 - Eliezer
1
@Eliezer - 谢谢。经过整夜的努力,我成功解决了这个问题,而且没有使用Keyguard权限。我会在今天晚些时候发布我的答案。 - brandall
2个回答

3
这是我用来实现这个功能的基本实现。它适用于2.3-4.3版本的用户。您可以在此基础上进行扩展。我创建了这个非常短暂的 Activity,只是为了处理这个事件-如果需要,您可以将其用作帮助类:
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>

与其他相关帖子所说的不同,透明主题并没有引起任何问题,也没有必要添加布局到活动中。
希望这对您也有用。

此外,您能否进一步解释为什么需要这是一个“短暂的活动”? - Forrest Bice
这对我有用。我认为我可能不得不稍微改动一下,以使其适应我正在进行的工作,但它应该原样工作。 - Eliezer
我没有写关于它是短暂活动的部分,但我认为他的意思是他编写了一个“Activity”作为在“onPause”中结束的示例。 - Eliezer
@Eliezer 感谢您的回复。像“android:clearTaskOnLaunch”等选项有多重要?此外,“FLAG_SHOW_WHEN_LOCKED”等是否需要在清单中添加权限?我正在尝试这个。感谢您的帮助! - Forrest Bice

0

这段代码对我有效。我将其放在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"/>

希望它有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接