如何在安卓5.1上每5秒运行一次后台服务?

4

我需要每5秒调用一个后台服务,但在Android 5.1(棒棒糖)中遇到了问题:它自动将间隔时间视为1分钟。

请帮助我每5秒运行一个后台服务。


展示一下你目前已经做了什么,这样我们才能提供指导。 - Jonathan
Intent i = new Intent(this, BLEAutoSync.class); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, PendingIntent.FLAG_UPDATE_CURRENT); AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE); am.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(),5000, pi);在上述代码中,“INTERVAL_TIMER”为5000毫秒。但在Android 5.1中,它会自动变成一分钟。因此,我的服务每隔一分钟就会被调用一次。而在其他版本的Android中,它可以完美地每隔5秒运行我的服务。 - Monika Patel
编辑您的问题,将代码放在问题中,而不是注释中。 - tumultous_rooster
1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - ianhanniballake
对不起,Matt O'Brien。下次会注意的。ianhanniballake: 我想要在后台扫描 BLE 并自动同步时间。这取决于用户。目前有一个用户尝试每 5 秒后台扫描 BLE。但在 Android 5.1 上无法工作。 - Monika Patel
每5秒运行一次,5分钟后电池耗尽。你试过使用IntentService在被杀死之前重新启动自己吗? - Deividi Cavarzan
3个回答

6

由于在Android 5.1上,闹钟的最小间隔为一分钟,因此您可以调整服务以每5秒重复执行任务:

public class MyService extends Service {
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
    @Override
    public void onCreate() {
        super.onCreate();
    }
    @Override
    public void onDestroy(){
        super.onDestroy();
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                startJob();
            }
        });
        t.start();
        return START_STICKY;
    }
    private void startJob(){
        //do job here

        //job completed. Rest for 5 second before doing another one
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        //do job again
        startJob();
    }
}

上述代码确保在执行另一个作业之前完成一个作业,因此这是一种更清洁的方法。但是,如果您的要求不需要确保在执行另一个作业之前完成一个作业,则可以使用以下代码:
public class MyService extends Service {
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public void onDestroy(){
        super.onDestroy();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                while(true){
                    startJob();
                    Thread.sleep(5000);
                }

            }
        });
        t.start();
        return START_STICKY;
    }
    private void startJob(){
        //do job here
    }
}

最后,您可以通过从活动线程调用startService();来启动服务。这样,您就可以绕过AlarmManager的限制。希望这有所帮助...


4

0

我看不出有什么问题

要么让服务一直运行并等待5秒钟处理新任务

要么每分钟启动一个线程,每5秒钟执行您想要的任务...并在一分钟后停止,也许只需杀死、初始化新线程并立即启动它


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接