Android AlarmManager有时不开火
奇怪的是,我的应用程序有成千上万的用户,对他们中的大多数人来说,这是完美的。比如说,有5%的人遇到了导致提醒不能被触发的问题 我已经将日志记录放在调度机制上,包括调度的时间戳,因此我知道提醒已调度,但没有调用AlarmReceiver 为什么经理有时不开枪 提醒逻辑.java-Android AlarmManager有时不开火,android,alarmmanager,android-notifications,Android,Alarmmanager,Android Notifications,奇怪的是,我的应用程序有成千上万的用户,对他们中的大多数人来说,这是完美的。比如说,有5%的人遇到了导致提醒不能被触发的问题 我已经将日志记录放在调度机制上,包括调度的时间戳,因此我知道提醒已调度,但没有调用AlarmReceiver 为什么经理有时不开枪 提醒逻辑.java- public class ReminderLogic { public static void schedule() { AlarmManager alarmManager = (AlarmMa
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);
}
}
public class BootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
ReminderLogic.schedule();
}
}
public class PackageReplaceReceiver extends BroadcastReceiver {
private static final String TAG = "BootReceiver";
@Override
public void onReceive(Context context, Intent intent) {
ReminderLogic.schedule();
}
}
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 AlarmReceiver extends WakefulBroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent service = new Intent(context, AlarmService.class);
startWakefulService(context, service);
}
}
public class BootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
ReminderLogic.schedule();
}
}
public class PackageReplaceReceiver extends BroadcastReceiver {
private static final String TAG = "BootReceiver";
@Override
public void onReceive(Context context, Intent intent) {
ReminderLogic.schedule();
}
}
packagerplacereceiver.java-
public class AlarmReceiver extends WakefulBroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent service = new Intent(context, AlarmService.class);
startWakefulService(context, service);
}
}
public class BootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
ReminderLogic.schedule();
}
}
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>
这5%的用户可能有任何taskManager在警报响起之前杀死你的应用程序。例如,华为设备有自己的节能装置,应用程序必须受到保护才能不被杀死……哦,非常有趣,确实有一些用户抱怨华为。你知道如何保护一个应用程序不被杀掉吗?抱歉,没有。我也搜索过那个案例,但没有根是不可能的。唯一的方法就是告知用户。特别是对于whatsApp,我可以看到这在我的华为中是自动保护的,但我认为这是在能源管理器内部实现的。谢谢,我将尝试与我的客户核实这一点。