【问题标题】:Receiver is not being called by AlarmManager - AndroidAlarmManager 没有调用接收器 - Android
【发布时间】:2015-12-18 21:50:24
【问题描述】:

我已经写了这个类来每 24 小时调用一次接收器

我试图为“SabahReceiver”使用相同的接收器,然后我添加了另一个接收器“MasaReceiver”,所有的可能性都不适合我!

谁能告诉我怎么回事!?

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

import com.mbh.test.receivers.MasaReciever;
import com.mbh.test.receivers.SabahReciever;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * Created by MBH on 17/12/15.
 */
public class SabahMasaAlarmManager {
    public static final int MINUTE = 60000;
    public static final int HOUR = 1000 * 60 * 60;
    public static final int DAY = 86400000;

    private PendingIntent mSabahPendingIntent;
    private PendingIntent mMasaPendingIntent;
    private Context mContext;

    private void SetupAlarms() {
        /* Retrieve a PendingIntent that will perform a broadcast */
        Intent sabahAlarm = new Intent(mContext, SabahReciever.class);
//        sabahAlarm.putExtra(SabahReciever.KEY_IS_SABAH, true);
        mSabahPendingIntent = PendingIntent.getBroadcast(mContext, 100, sabahAlarm, 0);

        /* Retrieve a PendingIntent that will perform a broadcast */
        Intent masaAlarm = new Intent(mContext, MasaReciever.class);
//        sabahAlarm.putExtra(SabahReciever.KEY_IS_SABAH, false);
        mMasaPendingIntent = PendingIntent.getBroadcast(mContext, 101, masaAlarm, 0);
    }

    public void StartAlarm() {

        SimpleDateFormat dateFormat = new SimpleDateFormat(
                "yyyy-MM-dd HH:mm:ss" );

        Date now = Calendar.getInstance().getTime();

        Calendar sabahDate = Calendar.getInstance();
        sabahDate.set(Calendar.HOUR_OF_DAY, 23);
        sabahDate.set(Calendar.MINUTE, 47);
        sabahDate.set(Calendar.SECOND, 0);
//        sabahDate.set(Calendar.HOUR_OF_DAY, 6);
//        sabahDate.set(Calendar.MINUTE, 0);
        if(sabahDate.getTime().before(now)){
            sabahDate.add(Calendar.DAY_OF_YEAR, 1);
        }

        Log.d("DATE", "Sabah: "+ dateFormat.format(sabahDate.getTime()));

        Calendar masaDate = Calendar.getInstance();
        masaDate.set(Calendar.HOUR_OF_DAY, 23);
        masaDate.set(Calendar.MINUTE, 49);
//        masaDate.set(Calendar.HOUR_OF_DAY, 20);
//        masaDate.set(Calendar.MINUTE, 0);
        masaDate.set(Calendar.SECOND, 0);
        if(masaDate.getTime().before(now)){
            masaDate.add(Calendar.DAY_OF_YEAR, 1);
        }


        Log.d("DATE", "Masa: "+ dateFormat.format(masaDate.getTime()));

        AlarmManager manager = (AlarmManager) mContext.getApplicationContext().getSystemService(Context.ALARM_SERVICE);

        manager.setInexactRepeating(AlarmManager.RTC_WAKEUP, sabahDate.getTimeInMillis(), DAY, mSabahPendingIntent);
//        manager.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+10000, 86400000, mSabahPendingIntent);

        manager.setInexactRepeating(AlarmManager.RTC_WAKEUP, masaDate.getTimeInMillis(), DAY, mMasaPendingIntent);
//        manager.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+20000, 86400000, mMasaPendingIntent);
    }

    public void cancelAlarm() {
        AlarmManager managerSabah = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
        managerSabah.cancel(mSabahPendingIntent);

        AlarmManager managerMasa = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
        managerMasa.cancel(mMasaPendingIntent);
    }

    public SabahMasaAlarmManager(Context baseContext) {
        mContext = baseContext;
        SetupAlarms();
    }
}

【问题讨论】:

    标签: android broadcastreceiver alarmmanager android-pendingintent


    【解决方案1】:

    setInexactRepeating() 并不一定会在所述时间后准确触发警报。可能会有一些延迟,或者它可能会提前触发。基本上框架“批量”一次触发所有不精确的警报。使用setExact。还要考虑深度睡眠模式。见How to use CPU to perform any operation in deep sleep mode。由于您希望闹钟每 24 小时触发一次,因此当闹钟响起时,设备很有可能处于睡眠模式。

    【讨论】:

    • 我试图让设备保持打开状态并对此进行了大量测试,但仍然没有被触发,现在我将尝试 setExact
    • 当然可以。使用 WakefulReceiver 和 startWakefulService()。
    • 对不起,还有一个问题,是否有任何 setExactRepeating 或替代方法?
    • 没有。没有重复准确的警报。你必须在它被触发时再次设置,这样它会再次重复。这里是 setRepeat() 不准确但没有 setExactRepeat()。
    • 非常感谢,现在 setRepeating 完美运行!我想这就是我想要的,几分钟或几秒钟的差异在我的情况下并不重要
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多