我正在使用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,发现只要应用程序在此处被杀死,就会调用所有三个onPause
,onStop
和onDestroy
方式。当然,onStop
and onDestroy
may never be called if the device is low on memory,所以唯一可靠的方法是onPause
。
Qt似乎也有信号QGuiApplication::applicationStateChanged
,虽然我还没有调查过这一点。
答案 0 :(得分:0)
如果您尝试进行的清理非常重要,请考虑使用执行清理Service的when 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);
}
}