2016-12-29 5 views
1

У меня есть AlarmManager, который показывает Toast каждые 10 мин., Но когда os убивают приложения в фоновом режиме, поэтому мой AlarmManager больше не работает. что мне нужно сделать?Мой диспетчер аварийных сообщений убит после моего приложения, убитого в android

public class MyReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context con, Intent arg1) { 
     Global.ShowMessage(con, Global.GetCurrentDateTime()); 

    } 
} 

В Manifest.xml:

<receiver android:name=".MyReceiver" > </receiver> 

в главном Activity:

AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE); 

     Calendar cal = Calendar.getInstance(); 
     cal.add(Calendar.SECOND, 10); 

     long time = cal.getTimeInMillis(); 

     Intent i = new Intent(this, MyReceiver.class); 

     PendingIntent pi = PendingIntent.getBroadcast(this, 9854, i, PendingIntent.FLAG_UPDATE_CURRENT); 

     // am.set(AlarmManager.RTC_WAKEUP,time,pi); 

     am.setInexactRepeating(AlarmManager.RTC_WAKEUP, time, 600 * 1000, pi); 
+0

Поскольку это связано с основной нитью, это нормально. Вам нужно будет использовать Службу, у которой больше шансов пережить какой-то клик системы, но без уверенности. – AxelH

+0

В декларации манифеста получателя вам нужны 'android: enabled =" true "и' android: exported = "true" ' –

+0

@ nickfriskel У вас есть для этого источник? Я всегда думал, что «exported» использовался для того, чтобы сущность была видима другим приложением и была включена. IT не имеет никакого отношения к некоторому системному сигналу уничтожения, чтобы восстановить некоторую память. – AxelH

ответ

-2

Дозапись этот код в манифеста.

<receiver android:name=".MyReceiver" 
       android:enabled="true" 
       android:exported="true"> 

       <intent-filter> 
        <action android:name="android.intent.action.BOOT_COMPLETED" /> 
       </intent-filter> 

      </receiver> 
+0

Это приведет к запуску приложения только при загрузке (а не для каждого устройства). Не после сигнала о сбое от системы, чтобы получить некоторую память – AxelH

+0

Нет, я так не думал. Я использую диспетчер аварийных сообщений в качестве напоминания. и он работает нормально. –

+2

Вы понимаете код, который у вас есть? Действие 'BOOT_COMPLETED' здесь, чтобы создать приемник в этом действии, это действие отправляется при запуске устройства (некоторые устройства используют разные действия). Но это не помешает системе убить приложение и ссылку получателя. Если вы не можете предоставить некоторый источник, который показывает, что я ошибаюсь (что всегда возможно;) – AxelH

1

Из официального documentation on the lifecycle

Система никогда не убивает деятельность непосредственно. Вместо этого он убивает процесс, в котором выполняется действие, уничтожая не только активность, но и все остальное, запущенное в этом процессе.

Но вы можете создать Service, который не будет убит с помощью Activity. Чтобы быть более конкретным, вы хотите службы, которые работают на переднем плане, это не будет убит системой, как указано в Services documentation

Для конкретного примера, я предпочитаю, чтобы Google поможет вам с этим [например] (https://developer.android.com/reference/android/app/Service.html#startForeground(int , android.app.Notification)).

+0

Я звоню менеджеру alaram в мой mainActivity.is это из-за этого? –

+0

startForeground показать уведомление о том, что idont хочет, чтобы –

+0

@mn. Для первого комментария, да, это ссылка на Activity, поэтому он будет уничтожен. Для этого уведомления необходимо сохранить службу (и уведомить пользователя о том, что она жива). Вы можете создать фоновое обслуживание, но его можно убить, как активировать. – AxelH

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