我想在应用程序退出时保存一些数据,但是在 Chromebook 上,有一个系统关闭按钮,当用户通过这个关闭按钮退出应用程序时,应用程序的 onPause 和 onStop 不会被调用。我怎么能听到这个关闭按钮事件?
在 Chromebook 上,系统关闭按钮向应用程序发送终止信号,该信号不会触发 onPause() 或 onStop() 生命周期方法。可靠地检测此事件的唯一方法是通过注册信号处理程序来手动处理信号。
在你的应用程序的主要活动中,你可以注册一个信号处理程序来检测终止信号并在应用程序关闭之前保存你想要保存的数据。这是一个示例代码片段:
private static final int TERMINATE_SIGNAL = 15;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Register signal handler
SignalHandler signalHandler = new SignalHandler();
Signal.signal(TERMINATE_SIGNAL, signalHandler);
}
private class SignalHandler implements SignalHandler {
@Override
public void handle(Signal sig) {
// Save data
// ...
// Exit app
finish();
System.exit(0);
}
}
使用这段代码,当终止信号被发送到应用程序时,SignalHandler 的 handle() 方法将被调用,允许您在调用 finish() 关闭应用程序之前保存要保存的数据。
Signal.signal()
和 SignalHandler
是 Java 本机接口 (JNI) 库的一部分。要在您的 Android 项目中使用它们,您需要在您的 build.gradle
文件中添加以下依赖项:
dependencies {
implementation 'androidx.core:core:1.6.0'
}
然后,您可以在代码中使用
Signal.signal()
和SignalHandler
。这是一个例子:
import android.os.Handler;
import android.os.Message;
import android.os.Signal;
import android.os.SystemClock;
public class SignalExample {
private static final int SIGNAL_INT = Signal.SIGINT.ordinal();
private static final int SIGNAL_TERM = Signal.SIGTERM.ordinal();
public static void main(String[] args) {
Handler handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
System.out.println("Received signal: " + msg.what);
return true;
}
});
SignalHandler sigIntHandler = new SignalHandler(handler, SIGNAL_INT);
SignalHandler sigTermHandler = new SignalHandler(handler, SIGNAL_TERM);
Signal.handle(new Signal("INT"), sigIntHandler);
Signal.handle(new Signal("TERM"), sigTermHandler);
while (true) {
System.out.println("Running...");
SystemClock.sleep(1000);
}
}
private static class SignalHandler implements SignalHandler {
private final Handler mHandler;
private final int mSignal;
public SignalHandler(Handler handler, int signal) {
mHandler = handler;
mSignal = signal;
}
@Override
public void handle(Signal signal) {
System.out.println("Handling signal: " + signal.getName());
Message msg = mHandler.obtainMessage(mSignal);
mHandler.sendMessage(msg);
}
}
}
这个例子展示了如何使用
SIGINT
类来处理 SIGTERM
和 SignalHandler
信号。 Handler
用于接收信号并将消息打印到控制台。