Android 循环服务?

Android Service with a loop?

我需要创建一个通过两个按钮启动和停止的后台服务。我的服务每 5 分钟循环一次,它会从在线数据库中获取数据。我在某处读到 IntentService class 不用于循环。我会重写 onStartCommand,这样它就会 return START_STICKY。如果我在 class 中这样做,我的服务不会启动。我该怎么做?

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void start(View view){
        startService(new Intent(this, ForegroundService.class));
    }

    public void stop(View view){
        stopService(new Intent(this, ForegroundService.class));
    }
}




public class ForegroundService extends IntentService{

    private boolean stato;


    public ForegroundService(){
        super("ForegroundService");
    }

    @Override
    public void onCreate(){
        super.onCreate();
        Toast.makeText(this, "Service Started", Toast.LENGTH_SHORT).show();
    }

    @Override
    protected void onHandleIntent(Intent i){
        stato = true;
        int n=0;
        while(stato)
        {
            Log.i("PROVA SERVICE", "Evento n."+n++);
            try {
                Thread.sleep(1000);
            }
            catch (InterruptedException e)
            { }
        }
    }

    @Override
    public void onDestroy() {
        stato = false;
        Toast.makeText(this, "service done", Toast.LENGTH_SHORT).show();
        super.onDestroy();
    }

}

Only have a service running when it is actively delivering value to the user。坐着看时钟滴答声并没有积极地为用户提供价值。

另外,请理解您想要的("cycle every 5 minutes and it will take data from an online database")可能不是用户想要的,当然也不是Google想要的。太多的开发人员在做这样的事情,结果电池寿命受到影响。

一般来说,您的最佳解决方案(给定您声明的 objective)是 JobScheduler,如果您的 minSdkVersion 低于 21,则可能回退到 AlarmManager。两者这些允许您安排定期工作。您的流程不需要 运行 在这些工作之间。您教 JobSchedulerAlarmManager 触发工作的频率,并在 JobServiceIntentService.

中完成工作

请记住,在 Android 6.0+ 上,除非用户通过“设置”应用告诉 Android 不要管您的应用,否则您的应用最终会进入 Doze mode or app standby mode,并且你将无法每五分钟获得一次控制权。