0

我想在稍後的時間使用AlarmManager執行一次操作。我跟着代碼和問題here,想出了這個。使用Alarm Manager執行一次任務

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廣播接收器。所以我想出了這個。會發生什麼是我總是得到第一步但從未到達第二步。我做錯了什麼?任何幫助將受到歡迎。

回答

0

的解決方案是(根據您鏈接的線程):

你想要的東西發生了一些時間播出後,你可以啓動一個服務,而該服務等待的時間量,或者如果您想要等待的時間超過幾秒鐘,您應該將此服務的啓動放入AlarmManager,並讓AlarmManager爲您啓動服務。

您的計劃不起作用,因爲上下文在EmailAccountUpdater.onReceive返回後被銷燬。

+0

謝謝。我已經有一個服務在運行。我可以使用AlarmManager在現有服務中運行功能嗎? – user1429322

+0

如果您的服務已經是IntentService,那麼您可以讓它監聽廣播並安排自己的鬧鐘。否則,您可以像這樣與您的服務進行通信:http://stackoverflow.com/a/2463746 – Buddy