Android 在后台间隔调用web服务

Android 在后台间隔调用web服务,android,Android,应用程序需要每隔30分钟或在后台手动从服务器同步数据。结果保存到本地数据库。同步完成后,我想提醒活动/片段。。。并在需要时强制更新列表。有很多活动,所以我想把它移到活动之外,使它更加一致 现在我创建了AsyncTask,它从服务器获取结果并保存到DB 我应该用什么?广播接收器、服务、报警管理器 更新 根据答案,我在应用程序中启动警报 AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVI

应用程序需要每隔30分钟或在后台手动从服务器同步数据。结果保存到本地数据库。同步完成后,我想提醒活动/片段。。。并在需要时强制更新列表。有很多活动,所以我想把它移到活动之外,使它更加一致

现在我创建了AsyncTask,它从服务器获取结果并保存到DB

我应该用什么?广播接收器、服务、报警管理器

更新

根据答案,我在应用程序中启动警报

AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, AlarmReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
manager.setInexactRepeating(AlarmManager.RTC, 0, AlarmManager.INTERVAL_HALF_HOUR, pendingIntent);
创建接收器

创建IntentService

以及AndroidManifest中的注册接收人和服务


我在哪里以及如何在活动/片段中通知同步完成?

我将使用AlarmManager并注册广播接收器。一旦接收器启动,我将启动一个IntentService在后台下载数据

配置您的闹钟:

    AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(context, MyBroadcast.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);

    manager.setInexactRepeating(AlarmManager.RTC, 0, AlarmManager.INTERVAL_HALF_HOUR, pendingIntent);
创建一个BroadcastReceiver,当警报响起时会收到通知。请注意,我使用的是a,以便在同步时设备不会进入睡眠状态

class MyBroadcast extends WakefulBroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {

        Intent syncIntent = new Intent();
        syncIntent.setClass(context, DataSyncer.class);
        startWakefulService(context, syncIntent);
    }
}
接下来,将在后台下载数据的IntentService:

class DataSyncer extends IntentService{

    ...

    @Override
    protected void onHandleIntent(Intent intent) {
       //sync data
       MyBroadcast.completeWakefulIntent(intent);
    }

}
更新:
现在您已经同步了数据,有几个选项可以通知活动和片段。您可以使用LocalBroadcastManager进行广播。查看链接了解更多详细信息。

我将使用AlarmManager并注册广播接收器。一旦接收器启动,我将启动一个IntentService在后台下载数据

配置您的闹钟:

    AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(context, MyBroadcast.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);

    manager.setInexactRepeating(AlarmManager.RTC, 0, AlarmManager.INTERVAL_HALF_HOUR, pendingIntent);
创建一个BroadcastReceiver,当警报响起时会收到通知。请注意,我使用的是a,以便在同步时设备不会进入睡眠状态

class MyBroadcast extends WakefulBroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {

        Intent syncIntent = new Intent();
        syncIntent.setClass(context, DataSyncer.class);
        startWakefulService(context, syncIntent);
    }
}
接下来,将在后台下载数据的IntentService:

class DataSyncer extends IntentService{

    ...

    @Override
    protected void onHandleIntent(Intent intent) {
       //sync data
       MyBroadcast.completeWakefulIntent(intent);
    }

}
更新:
现在您已经同步了数据,有几个选项可以通知活动和片段。您可以使用LocalBroadcastManager进行广播。查看链接了解更多详细信息。

使用AlarmManager以30分钟的间隔触发PendingEvent,启动IntentService进行下载

Intent intent = new Intent(context, PollingService.class);
PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, 0);

AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
alarmManager.setInexactRepeating(
                AlarmManager.RTC,
                System.currentTimeMillis(),
                AlarmManager.INTERVAL_HALF_HOUR,
                pendingIntent
);
当IntentService更新完您的数据后,它可以发送您的活动/片段已注册以侦听的广播,以通知它新数据并刷新其视图

sendBroadcast(new Intent("DATA_UPDATED"));
在你的片段中

getActivity().registerReceiver(new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            //update UI
        }
    }, new IntentFilter("DATA_UPDATED"));

使用AlarmManager以30分钟的间隔触发PendingEvent,启动IntentService进行下载

Intent intent = new Intent(context, PollingService.class);
PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, 0);

AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
alarmManager.setInexactRepeating(
                AlarmManager.RTC,
                System.currentTimeMillis(),
                AlarmManager.INTERVAL_HALF_HOUR,
                pendingIntent
);
当IntentService更新完您的数据后,它可以发送您的活动/片段已注册以侦听的广播,以通知它新数据并刷新其视图

sendBroadcast(new Intent("DATA_UPDATED"));
在你的片段中

getActivity().registerReceiver(new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            //update UI
        }
    }, new IntentFilter("DATA_UPDATED"));

我在哪里配置报警?在BroadcastReceiver和add to manifest中,还是在启动应用程序后的第一个活动中?我更喜欢在应用程序类中配置警报。您可以在“活动”中对其进行配置,但由于您的“活动”可以在配置更改时重新创建,因此您可能会经常设置警报。是的,您应该在清单中注册BroadcastReceiver。因此,我尝试在代码和清单中注册服务和BroadcastReceiver,但其调用仅一次或两次,也许我应该定义intent filter或什么错误:/&@WindsurferOak我也有同样的问题,我有一个用例,其中我必须在后台进行webservice调用,哪一个应该无限期或在某个时间间隔内调用,并显示更新有通知,单击通知会打开应用程序并显示更新的列表..我浏览了这篇文章,但我得到的信息是否足以满足我的用例?我在哪里配置报警?在BroadcastReceiver和add to manifest中,还是在启动应用程序后的第一个活动中?我更喜欢在应用程序类中配置警报。您可以在“活动”中对其进行配置,但由于您的“活动”可以在配置更改时重新创建,因此您可能会经常设置警报。是的,您应该在清单中注册BroadcastReceiver。因此,我尝试在代码和清单中注册服务和BroadcastReceiver,但其调用仅一次或两次,也许我应该定义intent filter或什么错误:/&@WindsurferOak我也有同样的问题,我有一个用例,其中我必须在后台进行webservice调用,哪一个应该无限期地或在某个时间间隔内呼叫,并显示更新有通知,单击通知会打开应用程序并显示更新的列表..我浏览了这篇文章,但我得到的信息是否足以满足我的用例?我更新了问题,你的回答帮助了我,但你在活动/片段中注册了接收者。。。所以注意活动/片段的唯一方法是创建内部类并在那里注册?或者我可以在a/f之外创建接收器?Sry为nooby提问,但我在使用接收器和服务时仍然感到困惑。您可以创建应用程序范围的接收器,但如果您的活动/片段与之相关,以便它可以更新UI,您将希望它注册广播
事件可能在onResume方法中。在onPauseI更新的问题中,您的回答帮助了我,但您在活动/片段中注册了接收者。。。所以注意活动/片段的唯一方法是创建内部类并在那里注册?或者我可以在a/f之外创建接收器?Sry为nooby提问,但我在使用接收器和服务时仍然感到困惑。您可以创建应用程序范围的接收器,但如果您的活动/片段是关心它的事情,以便它可以更新UI,您将希望它注册为广播事件。可能在onResume方法中。并在onPause中注销