【发布时间】:2018-07-18 06:35:13
【问题描述】:
我是初学者 android 程序员。在尝试后台服务和后台数据下载时,我遇到了这个特殊问题:
我正在使用 AlarmManager 来安排重复的后台数据下载。
public void setBackgroundDataService(Context context, long time_in_millis) {
Intent background_service_intent = new Intent(context, BackgroundDataService.class);
background_service_intent.putExtra("value", val);
PendingIntent pending_intent = PendingIntent.getService(context, BACKGROUND_DATA_SERVICE_ID , background_service_intent, PendingIntent.FLAG_UPDATE_CURRENT);
cancelBackgroundServiceAlarmIfExists(context, background_service_intent);
AlarmManager alarm_manager = (AlarmManager) context.getSystemService(ALARM_SERVICE);
alarm_manager.setRepeating(AlarmManager.RTC, (System.currentTimeMillis() + time_in_millis), time_in_millis, pending_intent);
}
public static void cancelBackgroundServiceAlarmIfExists(Context context, Intent intent) {
// try to cancel Pending Intent if exists
try {
PendingIntent pending_intent = PendingIntent.getService(context, BACKGROUND_DATA_SERVICE_ID, intent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarm_manager = (AlarmManager) context.getSystemService(ALARM_SERVICE);
alarm_manager.cancel(pending_intent);
Log.d("DEBUG", "Background service terminated");
} catch (Exception e) {
e.printStackTrace();
}
}
这是来自服务的 onStartCommand():
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d("DEBUG", "Background service invoked");
if (intent == null)
return super.onStartCommand(intent, flags, startId);
Bundle extras = intent.getExtras();
some_value = extras.getString("value");
startDataDownload();
return super.onStartCommand(intent, flags, startId);
}
数据下载在 AsyncTask 中进行
所以问题是: 为什么从应用程序托盘刷应用程序后服务重新启动并且传入参数的意图为空。服务的正常工作依赖于在意图中传递的额外内容。起初我的应用程序会崩溃(通常是 2 次,我假设某些东西试图重新启动它,但是在尝试从 null 意图中获取额外内容时崩溃了)。一段时间后,服务将正常启动并完成其工作而不会崩溃(可能 AlarmManager 在指定时间后以适当的意图重新启动它)。然后偶尔它会再次崩溃。我设法通过检查意图是否为空来避免崩溃。它似乎工作。但问题仍然存在。
为什么在我从应用程序托盘中滑动我的应用程序后,我的服务会重新启动并且 null 意图传递给它。有什么可以做的吗?有没有更好的定期下载数据的方法?
【问题讨论】:
标签: android android-service scheduled-tasks android-pendingintent