setAlarmClock BroadcastReceiver有时无法到达onResume

问题描述 投票:0回答:1

我已经使用setAlarmClock创建了一个闹钟应用。对于某些人,警报无法正常启动。我知道您必须在设备上禁用所有节能模式,否则可能不会触发警报。但是在极少数情况下,警报会按时启动,但是在完成我的活动的onCreate和onPostCreate的所有步骤之前,它会有时间间隔。

这可能与我的唤醒锁激活得很晚这一事实有关。当通过警报事件调用Broadcastreceiver时,它将启动我的主要活动。该活动将启动一个线程,该线程必须至少运行一次。它检查警报是否应触发。如果是,则它将创建唤醒锁以使设备保持唤醒状态。

我可以尝试创建唤醒锁,但是我看到甚至没有调用onResume的日志文件,只有onStart才被调用。 onStart和onResume之间有5分钟的间隔。因此,没有机会尽早实现。

我的闹钟和唤醒锁概念有问题吗?是否可以/明智地在BroadcastReceiver中启动唤醒锁,然后在Activity中将其停止?

public class AlarmManagement extends BroadcastReceiver implements Serializable
{
    @Override
    public void onReceive (Context context, Intent intent)
    {
        Intent i = new Intent(context, FullscreenActivity.class);
        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
        context.startActivity(i);
    }

    public void scheduleSystemAlarmApi21(Context context,long alarmTime, PendingIntent pi) {
        AlarmManager am =( AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        Intent i2=new Intent(context, FullscreenActivity.class);
        PendingIntent pi2=PendingIntent.getActivity(context, 0, i2, 0);
        am.setAlarmClock(new AlarmManager.AlarmClockInfo(alarmTime,pi2),pi);
    }

    public void scheduleSystemAlarm(Context context,int id, long alarmTime) {
        Intent i = new Intent(context, AlarmManagement.class);
        PendingIntent pi = PendingIntent.getBroadcast(context, id, i, 0);

        scheduleSystemAlarmApi21(context,alarmTime,pi);
    }
}

public class FullscreenActivity extends AppCompatActivity {
    Thread thread;

    @Override
    protected void onResume() {
        super.onResume();
        if (threadStopped)
            alarmServiceThread();
    }

    void alarmServiceThread() {
        thread = new Thread() {
            @Override
            public void run() {
            ...
                if (needToStartWakeup(currentTime))
                     startWakeup();
            ...
            }
        }
        thread.start(); 
    }

    PowerManager powerManager;
    PowerManager.WakeLock wake;

    public void startWakeup() {
        powerManager = ((PowerManager) getSystemService(Context.POWER_SERVICE));
        int levelAndFlags=PowerManager.ACQUIRE_CAUSES_WAKEUP;
        levelAndFlags |= PowerManager.SCREEN_BRIGHT_WAKE_LOCK;
        wake = powerManager.newWakeLock( levelAndFlags , WAKE_LOCK_TAG);
        wake.acquire();
    }   
}
android wakelock setalarmclock
1个回答
0
投票

您正在尝试以onReceive方法从接收方启动活动,如果您的应用程序在后台运行,则会出现问题。

请阅读以下有关此主题的文档:https://developer.android.com/guide/components/activities/background-starts

您应该向用户显示通知,并根据用户操作打开活动。

© www.soinside.com 2019 - 2024. All rights reserved.