【问题标题】:Android AlarmManager turn on screen when app in foregroundAndroid AlarmManager 在应用程序在前台时打开屏幕
【发布时间】:2016-01-29 15:52:46
【问题描述】:

我正在创建一个警报应用程序,因此我想使用 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
                        );
              }
        });
    }

【问题讨论】:

    标签: android screen alarmmanager turn


    【解决方案1】:

    onReceive() 方法中的第一件事可能是获取 wake lock

    别忘了释放它。

    【讨论】:

    • 是的,我也发现唤醒锁可以解决问题。但据我了解,唤醒锁已被弃用,应由 WindowManager.LayoutParams 替换。因此,我认为 Android 5.0 中存在一个错误。我在以下位置看到了类似的德语帖子:androidpit.de/forum/625157/…
    • 我不认为有错误,因为我猜你的情况下的 onCreated() 没有被称为可能是你清单中的 launchMode 的原因。尝试查看 onNewIntent()。
    • 另外我认为唤醒锁实际上并没有被“贬低”,开发文档说你应该小心使用它,而且大多数情况下窗口标志就足够了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 2021-06-13
    相关资源
    最近更新 更多