繁体   English   中英

AlarmManager有时不触发

[英]AlarmManager sometimes not firing

奇怪的是,我的应用有成千上万的用户,对于大多数人来说,这完美地工作了。 假设有5%的体验问题导致提醒未触发。

我已经记录了调度机制,包括调度的时间戳,因此我知道该提醒已调度,但未调用AlarmReceiver。

为什么有时AlarmManager无法启动?

ReminderLogic.java-

public class ReminderLogic {

    public static void schedule() {
        AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);

        Intent intent = new Intent(context, AlarmReceiver.class);
        PendingIntent alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0);

        int timeMillis = ... // some calculation

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) 
            alarmManager.setExact(AlarmManager.RTC_WAKEUP, timeMillis, alarmIntent);
        else 
            alarmManager.set(AlarmManager.RTC_WAKEUP, timeMillis, alarmIntent);
    }
}

AlarmReceiver.java-

public class AlarmReceiver extends WakefulBroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Intent service = new Intent(context, AlarmService.class);
        startWakefulService(context, service);
    }   
}

AlarmService.java-

public class AlarmService extends IntentService {
    private final static String TAG = "AlarmService";

    public AlarmService() {
        super(TAG);
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        ReminderLogic.schedule();

        AlarmReceiver.completeWakefulIntent(intent);
    }
}

BootReceiver.java-

public class BootReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        ReminderLogic.schedule();
    }

}

PackageReplaceReceiver.java-

public class PackageReplaceReceiver extends BroadcastReceiver {

    private static final String TAG = "BootReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {
        ReminderLogic.schedule();
    }

}

AndroidManifest.xml-

    <service android:name=".reminders.AlarmService" />
    <receiver android:name=".reminders.AlarmReceiver" />

    <receiver
        android:name=".reminders.BootReceiver"
        android:exported="true" >
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>
    <receiver
        android:name=".reminders.PackageReplaceReceiver"
        android:exported="true" >
        <intent-filter>
            <action android:name="android.intent.action.MY_PACKAGE_REPLACED" />
        </intent-filter>
    </receiver>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM