使用 AlarmManager 定期启动 IntentService - 在特定时间点丢失数据

Starting IntentService periodically with AlarmManager - Losing Data at certain point

在我的应用程序中,我想通过 POST 每十秒向网络服务器发送一次传感器数据。 我正在与一个 activity starts/stopps 一个正在调用 IntentService 的 AlarmMananger 一起执行此操作。

问题是:目标 URL 在 Activity 中生成,并没有到达 IntentService。

Activity:

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
    }
    ...
}

你有什么建议吗?

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

将您的代码放入测试项目中。我能够让它工作的唯一方法是更改​​将额外内容添加到意图中的顺序。使用以下内容更新 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);

}