使用AlarmManager定期启动IntentService-在某个时刻丢失数据



在我的应用程序中,我希望每十秒钟通过POST将传感器数据发送到Web服务器。我对一个活动执行此操作,该活动启动/停止正在调用IntentService的AlarmMananger

问题是:目标URL是在活动中生成的,并且没有到达IntentService。

活动:

public class MyActivity extends AppCompatActivity  {
    ...
    @Override
    protected void onResume() {
        super.onResume();
        Intent alarmIntent = new Intent(this, AlarmReceiver.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, alarmIntent, 0);
        AlarmManager alarmManager=(AlarmManager) getSystemService(ALARM_SERVICE);
        String targetURL = "www.google.de";
        alarmIntent.putExtra("targetURL", targetURL);
        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 10000, pendingIntent);
    }
    ...
}

广播接收机:

public class AlarmReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String targetURL = intent.getStringExtra("targetURL");
        Intent newintent = new Intent(context, SendPostRequest_Service.class);
        newintent.putExtra("targetURL", targetURL);
        context.startService(newintent);
    }
}

意向服务:

public class SendPostRequest_Service extends IntentService implements SensorEventListener{
    ...
    public SendPostRequest_Service() {
        super(SendPostRequest_Service.class.getName());
    }
    @Override
    protected void onHandleIntent(Intent intent) {
        String targetURL = intent.getStringExtra("targetURL");
        // Problem: targetURL = null
        //read sensors, send POST-Request via okhttp <- working
    }
    ...
}

你有什么建议吗?

将代码放入测试项目中。我唯一能让它发挥作用的方法是改变将额外内容添加到意图中的顺序。使用以下内容更新MyActivty。在G.Blake Meike看来,这是一份正在进行的意图副本。

@Override
protected void onResume() {
    super.onResume();
    Intent alarmIntent = new Intent(this, AlarmReceiver.class);
    String targetURL = "www.google.de";
    alarmIntent.putExtra("targetURL", targetURL);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, alarmIntent, 0);
    AlarmManager alarmManager=(AlarmManager) getSystemService(ALARM_SERVICE);
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 10000, pendingIntent);
}

您需要在BroadcastReceiver中获取唤醒锁,然后在Service中释放它。否则,系统可能会在Service有机会运行之前返回睡眠状态。WakefulReceiver对此特别有用。如果您想了解更多详细信息,这篇文章将有所帮助:http://hiqes.com/android-alarm-ins-outs/

最新更新