在Qt Android中最后一分钟清理的地方?

时间:2017-07-06 14:00:15

标签: android c++ qt

我正在使用Qt为Android开发移动应用程序。我已阅读this question有关连接到QApplication::aboutToQuit和/或QApplication::lastWindowClosed以便进行最后一分钟清理的信息。但是,当用户从Android中的多任务菜单中滑动以清除应用程序时,我发现这些方法不足。在这种情况下,似乎没有广播信号并且我的应用程序数据处于不适当的状态。无论应用程序如何关闭,有没有办法确保清理完成?

我已设置以下测试代码以验证他们未被广播:

#include <QGuiApplication>
#include <QDebug>

class Application : public QGuiApplication
{
  Q_OBJECT

  public:
    Application(int &argc, char **argv, int flags = ApplicationFlags)
        : QGuiApplication(argc, argv, flags) {

      connect(this, &QGuiApplication::aboutToQuit, 
              &Application::notifyQuitting);

      connect(this, &QGuiApplication::lastWindowClosed, 
              &Application::notifyLastWindowClosed);
    }

    static void notifyQuitting() {
      qDebug() << "quitting!";
    }

    static void notifyLastWindowClosed() {
      qDebug() << "LastWindowClosed!";
    }
};

更新

我已经在Java中实现了一个自定义Activity,发现只要应用程序在此处被杀死,就会调用所有三个onPauseonStoponDestroy方式。当然,onStop and onDestroy may never be called if the device is low on memory,所以唯一可靠的方法是onPause

Qt似乎也有信号QGuiApplication::applicationStateChanged,虽然我还没有调查过这一点。

1 个答案:

答案 0 :(得分:0)

如果您尝试进行的清理非常重要,请考虑使用执行清理Servicewhen the task is removed。这几乎可以保证清理工作。只要系统内存不是很低,用户就不会自行停止服务。

public class CleanupService extends Service {

    private static boolean cleanupDone = false;

    public CleanupService() {
        super();
        instance = this;
    }

    private void cleanupBeforeQuit() {
        // do cleanup here
        cleanupDone = true;
        stopSelf();
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        if (cleanupDone) {
            stopSelf();
            return START_NOT_STICKY;
        }
        return START_STICKY;
    }

    @Override
    public void onTaskRemoved(Intent rootIntent) {
        cleanupBeforeQuit();
        super.onTaskRemoved(rootIntent);
    }
}