我已经使用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();
}
}
您正在尝试以onReceive
方法从接收方启动活动,如果您的应用程序在后台运行,则会出现问题。
请阅读以下有关此主题的文档:https://developer.android.com/guide/components/activities/background-starts
您应该向用户显示通知,并根据用户操作打开活动。