2016-02-23 3 views
3

У меня есть следующая проблема: я регистрирую диспетчер аварийных сообщений в onCreate, он запускается каждую минуту. Однако, если я убью приложение через Android taskmanager (так что состояние приложения destoyed) AlarmReceiver прекращает выходить. Зачем?AlarmManager убивается при уничтожении приложения

Мой код:

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);

Я искал на sveral SO вопросы, но я не могу найти ответ ... Я не знаю, где моя вина ...

Спасибо advance;)

+0

Да, на моем Huawei его убивают ... –

+3

«Однако, если я убью приложение с помощью диспетчера задач Android», возможно, Huawei изменил диспетчер задач, чтобы сделать принудительный останов вместо обычного завершения процесса. Если это так, вы ничего не можете с этим поделать. Вы можете использовать 'adb shell dumpsys alarm' для проверки ваших запланированных аварийных сигналов до и после того, что вы делаете, чтобы« убить приложение ». – CommonsWare

+0

@CommonsWare, но мои службы WhatsApp не уничтожаются. Значит, этого не может быть, или я ошибаюсь? –

ответ

1

Хорошо, что проблема заключается в установке отладочной версии вашего приложения на Huawei.

Потому что вы можете отключить фоновые службы в Huawei и Huawei не распознает отладочную версию приложения в качестве надлежащего приложения, оно уничтожает все услуги, может быть причиной соображений безопасности ...

Установки его правильно над Play Store помогает!

0

Поскольку запланированный PendingIntent - это токен, связанный с вашим приложением, и если приложение принудительно убито, остановлено или спящий, оно будет удалено системой. Вы можете установить его снова в onResume или onCreate, когда пользователь снова запустит ваше приложение.

+0

, но если я хочу службу, которая проверяет каждую минуту об обновлении, даже если приложение будет уничтожено, как я могу справиться с этим? (Е.g WhatsApp) –

+0

Являются ли УСЛУГИ убитыми, когда пользователь удаляет приложение в коммутаторе приложений или только когда он переходит к настройкам> диспетчер приложений и закрывает приложение там. –

+1

. Отключение приложения из последних задач не прекратит работу службы снова, если используется START_STICKY. Если вы используете приложение-убийца задачи или спящий режим, служба остановится. Служба Whatsapp также останавливается, когда он находится в спящем режиме или «убит». – Piyush

Смежные вопросы