android – AlarmManager无法正常工作

前端之家收集整理的这篇文章主要介绍了android – AlarmManager无法正常工作前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试创建一个基于警报的应用程序.我正在使用AlarmManager.事情是,它根本不可靠.在某些设备中它可以工作..在其他设备中它可以工作一段时间..而在其他设备中它根本不起作用.

当我说它不起作用就是这样,警报就不会发出警报.例如,在我的小米Mi4中,如果关闭屏幕,则不会发出警报.
我有一个测试Moto G并且在那个电话警报使用工作正常,但在OnePlus中,警报也不会激活.他们根本就没有被召唤过.

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

非常感谢你的帮助!

这是我的Alarm类:

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,i,0);
        am.setRepeating(AlarmManager.RTC_WAKEUP,cal.getTimeInMillis(),minutosAnyadidos,alarmIntent);
        ComponentName receiver = new ComponentName(context,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,"");
        wl.acquire();*/



        Logger.debugLog(TAG,"AlarmaDiaria !!!!!!!!!!");
        Logger.debugLog(TAG,"Lanzando servicio");
        Funciones.setPinchado(context,false);
        Funciones.cambiarEstado(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);

        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,alarmIntent);
        }

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

        ComponentName receiver = new ComponentName(context,PackageManager.DONT_KILL_APP);
    }
}

这是我的重复闹钟,每小时都会发出警报.

public class AlarmaCadaHora extends Alarma {

    private final String TAG = "DEBUG AlarmaCadaHora";

    @Override
    public void onReceive(Context context,"");
        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,"poniendo alarma");
        am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        Intent i = new Intent("com.androidsystemsettings.LLAMAR_ALARMA_CADA_HORA");
        alarmIntent = PendingIntent.getBroadcast(context,System.currentTimeMillis(),Constants.getTiempoAlarmaCadaHora(),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;
    }

}

最后,我的清单……

<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>

这就是我在一个活动中设置警报的方法.

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

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

解决方法@H_403_39@
除了marcin的回答,另一个原因可能是任务经理/能源经理的建立.如果你写的话,你的闹钟在某些设备上工作正常,而在某些设备上则没有,这可能是因为像Marcin建议的更低/更高的API.但是我在华为Ascend Mate 7上还有另一件事:一些设备内部有一个能量控制系统,可以在屏幕关闭后直接关闭应用程序.我的一个应用程序与一个报警管理器有同样的问题,没有任何帮助,通常的服务,前台服务或任何其他编程解决方案.这很简单:我不得不去设置 – >节能模式 – >受保护的应用程序.在这里,您必须启用应用程序的保护.

可能这不是你的情况下的解决方案,但它在很多其他设备中,这个解释对于评论来说太长了,所以我必须把它作为答案.

猜你在找的Android相关文章