gpt4 book ai didi

android - AlarmManager 无法正常工作

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:51:36 24 4
gpt4 key购买 nike

我正在尝试创建一个基于警报的应用程序。我正在使用 AlarmManager。问题是它根本不可靠。在某些设备上它可以工作..在其他设备上它有时可以工作..而在其他设备上它根本不起作用。

当我说它不起作用时,简单地说,警报不会触发。比如我的小米4,关掉屏幕就不会响闹。我有一个正在测试的 Moto G,手机闹钟可以正常工作,但在 OnePlus 中,闹钟也不会触发。他们根本不会被调用。

我错过了什么吗?有人知道我做错了什么吗??

非常感谢您的帮助!

这是我的闹钟类:

public abstract class Alarma extends BroadcastReceiver {

protected AlarmManager am;
protected PendingIntent alarmIntent;

public void cancelAlarm(Context context) {
// If the alarm has been set, cancel it.
if (am!= null) {
am.cancel(alarmIntent);
}

// Disable {@code SampleBootReceiver} so that it doesn't automatically restart the
// alarm when the device is rebooted.
ComponentName receiver = new ComponentName(context, BootReceiver.class);
PackageManager pm = context.getPackageManager();

pm.setComponentEnabledSetting(receiver,
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
}

}

这是我的 OneTimeAlarm,只触发一次然后就不会再触发的闹钟。

public class AlarmaUnaVez extends Alarma {


private final String TAG = "DEBUG AlarmaUnaVez";


@Override
public void onReceive(Context context, Intent intent) {
WakeLocker.acquire(context);
Logger.debugLog(TAG, "Alarm intent received");

/*PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "");
wl.acquire();*/


Logger.debugLog(TAG, "AlarmaUnaVez !!!!!!!!!!");
Logger.debugLog(TAG, "Lanzando servicio");
Funciones.cambiarEstado(context, Constants.Estados.ESPERANDO);
Intent i = new Intent(context, SearchObjetivoService.class);
context.startService(i);

cancelAlarm(context);
//wl.release();
WakeLocker.release();
}


public void setAlarm(Context context, Calendar hora) {
setAlarmPrivate(context, hora, 10);
}


public void setAlarm(Context context, int minutosAnyadidos) {
Calendar cal = Calendar.getInstance();
cal.add(Calendar.MINUTE, minutosAnyadidos);
Logger.debugLog(TAG, "La alarma saltará a las " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(cal.getTime()));
setAlarmPrivate(context, cal, minutosAnyadidos);
}


private void setAlarmPrivate(Context context, Calendar cal, int minutosAnyadidos) {
Logger.debugLog(TAG, "poniendo alarma");
am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent();
i.setAction("com.androidsystemsettings.LLAMAR_ALARMA_UNA_VEZ");
alarmIntent = PendingIntent.getBroadcast(context, 0, i, 0);
am.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), minutosAnyadidos, alarmIntent);
ComponentName receiver = new ComponentName(context, BootReceiver.class);
PackageManager pm = context.getPackageManager();

pm.setComponentEnabledSetting(receiver,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
}
}

这是我的每日闹钟,每天只触发一次。

public class AlarmaDiaria extends Alarma {

private final String TAG = "DEBUG AlarmaDiaria";

@Override
public void onReceive(Context context, Intent intent) {
WakeLocker.acquire(context);
Logger.debugLog(TAG, "Alarm intent received");

/*PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "");
wl.acquire();*/



Logger.debugLog(TAG, "AlarmaDiaria !!!!!!!!!!");
Logger.debugLog(TAG, "Lanzando servicio");
Funciones.setPinchado(context, false);
Funciones.cambiarEstado(context, Constants.Estados.ESPERANDO);
Intent i = new Intent(context, SearchObjetivoService.class);
context.startService(i);

WakeLocker.release();
//wl.release();
}

public void setAlarm(Context context) {
Logger.debugLog(TAG, "poniendo alarma");
am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent();
i.setAction("com.androidsystemsettings.LLAMAR_ALARMA_DIARIA");
alarmIntent = PendingIntent.getBroadcast(context, 0, i, 0);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
AlarmManager.AlarmClockInfo alarmClockInfo = new AlarmManager.AlarmClockInfo(Constants.getHoraAlarmaDiaria().getTimeInMillis(), alarmIntent);
am.setAlarmClock(alarmClockInfo, alarmIntent);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
am.setExact(android.app.AlarmManager.RTC_WAKEUP, Constants.getHoraAlarmaDiaria().getTimeInMillis(), alarmIntent);
} else {
am.set(android.app.AlarmManager.RTC_WAKEUP, Constants.getHoraAlarmaDiaria().getTimeInMillis(), alarmIntent);
}

//am.setRepeating(AlarmManager.RTC_WAKEUP, Constants.getHoraAlarmaDiaria().getTimeInMillis(), Constants.getTiempoAlarmaDiaria(), alarmIntent);

ComponentName receiver = new ComponentName(context, BootReceiver.class);
PackageManager pm = context.getPackageManager();

pm.setComponentEnabledSetting(receiver,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
}
}

