Android 每90秒在安卓系统中进行一次定期呼叫,即使在应用程序关闭时也是如此

Android 每90秒在安卓系统中进行一次定期呼叫,即使在应用程序关闭时也是如此,android,performance,Android,Performance,要求是每90秒记录一次位置,并将其写入数据库(sqlite),如果网络可用,则调用api,即使应用程序已关闭。 实现这一目标的最佳方式是什么? 我应该启动意向服务吗?或者我应该找一个闹钟管理员。我在某个地方读到,只有在持续时间超过10分钟时,才应使用报警管理器 服务是可以执行长时间运行的应用程序组件 在后台操作,不提供用户界面 报警管理器适用于您希望 应用程序代码在特定时间运行,即使您的应用程序 当前未运行。 报警管理器保持CPU唤醒锁,直到报警结束 接收方的onReceive()方法正在执行

要求是每90秒记录一次位置,并将其写入数据库(sqlite),如果网络可用,则调用api,即使应用程序已关闭。 实现这一目标的最佳方式是什么? 我应该启动意向服务吗?或者我应该找一个闹钟管理员。我在某个地方读到,只有在持续时间超过10分钟时,才应使用报警管理器

服务是可以执行长时间运行的应用程序组件 在后台操作,不提供用户界面

报警管理器适用于您希望 应用程序代码在特定时间运行,即使您的应用程序 当前未运行。 报警管理器保持CPU唤醒锁,直到报警结束 接收方的onReceive()方法正在执行。这保证了 在您处理完广播之前,手机不会休眠

随服务一起去

服务是可以执行长时间运行的应用程序组件 在后台操作,不提供用户界面

报警管理器适用于您希望 应用程序代码在特定时间运行,即使您的应用程序 当前未运行。 报警管理器保持CPU唤醒锁,直到报警结束 接收方的onReceive()方法正在执行。这保证了 在您处理完广播之前,手机不会休眠


使用该服务。

我建议使用AlarmManager,因为即使设备处于睡眠状态,它也可以运行。 请注意,对于API v>19,警报传递是不精确的,您必须使用setExact API来实现这一点。 看

注意:从API 19开始,传递给此方法的触发时间被视为不精确:在此时间之前不会发出警报,但可能会延迟并在一段时间后发出。操作系统将使用此策略,以便在整个系统中一起“批量”报警,最大限度地减少设备需要“唤醒”的次数,并最大限度地减少电池的使用。一般来说,只要警报安排在遥远的将来,在不久的将来安排的警报不会延迟。 在新的批处理策略下,交货订单保证不像以前那样强大。如果应用程序设置了多个警报,则这些警报的实际交付顺序可能与其请求的交付时间顺序不匹配。如果您的应用程序有很强的排序需求,那么您可以使用其他API来获得必要的行为;请参见设置窗口(int,long,long,pendingent)和设置精确窗口(int,long,pendingent)


我建议使用AlarmManager,因为即使设备处于休眠状态,它也可以运行。 请注意,对于API v>19,警报传递是不精确的,您必须使用setExact API来实现这一点。 看

注意:从API 19开始,传递给此方法的触发时间被视为不精确:在此时间之前不会发出警报,但可能会延迟并在一段时间后发出。操作系统将使用此策略,以便在整个系统中一起“批量”报警,最大限度地减少设备需要“唤醒”的次数,并最大限度地减少电池的使用。一般来说,只要警报安排在遥远的将来,在不久的将来安排的警报不会延迟。 在新的批处理策略下,交货订单保证不像以前那样强大。如果应用程序设置了多个警报,则这些警报的实际交付顺序可能与其请求的交付时间顺序不匹配。如果您的应用程序有很强的排序需求,那么您可以使用其他API来获得必要的行为;请参见设置窗口(int,long,long,pendingent)和设置精确窗口(int,long,pendingent)


您使用的是Intent service和Broadcastreceiver组件,因为即使关闭应用程序,这些组件也只会持续侦听

如果你想每90秒都得到一些东西,那么就使用报警管理器

AlarmManager manager = (AlarmManager) (context)
                .getSystemService(Context.ALARM_SERVICE);
        Intent alarmIntent = new Intent(context, YourAlarmReceuver.class);

        //alarmIntent.putExtra("syncData", favoritesArrayList);


        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0,
                alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);
        manager.setInexactRepeating(AlarmManager.RTC_WAKEUP,
                System.currentTimeMillis(), 90*1000, pendingIntent);
你的接受器是这样的

public class SyncAlarmReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

      Intent stIntent = new Intent(context,
                    YourService.class);
        context.startService(stIntent);

       }
你的服务课是这样的吗

public class DataSyncService extends IntentService {


    public DataSyncService() {
        super(DataSyncService.class.getName());
        // TODO Auto-generated constructor stub
    }

@Override
    protected void onHandleIntent(Intent intent) {

         //write your logic here 
        // get the location and update the database
    }

}

您还应实例化alarm manager引导已完成。

使用Intent service和Broadcastreceiver componenst,因为即使关闭应用程序,这些组件也只能持续侦听

如果你想每90秒都得到一些东西,那么就使用报警管理器

AlarmManager manager = (AlarmManager) (context)
                .getSystemService(Context.ALARM_SERVICE);
        Intent alarmIntent = new Intent(context, YourAlarmReceuver.class);

        //alarmIntent.putExtra("syncData", favoritesArrayList);


        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0,
                alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);
        manager.setInexactRepeating(AlarmManager.RTC_WAKEUP,
                System.currentTimeMillis(), 90*1000, pendingIntent);
你的接受器是这样的

public class SyncAlarmReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

      Intent stIntent = new Intent(context,
                    YourService.class);
        context.startService(stIntent);

       }
你的服务课是这样的吗

public class DataSyncService extends IntentService {


    public DataSyncService() {
        super(DataSyncService.class.getName());
        // TODO Auto-generated constructor stub
    }

@Override
    protected void onHandleIntent(Intent intent) {

         //write your logic here 
        // get the location and update the database
    }

}

您还应该实例化alarm manager引导完成。

alarm manager将是适合您情况的理想选择。注册的报警在设备处于休眠状态时保留,但在关闭并重新启动时将被清除。
因此,您可以使用它在90秒内运行作业。它可能仅在设备重新启动后的第一次中断间隔。

报警管理器将是适合您情况的理想选择。注册的报警在设备处于休眠状态时保留,但在关闭并重新启动时将被清除。
因此,您可以使用它在90秒内运行作业。它可能仅在设备重新启动后第一次中断间隔。

我发现的另一种方法是使用Firebase作业调度器。这是运行在棉花糖或更高版本上的设备的最佳选择。它易于集成和定制。

我发现的另一种方法是使用Firebase作业调度器。这是运行在棉花糖或更高版本上的设备的最佳选择。它易于集成和定制。

使用已启动的服务您可以尝试使用正常的服务和处理程序。处理程序每90秒执行一次必要的任务,如果使用“START_STICKY”标志启动,则处理程序可能位于将在后台运行的服务内部;使用已启动的服务您可以尝试使用普通服务和处理程序。惠尔