点击按钮
启动服务的代码public void serviceBtnClicked(View view) {
SharedPreferences sharedPreferences = getSharedPreferences("my.package.name", MODE_PRIVATE);
if (!sharedPreferences.getBoolean("_done", false) && !isMyServiceRunning(MyService.class)) {
startService(new Intent(this, MyService.class));
}
}
private boolean isMyServiceRunning(Class<?> serviceClass) {
ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
if (serviceClass.getName().equals(service.service.getClassName())) {
return true;
}
}
return false;
}
MyService.java
@Override
public void onCreate() {
Log.d("_pop", "create");
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
new MyFirstTask().execute();
return super.onStartCommand(intent, flags, startId);
}
public class MyFirstTask extends AsyncTask<String, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected Void doInBackground(String... params) {
doStuff(0);
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
SharedPreferences sharedPreferences = getSharedPreferences("my.package.name", MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putBoolean("_done", true);
editor.apply();
super.onPostExecute(aVoid);
}
}
当我单击按钮时,服务按预期启动并完成所有工作。但问题是当我从“最近的应用”列表中删除我的应用程序时,服务再次启动。有趣的是,当我重新启动应用程序时,服务没有启动,这意味着SharedPreferences _done
布尔检查正在运行。
答案 0 :(得分:0)
理想情况下,您可以使用IntentService
替换整个服务,删除AsyncTask
(服务未使用)并将doInBackground()
和onPostExecute()
代码放入onHandleIntent()
。
除此之外,请替换:
return super.onStartCommand(intent, flags, startId);
使用:
return START_NOT_STICKY;
因为onStartCommand()
的默认值是启动粘性服务,这意味着服务将在您的流程终止后的某个时间自动重新启动。