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