使用 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);
}
在我的应用程序中,我想通过 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);
}