使用Alarm Manager执行一次任务

时间:2015-10-30 17:55:15

标签: android android-intent broadcastreceiver alarmmanager android-pendingintent

我正在尝试使用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,在BroadcastReceiver中使用postDelayed和Thread.sleep是不可取的。所以我想出了这个。发生的事情是我总是得到第1步但从未到达第2步。我做错了什么?欢迎任何帮助。

1 个答案:

答案 0 :(得分:0)

解决方案是(根据您链接的主题):

  

你希望在广播后的某个时间发生一些事情,你可以开始服务,并且该服务等待一段时间,或者如果你想要等待的时间长于几秒,你应该把在AlarmManager中启动此服务,让AlarmManager为您启动服务。

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