AlarmManager和BroadcastReceiver:这是正确的方法吗? (需要每隔X分钟重复一次)

时间:2011-09-19 17:44:55

标签: android service broadcastreceiver alarmmanager

我的应用程序应该将一些数据发送到远程数据库。问题是有时没有可用的互联网连接(例如,没有Wi-Fi和GSM信号)。在这种情况下,我将数据保存在本地存储中,并希望在互联网连接启动时发送它们。

为此,我计划使用AlarmManager和BroadcastReceiver:每隔X分钟调用一次警报并检查接收器中是否有互联网可用。然后,如果互联网可用,我想将延迟数据发送到数据库并删除警报。

在我的主要活动中,我使用此代码设置闹钟

private void setCheckAlarm(){
    alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);

    broadcast_intent = new Intent(Context, SendData.class);
    pendingIntent = PendingIntent.getBroadcast(Context, 0,  broadcast_intent, 0);

    // check for internet every 5 minutes, starting for the first time in 1 minute from now
    // this intervals only for testing and debug purpose
    Calendar now = Calendar.getInstance();
    long triggerAtTime = now.getTimeInMillis()+ (1 * 60 * 1000);   // 1 minute
    long repeat_alarm_every = (1 * 5 * 60 * 1000);                // repeat every 5 minutes
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, triggerAtTime, repeat_alarm_every, pendingIntent);
}

这里是检查互联网和发送数据的接收器

public class SendData extends BroadcastReceiver {
  ConnectivityManager mConnectivity;

  @Override
  public void onReceive(Context context, Intent intent) {
    // if Network connection is OK (Wifi or Mobile) then insert data ...
    mConnectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
    Log.i("SendData", "mConnectivity.getNetworkInfo(0)="+mConnectivity.getNetworkInfo(0));
    Log.i("SendData", "mConnectivity.getNetworkInfo(1)="+mConnectivity.getNetworkInfo(1));
    if ((mConnectivity.getNetworkInfo(0).getState() == NetworkInfo.State.CONNECTED)||( mConnectivity.getNetworkInfo(1).getState() == NetworkInfo.State.CONNECTED)) { 
      Log.i("SendData","Connectivity OK ...");
      // insert data from local storage into remote db
      // maybe using AsyncTask?
      ...
      // when finished remove alarms and exit
      ...
    } else {
      // else exit and wait for next alarm
      Log.i("SendData", "No network connection for the moment... will try again later!");
    }
  };
}

据我了解,另一种可能的方法是使用服务。所以这是我的

问题

  1. 这是正确的做法吗?
  2. 是否可以从接收器中删除警报?如果是,我该怎么做?
  3. 我应该在接收器中使用AsyncTask来发送数据还是可以从主循环中执行此操作?
  4. 谢谢!

1 个答案:

答案 0 :(得分:0)

我会考虑使用同步提供程序。这允许用户全局选择退出数据传输,允许您安排同步但仍允许系统在需要时跳过它(低功耗,无连接等)。

There's a good write up on this here。文档通常很难理解,并且示例包含了基本同步提供程序示例中的其他一些内容(即实现您自己的Auth Provider和扩展Contacts,这两者都不需要,听起来像),但是一旦剥离它降到最低,这是相当简单的。