cancel()无效,killBackgroundProcesses也没有

时间:2013-05-24 18:33:24

标签: android android-asynctask kill

我正在制作APK,但我遇到了问题。我的APK在完成后发送GET请求。我有一个用于发送GET请求(GPS)的asynctask类。问题是当我再次启动应用程序时,我需要杀死上一次启动的后台进程。我在manifest.xml中使用了use-permission android:name =“android.permission.RESTART_PACKAGES”并使用了权限android:name =“android.permission.KILL_BACKGROUND_PROCESSES”,并使用了以下代码:

if (URLUtil.isValidUrl(URL_Pet_GET) && URLUtil.isValidUrl(URL_Host)){
    //Get_Backgnd.cancel(true); not working  
    context.getSystemService(Context.ACTIVITY_SERVICE);
    manager.killBackgroundProcesses(String.valueOf(process.processName));
    //not working

    //ActivityManager activityManager = (ActivityManager) context.getSystemService("activity");
    //activityManager.restartPackage(packageName);
    //not working

    pet_get_backgrnd Get_Backgnd = new pet_get_backgrnd();
    Get_Backgnd.execute();  //Send GET request that I need stop on next execution of apk 
}  
private class pet_get_backgrnd extends AsyncTask<Context, Object, Object>{
    /*@Override
    protected void onPreExecute() {
        cancel(true);
    }*/ //not working

    @Override
    protected Object doInBackground(Context... params) { 
      //send Get requests
    }
}

如何在下次执行APK时取消Get_Backgnd的执行?或者相同 如何取消上次执行APK的Get_Backgnd的执行?

由于

1 个答案:

答案 0 :(得分:0)

AsyncTask上的cancel()方法实际上并不取消执行,而是设置一个可以使用isCancelled()方法查看的标志。您需要在doInBackground()中手动检查该标志,并写下您希望如何处理取消的任务。 See this answer for an example of this and some useful links on canceling AsyncTasks.

为了确保您的AsyncTask不会保留,您可以将调用设置为在onPause()onDestroy()生成的活动中取消,无论您认为哪个更合适,以便一旦它不再相关,任务就会被杀死。重要的是,在实际创建任务的Activity中完成此操作,您将无法在后续运行的APK中取消任务,因为您不再具有对它的引用。这与isCancelled()的人工检查相结合,可以帮助您实现所需的行为。