Android 启动时启动服务并重复

Android 启动时启动服务并重复,android,alarm,Android,Alarm,我试图做一些自动谷歌硬盘备份(上传文件)计时器,但我不能设置具体时间,即使我设置为5秒(测试purpouse,它只运行每1分钟一次),当用户重新启动手机时,它只运行一次(警报没有调用=/,因此应用程序必须在启动后打开一次) 清单配置: <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.R

我试图做一些自动谷歌硬盘备份(上传文件)计时器,但我不能设置具体时间,即使我设置为5秒(测试purpouse,它只运行每1分钟一次),当用户重新启动手机时,它只运行一次(警报没有调用=/,因此应用程序必须在启动后打开一次)

清单配置:

    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

<application...>

 <receiver
            android:name=".Tools.AutoBackupAlarmBroadCast"
            android:process=":remote" >

            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>

        <service
            android:name=".Tools.AutoBackupService"
            android:exported="false" />


</application>
确保AutoBackupAlarm在引导时被调用,但它只发生一次,我需要它在用户设置的时间内启动触发器以重复(将从共享首选项中获取)

服务:

自动备份服务:

public class AutoBackupService extends IntentService {
    /**
     * Creates an IntentService.  Invoked by your subclass's constructor.
     *
     */
    public AutoBackupService() {
        super("AutoBackup");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        WakefulBroadcastReceiver.completeWakefulIntent(intent);
//HERE i must start the Async to make the GoogleDrive Backup
//the next doubt will be how can i get sharedpreferences and activity to pass to the async from HERE?

        Log.d("BACKUP", "AutoBackupLogTest");
    }
}
广播

public class AutoBackupAlarmBroadCast extends BroadcastReceiver {
    public static final int REQUEST_CODE = 12345;
    @Override
    public void onReceive(Context context, Intent intent) {
        Intent i = new Intent(context, AutoBackupService.class);
        i.putExtra("foo", "bar");
        context.startService(i);
    }
}
调用onCreate的AlarmFunction,几乎可以按照我的要求工作,它不能像下面的时间那样每5秒重复一次,它只能每1分钟显示一次

   public void scheduleAlarm() {
        // Construct an intent that will execute the AlarmReceiver
        Intent intent = new Intent(getApplicationContext(), AutoBackupAlarmBroadCast.class);
        // Create a PendingIntent to be triggered when the alarm goes off
        final PendingIntent pIntent = PendingIntent.getBroadcast(this, AutoBackupAlarmBroadCast.REQUEST_CODE,
                intent, PendingIntent.FLAG_UPDATE_CURRENT);
        // Setup periodic alarm every 5 seconds
        long firstMillis = System.currentTimeMillis(); // alarm is set right away
        AlarmManager alarm = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
        // First parameter is the type: ELAPSED_REALTIME, ELAPSED_REALTIME_WAKEUP, RTC_WAKEUP
        // Interval can be INTERVAL_FIFTEEN_MINUTES, INTERVAL_HALF_HOUR, INTERVAL_HOUR, INTERVAL_DAY
        alarm.setInexactRepeating(AlarmManager.RTC_WAKEUP, firstMillis,
                1 * 5 * 1000, pIntent);
    }

请尝试以下代码,在特定时间间隔后重复此任务

    boolean alarmUp = (PendingIntent.getBroadcast(this, 444, new Intent(this, AlarmReceiver.class), PendingIntent.FLAG_NO_CREATE) != null);

    if(!alarmUp){

        AlarmManager alarmManager = (AlarmManager)this.getSystemService(Context.ALARM_SERVICE);
        Intent DataSyncIntent = new Intent(this, AlarmReceiver.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 444, DataSyncIntent, 0);

        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, SystemClock.elapsedRealtime(),
                15 * 60000, // 60000 = 1 minute,
                pendingIntent);

    }
如果您在棒棒糖或更高版本上测试应用程序,AFAIK setInexactRepeating()不保证在固定的时间间隔内报警/触发。
    boolean alarmUp = (PendingIntent.getBroadcast(this, 444, new Intent(this, AlarmReceiver.class), PendingIntent.FLAG_NO_CREATE) != null);

    if(!alarmUp){

        AlarmManager alarmManager = (AlarmManager)this.getSystemService(Context.ALARM_SERVICE);
        Intent DataSyncIntent = new Intent(this, AlarmReceiver.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 444, DataSyncIntent, 0);

        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, SystemClock.elapsedRealtime(),
                15 * 60000, // 60000 = 1 minute,
                pendingIntent);

    }