应用程序关闭后后台进程(AsyncTask)仍在运行

Posted

技术标签:

【中文标题】应用程序关闭后后台进程(AsyncTask)仍在运行【英文标题】:Background process (AsyncTask) still running after app closes 【发布时间】:2021-04-20 10:40:54 【问题描述】:

我的应用有 3 或 4 个异步任务,其中两个从 sqlite 数据库获取数据并创建意图将其发送到主活动中的接收器。一切正常 - 直到我关闭应用程序然后重新启动它。然后无法正确接收数据。经过大量实验后,我发现如果在正常关闭应用程序后“强制停止”它,它会再次正常工作 - 直到我下次运行任务并再次关闭应用程序。 在调试器上运行时,此行为不会正常显示。但是,如果我在设备上启动应用程序(而不是通过 android Studio)然后附加调试器,我可以很清楚地看到接收器每次都接收到两个广播副本,而不是只接收一个。一份是正确的,另一份包含垃圾数据。我添加了额外的行,表明任务 ID 在每种情况下都是相同的。

发送意图如下所示

private void sendRoads(ArrayList<RedRoad> roadsChunk)

    ArrayList<RedRoad> theseRoads = new ArrayList<>(roadsChunk);
    Intent mapIntent = new Intent("newRoads");
    mapIntent.putParcelableArrayListExtra("newRoads", theseRoads);
    mapIntent.putExtra("chunkIndex",cIndex++);

    int threadID = android.os.Process.getThreadPriority(android.os.Process.myTid());
    mapIntent.putExtra("threadID",threadID);

    LocalBroadcastManager.getInstance(ctx).sendBroadcast(mapIntent);
    // get ready for next group while we show these
    roadsChunk.clear();

为了尝试解决这个问题,我在 onDestroy 中添加了额外的行:

    @Override
public void onDestroy() 
    super.onDestroy();
    if (roadCreation!=null)
        roadCreation.cancel(true);
    if (parseKmlFile != null)
        parseKmlFile.cancel(true);
    Intent serviceIntent = new Intent(getApplicationContext(), LocationService.class);
    stopService(serviceIntent);

但这似乎没有任何区别(命名的两个类是使用上述方法的两个类。如您所见,还涉及一个服务,但我可以通过其他方式判断它正在正确停止)。

我试图捕捉错误的广播并忽略对它们的任何操作,但它们仍然会弄乱正确的数据。

我有两个测试设备;一个sdk 26(奥利奥)和一个29(Q);后者每次都会出现这个问题,前者只是偶尔出现。

【问题讨论】:

【参考方案1】:

感谢this 的回答,我终于解决了这个问题。 我的 onDestroy() 现在看起来像这样:

public void onDestroy() 
    super.onDestroy();
    Intent serviceIntent = new Intent(getApplicationContext(), LocationService.class);
    stopService(serviceIntent);
    // ensure all background tasks stop correctly
    int id= android.os.Process.myPid();
    android.os.Process.killProcess(id);

【讨论】:

以上是关于应用程序关闭后后台进程(AsyncTask)仍在运行的主要内容,如果未能解决你的问题,请参考以下文章

在 AsyncTask 仍在后台运行的情况下,Activity.finish() 会发生啥?

窗口关闭后 PyQt 线程仍在运行

关闭应用程序后,LocationUpdatesForegroundService 应用程序进程仍在运行

Android -- 关闭AsyncTask(异步任务)

如果我们关闭它启动的终端,linux 会杀死后台进程吗?

苹果手机怎么退出正在使用的程序