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() метод может быть получить блокировку

не забудьте выпустить это все же.

Другие вопросы по тегам