Android AlarmManager включить экран, когда приложение на переднем плане
Я создаю приложение для будильника и поэтому хочу запустить свое приложение в определенное время с помощью AlarmManager. Следует включить экран и отключить любую блокировку клавиатуры.
Все работает нормально, если приложение закрыто или в фоновом режиме. AlarmMager вызывает мой BroadcastReceiver, и там я могу начать свою деятельность. Экран включается, и я вижу свое приложение.
Проблема в том, что мое приложение уже на переднем плане с выключенным экраном. Я слышу звук моего приложения, поэтому я знаю, что сработала сигнализация, но экран не включается.
Я пытался поиграть с настройками задач и окон, но безуспешно. Intent.FLAG_ACTIVITY_NEW_TASK,
Проблема также может быть связана с тем, что я не все свойства окна в методе onCreate. Я только хочу включить экран, если приложение решает, что есть событие тревоги и запускает startWakeup после onCreate.
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
);
}
});
}
1 ответ
Первое, что в вашем onReceive()
метод может быть получить блокировку
не забудьте выпустить это все же.