簡體   English   中英

從“最近使用的應用程序”列表中刪除應用程序后,Android服務將重新啟動

[英]Android service gets restarted when application is removed from Recent Apps list

單擊按鈕即可啟動服務的代碼

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布爾檢查正在運行。

理想情況下,您可以將整個服務替換為IntentService ,擺脫AsyncTask (服務不使用),並將doInBackground()onPostExecute()代碼放入onHandleIntent()

除此之外,請替換:

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

有:

return START_NOT_STICKY;

因為onStartCommand()的默認設置是啟動粘性服務,這意味着該服務將在您的進程終止后的某個時間自動重新啟動。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM