从“最近的应用”列表中删除应用程序后,Android服务将重新启动

时间:2017-02-08 14:03:56

标签: java android android-service

点击按钮

启动服务的代码
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布尔检查正在运行。

1 个答案:

答案 0 :(得分:0)

理想情况下,您可以使用IntentService替换整个服务,删除AsyncTask(服务未使用)并将doInBackground()onPostExecute()代码放入onHandleIntent()

除此之外,请替换:

return super.onStartCommand(intent, flags, startId);

使用:

return START_NOT_STICKY;

因为onStartCommand()的默认值是启动粘性服务,这意味着服务将在您的流程终止后的某个时间自动重新启动。