AlarmManager 在应用程序销毁时被杀死
AlarmManager gets killed on app destroy
我有以下问题:我在 onCreate
中注册了我的警报管理器,它现在每分钟执行一次。 但是 如果我通过 Android taskmanager
终止应用程序(因此应用程序状态为 destoyed
),AlarmReceiver
将停止执行。为什么?
我的代码:
报警接收器
public class AlarmReceiver extends WakefulBroadcastReceiver {
private AlarmManager mAlarm;
private PendingIntent mAlarmIntent;
@Override
public void onReceive(Context context, Intent intent) {
Intent service = new Intent(context, PortalPullService.class);
startWakefulService(context, service);
}
public void setAlarm(Context context) {
mAlarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, AlarmReceiver.class);
mAlarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
int interval = context.getResources().getInteger(R.integer.update_interval_in_mins) * 60 * 1000;
mAlarm.setInexactRepeating(
AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime() + interval,
interval,
mAlarmIntent);
ComponentName reciever = new ComponentName(context, AlarmBootReceiver.class);
PackageManager pm = context.getPackageManager();
pm.setComponentEnabledSetting(reciever,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
}
public void cancelAlarm(Context context) {
if(mAlarm != null) {
mAlarm.cancel(mAlarmIntent);
}
ComponentName reciever = new ComponentName(context, AlarmBootReceiver.class);
PackageManager pm = context.getPackageManager();
pm.setComponentEnabledSetting(reciever,
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
}
}
PullService
public class PortalPullService extends IntentService {
private static final String LOG_TAG = "PortalPullService";
public PortalPullService() {
super(LOG_TAG);
}
@Override
protected void onHandleIntent(Intent intent) {
//TODO make request to ** check if new Infos are available, then send notification
Helper.sendNotification(this, "Test", "Testnotification"); //My test if this works
AlarmReceiver.completeWakefulIntent(intent);
}
}
AndroidManifest.xml
<receiver android:name=".PortalUpdate.AlarmReceiver" />
<service
android:name=".PortalUpdate.PortalPullService"
android:exported="false" />
接收者通过new AlarmReceiver().setAlarm(this);
注册
我搜索了几个 SO 问题,但找不到答案...我不知道我的错在哪里...
提前致谢;)
因为PendingIntent
scheduled 是与您的应用关联的令牌,如果应用被强行杀死、停止或休眠,它将被系统删除。当用户再次启动您的应用程序时,您可以在 onResume
或 onCreate
中重新设置它。
好的,在华为上安装调试版本的应用程序是一个问题。
因为您可以在华为中禁用后台服务,并且华为不会将您的应用程序的调试版本识别为正确的应用程序,它会破坏所有服务,可能是出于安全原因...
通过 Play 商店正确安装它很有帮助!
我有以下问题:我在 onCreate
中注册了我的警报管理器,它现在每分钟执行一次。 但是 如果我通过 Android taskmanager
终止应用程序(因此应用程序状态为 destoyed
),AlarmReceiver
将停止执行。为什么?
我的代码:
报警接收器
public class AlarmReceiver extends WakefulBroadcastReceiver {
private AlarmManager mAlarm;
private PendingIntent mAlarmIntent;
@Override
public void onReceive(Context context, Intent intent) {
Intent service = new Intent(context, PortalPullService.class);
startWakefulService(context, service);
}
public void setAlarm(Context context) {
mAlarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, AlarmReceiver.class);
mAlarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
int interval = context.getResources().getInteger(R.integer.update_interval_in_mins) * 60 * 1000;
mAlarm.setInexactRepeating(
AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime() + interval,
interval,
mAlarmIntent);
ComponentName reciever = new ComponentName(context, AlarmBootReceiver.class);
PackageManager pm = context.getPackageManager();
pm.setComponentEnabledSetting(reciever,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
}
public void cancelAlarm(Context context) {
if(mAlarm != null) {
mAlarm.cancel(mAlarmIntent);
}
ComponentName reciever = new ComponentName(context, AlarmBootReceiver.class);
PackageManager pm = context.getPackageManager();
pm.setComponentEnabledSetting(reciever,
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
}
}
PullService
public class PortalPullService extends IntentService {
private static final String LOG_TAG = "PortalPullService";
public PortalPullService() {
super(LOG_TAG);
}
@Override
protected void onHandleIntent(Intent intent) {
//TODO make request to ** check if new Infos are available, then send notification
Helper.sendNotification(this, "Test", "Testnotification"); //My test if this works
AlarmReceiver.completeWakefulIntent(intent);
}
}
AndroidManifest.xml
<receiver android:name=".PortalUpdate.AlarmReceiver" />
<service
android:name=".PortalUpdate.PortalPullService"
android:exported="false" />
接收者通过new AlarmReceiver().setAlarm(this);
我搜索了几个 SO 问题,但找不到答案...我不知道我的错在哪里...
提前致谢;)
因为PendingIntent
scheduled 是与您的应用关联的令牌,如果应用被强行杀死、停止或休眠,它将被系统删除。当用户再次启动您的应用程序时,您可以在 onResume
或 onCreate
中重新设置它。
好的,在华为上安装调试版本的应用程序是一个问题。
因为您可以在华为中禁用后台服务,并且华为不会将您的应用程序的调试版本识别为正确的应用程序,它会破坏所有服务,可能是出于安全原因...
通过 Play 商店正确安装它很有帮助!