我将应用程序放在AlarmManager安排活动启动的位置。即使屏幕关闭且设备已锁定,我也希望显示。
要获得此设置窗口标志
final Window win = getWindow();
win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
| WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
| WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
| WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON);
并尝试获取屏幕锁定
if(_lock == null)
{
PowerManager pm = (PowerManager)App.getAppContext()
.getSystemService(Context.POWER_SERVICE);
_lock = pm.newWakeLock(
PowerManager.FULL_WAKE_LOCK, "ScreenOn");
_lock.acquire();
}
_lock是在onPause中释放的PowerManager.WakeLock
protected void onPause()
{
if(_lock != null)
{
_lock.release();
}
}
此代码在onCreate和onRestart中执行。如果活动尚未启动,一切正常。
但如果它早些时候发布,屏幕就不会关闭。
因此活动未启动。我的问题是如何在这种情况下打开屏幕。 (我使用的是API 15)。
答案 0 :(得分:2)
我提出了解决方案。我创建了一个新活动,它将尝试打开onCreate()
中的屏幕,然后等待它打开。当屏幕没问题时,它将启动应显示的活动。要使Android始终创建此活动
public class TurnOnScreen extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
if (pm.isScreenOn()) openActivity();
else {
registerReceiver(mScreenOnReceiver, new IntentFilter(
Intent.ACTION_SCREEN_ON));
reciever_registered = true;
turnScreenOn();
}
}
@Override
public void onDestroy() {
super.onDestroy();
if (reciever_registered) {
unregisterReceiver(mScreenOnReceiver);
reciever_registered = false;
}
}
private boolean reciever_registered = false;
private final BroadcastReceiver mScreenOnReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
openActivity();
}
};
private void openActivity() {
Intent intent = new Intent();
// ....
finish();
}
private void turnScreenOn() {
final Window win = getWindow();
win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
| WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
| WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
| WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON);
}
}
我仍在寻找解释为什么在onRestart中没有打开屏幕的原因。
答案 1 :(得分:1)
您听说过“明亮的绿色房间”吗?查看下面的代码,它可能是您正在寻找的。
答案 2 :(得分:0)
只需使用您的代码:
final Window win = getWindow();
win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
| WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
仅在 onCreate()中删除所有其他活动周期方法,如果他们没有做任何其他事情,那么。
我认为您无需再使用任何代码来执行此操作。