即使应用程序关闭,也会每隔90秒在android中定期调用一次

时间:2016-10-20 07:12:52

标签: android performance

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

5 个答案:

答案 0 :(得分:4)

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

  

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

答案 1 :(得分:1)

报警管理器将是您的理想选择。设备处于睡眠状态时会保留已注册的警报,但如果已关闭并重新启动,则会清除此警报。 因此,您可以使用它以90秒的间隔运行您的工作。它可能仅在设备重新启动后第一次中断间隔。

答案 2 :(得分:1)

我发现的另一种方法是使用Firebase作业调度程序。对于在棉花糖上运行或进一步运行的设备,这是最佳选择。它易于集成和定制。 https://github.com/firebase/firebase-jobdispatcher-android

答案 3 :(得分:0)

  

服务是一个可以执行长时间运行的应用程序组件   在后台运行并且不提供用户界面。

https://developer.android.com/guide/components/services.html

  

警报管理器适用于您想要的情况   应用程序代码在特定时间运行,即使您的应用程序是   目前没有运行。   只要报警,报警管理器就会保持CPU唤醒锁定   接收者的onReceive()方法正在执行。这保证了   在完成广播处理之后,手机才会睡眠。

https://developer.android.com/reference/android/app/AlarmManager.html

使用该服务。

答案 4 :(得分:0)

您使用Intent服务和Broadcastreceiver组件,因为即使您关闭应用程序,这些组件也只能连续监听。

你希望得到一些90秒的东西,所以使用Alarm Manager。

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);

您的Receiver类喜欢这个

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
    }

}

您还应该实例化警报管理器启动。

相关问题