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
。两者这些允许您安排定期工作。您的流程不需要 运行 在这些工作之间。您教 JobScheduler
或 AlarmManager
触发工作的频率,并在 JobService
或 IntentService
.
中完成工作
请记住,在 Android 6.0+ 上,除非用户通过“设置”应用告诉 Android 不要管您的应用,否则您的应用最终会进入 Doze mode or app standby mode,并且你将无法每五分钟获得一次控制权。
我需要创建一个通过两个按钮启动和停止的后台服务。我的服务每 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
。两者这些允许您安排定期工作。您的流程不需要 运行 在这些工作之间。您教 JobScheduler
或 AlarmManager
触发工作的频率,并在 JobService
或 IntentService
.
请记住,在 Android 6.0+ 上,除非用户通过“设置”应用告诉 Android 不要管您的应用,否则您的应用最终会进入 Doze mode or app standby mode,并且你将无法每五分钟获得一次控制权。