Android 使用报警管理器执行一次任务

Android 使用报警管理器执行一次任务,android,android-intent,broadcastreceiver,alarmmanager,android-pendingintent,Android,Android Intent,Broadcastreceiver,Alarmmanager,Android Pendingintent,我尝试稍后使用AlarmManager执行一次操作。我按照代码和问题提出了这个 public class EmailAccountUpdater extends BroadcastReceiver { // Constructors public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(AccountManager.LOGIN_ACCOUNTS_

我尝试稍后使用AlarmManager执行一次操作。我按照代码和问题提出了这个

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>
但根据,不建议在BroadcastReceiver中使用postDelayed和Thread.sleep。所以我想到了这个。发生的事情是我总是得到第一步,但从来没有达到第二步。我做错了什么?欢迎提供任何帮助。

解决方案是(根据您链接的线程):

如果您希望在广播后的某个时间发生某些事情,您可以启动一项服务,并且该服务需要等待一定的时间,或者如果您希望等待的时间超过几秒钟,您应该将此服务的启动放在AlarmManager中,让AlarmManager为您启动服务

您的计划不起作用,因为在
EmailAccountUpdater.onReceive
返回后上下文被破坏。

解决方案是(根据您链接的线程):

如果您希望在广播后的某个时间发生某些事情,您可以启动一项服务,并且该服务需要等待一定的时间,或者如果您希望等待的时间超过几秒钟,您应该将此服务的启动放在AlarmManager中,让AlarmManager为您启动服务


您的计划不起作用,因为在
EmailAccountUpdater.onReceive
返回后上下文被破坏。

谢谢。我已经有一个服务在运行。我可以使用AlarmManager在现有服务中运行功能吗?如果您的服务已经是IntentService,那么您可以让它监听广播并安排自己的警报。否则,您可以像这样与您的服务沟通:谢谢。我已经有一个服务在运行。我可以使用AlarmManager在现有服务中运行功能吗?如果您的服务已经是IntentService,那么您可以让它监听广播并安排自己的警报。否则,您可以通过以下方式与您的服务进行通信:
Thread.sleep(35000);
onAccountsUpdated();