1
我正在創建鬧鐘應用程序,因此我想使用AlarmManager在特定時間運行我的應用程序。它應該打開屏幕並禁用任何鍵盤鎖。Android AlarmManager在前臺應用程序中打開屏幕
一切工作正常,如果應用程序已關閉或在後臺。 AlarmMager呼叫我的BroadcastReceiver,在那裏我可以開始我的活動。屏幕繼續,我看到我的應用程序。
問題是如果我的應用程序已經在屏幕關閉的前臺。我可以聽到我的應用程序的聲音,所以我知道警報已解除,但屏幕無法打開。
我試過玩任務和窗口設置,但沒有成功。 Intent.FLAG_ACTIVITY_NEW_TASK,
這個問題也可能與我並不是在onCreate方法中的所有窗口屬性有關。我只是想打開屏幕,如果應用程序也決定有一個報警事件,並觸發onCreate後startWakeup。
AndroidManifest.xml中
<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<application ...>
<activity
android:name=".FullscreenActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:label="@string/app_name"
android:theme="@style/Theme.AppCompat.NoActionBar"
android:launchMode="singleTask">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:process=":remote" android:name=".AlarmMan"></receiver>
<receiver android:name=".AutoStart">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
...
</activity>
</application>
AlarmMan.java
public class AlarmMan extends BroadcastReceiver
{
@Override
public void onReceive (Context context, Intent intent)
{
Intent i = new Intent(context, FullscreenActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
}
}
FullscreenActivity.java
public class FullscreenActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
}
public void startWakeup() {
runOnUiThread(new Runnable() {
@Override
public void run() {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
mainFrame.setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LOW_PROFILE |
View.SYSTEM_UI_FLAG_FULLSCREEN |
View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY |
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION |
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
);
}
});
}
public void stopWakeup() {
runOnUiThread(new Runnable() {
@Override
public void run() {
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
mainFrame.setSystemUiVisibility(
View.SYSTEM_UI_FLAG_VISIBLE
);
}
});
}
是的,我發現一個喚醒鎖解決了這個問題。但據我瞭解,wakelocks已被棄用,應該由WindowManager.LayoutParams替換。因此我認爲Android 5.0中存在一個錯誤。我在德國看到類似的帖子:https://www.androidpit.de/forum/625157/window-flags-werden-nur-1x-beruecksichtigt – Alex
我不認爲有一個錯誤,因爲我猜onCreated()在你的情況下,您的清單中不會調用launchMode的原因。試着看onNewIntent()。 –
另外我不認爲wakelocks實際上是「depricated」,開發文檔說你應該仔細使用它,並且對於大多數情況下窗口標誌是足夠的 –