当应用程序从后台清除时,AlarmManager 被丢弃
AlarmManager is discarded when application is cleared from background
这就是我创建闹钟的方式。
当应用程序仍在后台 运行 时,将触发警报。
但是当它从最近的应用程序中清除时,警报就会被丢弃。我正在注册一个新接收器并提供一个独特的操作来区分两个警报。我的代码有没有错误。
String filter_action = "myPackageName" + request_code_value +"_time";
IntentFilter filter = new IntentFilter(filter_action);
registerReceiver(new AlarmReciever(), filter);
Intent intent = new Intent(filter_action);
intent.putExtra(getString(R.string.get_current_intent_value), request_code_value);
intent.putExtra(getString(R.string.alarmtext), alarm_title);
intent.putExtra(getString(R.string.alarm_time), newAlarm_Choose_Alarm_Value.getText().toString());
Calendar calNow = Calendar.getInstance();
Calendar calSet = (Calendar) calNow.clone();
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, request_code_value, intent, 0);
calSet.setTimeInMillis(timeInMillis);
if (calSet.compareTo(calNow) <= 0) {
// Today Set time passed, count to tomorrow
calSet.add(Calendar.DATE, 1);
}
alarmManager.set(AlarmManager.RTC_WAKEUP, calSet.getTimeInMillis(), pendingIntent);
清单文件。
<receiver android:name="com.bigbangpartners.YoWakeUp.activities.AlarmReciever" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="AlarmManager_Start" />
</intent-filter>
</receiver>
请帮帮我。
提前致谢。
如果您在 Activity
中以编程方式注册和注销 BroadcastReceiver
,那么以这种方式创建的 BroadcastReceiver
将仅在应用程序存在期间一直存在进程是活的。因此,当您从最近使用的应用程序列表中删除您的应用程序时,这个 BroadcastReceiver
实际上也被销毁了。
另一方面,在清单中注册的 BroadcastReceiver
是 Android 应用程序的全局永久组件,无论应用程序进程是否存在,它都会永远存在。
如果您希望即使应用程序不在前台也能激活闹钟,则需要在应用程序清单中注册 BroadcastReceiver
并指定闹钟操作。你没有这样做,我相信这是你问题的根源。
你应该做什么:
1. 像这样在清单中定义您的 BroadcastReceiver
:
<receiver android:name="com.bigbangpartners.YoWakeUp.activities.AlarmReciever" >
</receiver>
2. 删除应用代码中对 registerReceiver()
和 unRegisterReceiver()
的所有调用,因为不需要。
3. 像这样定义你的闹钟Intent
:
Intent intent = new Intent(this, AlarmReceiver.class);
其余代码保持不变。首先试试这个,看看它是否有效。
这就是我创建闹钟的方式。 当应用程序仍在后台 运行 时,将触发警报。 但是当它从最近的应用程序中清除时,警报就会被丢弃。我正在注册一个新接收器并提供一个独特的操作来区分两个警报。我的代码有没有错误。
String filter_action = "myPackageName" + request_code_value +"_time";
IntentFilter filter = new IntentFilter(filter_action);
registerReceiver(new AlarmReciever(), filter);
Intent intent = new Intent(filter_action);
intent.putExtra(getString(R.string.get_current_intent_value), request_code_value);
intent.putExtra(getString(R.string.alarmtext), alarm_title);
intent.putExtra(getString(R.string.alarm_time), newAlarm_Choose_Alarm_Value.getText().toString());
Calendar calNow = Calendar.getInstance();
Calendar calSet = (Calendar) calNow.clone();
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, request_code_value, intent, 0);
calSet.setTimeInMillis(timeInMillis);
if (calSet.compareTo(calNow) <= 0) {
// Today Set time passed, count to tomorrow
calSet.add(Calendar.DATE, 1);
}
alarmManager.set(AlarmManager.RTC_WAKEUP, calSet.getTimeInMillis(), pendingIntent);
清单文件。
<receiver android:name="com.bigbangpartners.YoWakeUp.activities.AlarmReciever" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="AlarmManager_Start" />
</intent-filter>
</receiver>
请帮帮我。 提前致谢。
如果您在 Activity
中以编程方式注册和注销 BroadcastReceiver
,那么以这种方式创建的 BroadcastReceiver
将仅在应用程序存在期间一直存在进程是活的。因此,当您从最近使用的应用程序列表中删除您的应用程序时,这个 BroadcastReceiver
实际上也被销毁了。
另一方面,在清单中注册的 BroadcastReceiver
是 Android 应用程序的全局永久组件,无论应用程序进程是否存在,它都会永远存在。
如果您希望即使应用程序不在前台也能激活闹钟,则需要在应用程序清单中注册 BroadcastReceiver
并指定闹钟操作。你没有这样做,我相信这是你问题的根源。
你应该做什么:
1. 像这样在清单中定义您的 BroadcastReceiver
:
<receiver android:name="com.bigbangpartners.YoWakeUp.activities.AlarmReciever" >
</receiver>
2. 删除应用代码中对 registerReceiver()
和 unRegisterReceiver()
的所有调用,因为不需要。
3. 像这样定义你的闹钟Intent
:
Intent intent = new Intent(this, AlarmReceiver.class);
其余代码保持不变。首先试试这个,看看它是否有效。