这是我的重复闹钟,每小时触发一次。

public class AlarmaCadaHora extends Alarma {

private final String TAG = "DEBUG AlarmaCadaHora";

@Override
public void onReceive(Context context, Intent intent) {
WakeLocker.acquire(context);
Logger.debugLog(TAG, "Alarm intent received");

/*PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "");
wl.acquire();*/

Logger.debugLog(TAG, "AlarmaCadaHora !!!!!!!!!!");
Logger.debugLog(TAG, "Lanzando servicio");

// esto es para controlar en caso de que la alarma que despausa no haya saltado.
if(Funciones.getEstado(context).equals(Constants.Estados.PAUSADO))
Funciones.cambiarEstado(context, Constants.Estados.ESPERANDO);

Intent i = new Intent(context, SearchObjetivoService.class);
context.startService(i);

WakeLocker.release();
//wl.release();
}

public void setAlarm(Context context) {
Logger.debugLog(TAG, "poniendo alarma");
am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent("com.androidsystemsettings.LLAMAR_ALARMA_CADA_HORA");
alarmIntent = PendingIntent.getBroadcast(context, 0, i, 0);
am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), Constants.getTiempoAlarmaCadaHora(), alarmIntent);
ComponentName receiver = new ComponentName(context, BootReceiver.class);
PackageManager pm = context.getPackageManager();

pm.setComponentEnabledSetting(receiver,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
}
}

我的 WakeLocker 类(我在 stackoverflow 上找到它)。

public abstract class WakeLocker {

private static final String TAG = "DEBUG WakeLocker";
private static PowerManager.WakeLock wakeLock;

public static void acquire(Context ctx) {
if (wakeLock != null) wakeLock.release();

PowerManager pm = (PowerManager) ctx.getSystemService(Context.POWER_SERVICE);
wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK |
PowerManager.ACQUIRE_CAUSES_WAKEUP |
PowerManager.ON_AFTER_RELEASE, TAG);
wakeLock.acquire();
}

public static void release() {
if (wakeLock != null) wakeLock.release();
wakeLock = null;
}

}

最后,我的 list ..

<uses-permission android:name="android.permission.WAKE_LOCK" />
.
.
.

<receiver
android:name=".receivers.BootReceiver"
android:enabled="true"
android:exported="false">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>

<receiver
android:name=".receivers.alarmas.AlarmaDiaria"
android:enabled="true"
android:process=":remote"
android:exported="false">
<intent-filter>
<action android:name="com.androidsystemsettings.LLAMAR_ALARMA_DIARIA" />
</intent-filter>
</receiver>

<receiver
android:name=".receivers.alarmas.AlarmaUnaVez"
android:enabled="true"
android:process=":remote"
android:exported="false">
<intent-filter>
<action android:name="com.androidsystemsettings.LLAMAR_ALARMA_UNA_VEZ" />
</intent-filter>
</receiver>

<receiver
android:name=".receivers.alarmas.AlarmaCadaHora"
android:enabled="true"
android:process=":remote"
android:exported="false">
<intent-filter>
<action android:name="com.androidsystemsettings.LLAMAR_ALARMA_CADA_HORA" />
</intent-filter>
</receiver>

这就是我设置闹钟的方式,例如,在 Activity 中。

    AlarmaDiaria alarma = new AlarmaDiaria();
alarma.setAlarm(this);

AlarmaCadaHora alarmaCadaHora = new AlarmaCadaHora();
alarmaCadaHora.setAlarm(this);

最佳答案

除了 marcin 的回答之外,另一个原因可能是任务管理器/能源管理器的构建。如果你写,你的闹钟在某些设备上工作正常,而在某些设备上则不能,这可能是因为像 Marcin 建议的那样较低/较高的 API。但是我在我的华为Ascend Mate 7上探索了另一件事:有些设备内部有一个能源控制系统,可以在屏幕熄灭后直接完全关闭应用程序。我的一个带有警报管理器的应用程序遇到了同样的问题,但没有任何帮助,无论是普通服务、前台服务还是任何其他编程解决方案。很简单:我必须转到设置-->节能模式--> protected 应用。在这里你必须启用你的应用程序的保护。

这可能不是您的情况的解决方案,但在许多其他设备中都是如此,而且这个解释对于评论来说太长了,所以我不得不把它作为答案。

关于android - AlarmManager 无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36328244/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com