0

Я пытаюсь выполнить действие один раз в более позднее время с помощью AlarmManager. Я выполнил код и вопрос here и придумал это.Использование диспетчера аварийных сигналов для выполнения задачи после

public class EmailAccountUpdater extends BroadcastReceiver 
{ 
    // Constructors 

    public void onReceive(Context context, Intent intent) 
    { 
     if (intent.getAction().equals(AccountManager.LOGIN_ACCOUNTS_CHANGED_ACTION)) 
     { 
      Log.v("Test", " Step 1 - Creating the alarm "); 
      // Place holder 
      AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
      Intent newIntent = new Intent("com.test.EMAIL_ACCOUNTS_CHANGED"); 
      PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, newIntent, PendingIntent.FLAG_CANCEL_CURRENT); 
      alarmManager.set(AlarmManager.RTC_WAKEUP, 35000, pendingIntent); 
     } 
    } 
} 

AlarmReceiver.java

public class AlarmReceiver extends BroadcastReceiver 
{ 
    // constructors 

    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     Log.v("Test","Step 2 - Alarm received"); 
     if (intent.getAction().equals("com.test.EMAIL_ACCOUNTS_CHANGED")) 
     { 
      onAccountsUpdated(); 
     } 
    } 

    public void onAccountsUpdated() 
    { 
     // do something 
    } 
} 

В manifestManifest.xml

<receiver android:name="full.path.AlarmReceiver"> 
     <intent-filter> 
      <action android:name="com.test.EMAIL_ACCOUNTS_CHANGED"/> 
     </intent-filter> 
</receiver> 

В основном то, что я хотел сделать, это поставить следующее подстановку (чуть ниже первого оператора журнала) ,

Thread.sleep(35000); 
onAccountsUpdated(); 

Но согласно this, не внушаемы использовать postDelayed и Thread.sleep в BroadcastReceiver. Поэтому я придумал это. Что происходит, я всегда получаю шаг 1, но никогда не достигаю шага 2. Что я делаю неправильно? Любая помощь приветствуется.

ответ

0

Решение (по резьбе вы связаны):

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

Ваш план не работает, потому что контекст уничтожается после возвращения EmailAccountUpdater.onReceive.

+0

Спасибо. У меня уже есть сервис. Могу ли я использовать AlarmManager для запуска функции в существующей службе? – user1429322

+0

Если ваш сервис уже является IntentService, тогда вы можете просто прослушать его и назначить собственный будильник. В противном случае вы можете связаться со своим сервисом следующим образом: http://stackoverflow.com/a/2463746 – Buddy

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