重新启动手机后服务停止

时间:2014-07-12 18:36:47

标签: android

我有一个从AlarmManager设置运行的服务,定期记录传感器数据。

我遇到一个问题,每次启动/运行应用程序时,打开应用程序都会在onCreate中执行该服务。所以我实现了以下内容以确保它只在它的间隔运行:

        Intent intent = new Intent(getApplicationContext(), Service.class );
        AlarmManager scheduler = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        //Boolean to see if alarm is already set:
        alarmUp = (PendingIntent.getBroadcast(getApplicationContext(), 0, intent, PendingIntent.FLAG_NO_CREATE) != null);
        //make pending intent to schedule
        PendingIntent scheduledIntent = PendingIntent.getService(getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

        if (runOnce == false){

            if (!alarmUp){
                Log.d("alarmUp", "= false");
                scheduler.setInexactRepeating(AlarmManager.RTC_WAKEUP, 900000, 900000, scheduledIntent);
            }
                runOnce = true;
                    SharedPreferences.Editor editor = prefs.edit();                         
                    editor.putBoolean(RUN_ONCE, runOnce);
                    editor.commit();            
        }               
        //Alarm Manager schedule Start Service:
        if (alarmUp){
            Log.d("alarmUp", "= true");
            // 15 min intervals = 900000
            //scheduler.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 900000, scheduledIntent);
            scheduler.setInexactRepeating(AlarmManager.RTC_WAKEUP, 900000, 900000, scheduledIntent);
        }

我引入了runOnce布尔值,因为getBroadcast要么总是在运行服务,要么在全新安装应用程序时根本不启动它。这是解决方案,但会导致出现新问题 - 打开和关闭设备后,服务将无法再次启动。

我该如何解决这个问题?我可以找到另一种方法来启动服务,而不会太频繁地运行,或者检查设备上次关闭时重置runOnce布尔值?

感谢您的任何建议。

1 个答案:

答案 0 :(得分:2)

  

我该如何解决这个问题?

使用ACTION_BOOT_COMPLETED BroadcastReceiver重启后重新安排闹钟,如this sample project所示。 AlarmManager预定事件在重启后无法生存,因此您必须自己重新建立它们。

顺便说一句,我建议您在上面显示的代码中用getApplicationContext()替换this。当您知道为什么在特定情况下应该使用getApplicationContext()时,才使用getApplicationContext()