Android应用程序:如何收听Chromebook上的关闭按钮

edqdpe6u  于 2023-05-12  发布在  Android
关注(0)|答案(2)|浏览(129)

我想在应用退出时保存一些数据,但在Chromebook上,有一个系统关闭按钮,当用户通过这个关闭按钮退出应用时,应用的onPause和onStop不会被调用。如何收听此关闭按钮事件?

62o28rlo

62o28rlo1#

在Chromebook上,系统关闭按钮向应用发送终止信号,这不会触发onPause()或onStop()生命周期方法。可靠地检测此事件的唯一方法是通过注册信号处理程序手动处理信号。
在应用的主Activity中,您可以注册一个信号处理程序,以检测终止信号,并在应用关闭前保存您想要保存的数据。下面是一个示例代码片段:

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()关闭应用之前保存想要保存的数据。

bsxbgnwa

bsxbgnwa2#

Signal.signal()SignalHandler是Java Native Interface(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);
        }
    }
}

此示例显示如何使用SignalHandler类处理SIGINTSIGTERM信号。Handler用于接收信号并将消息打印到控制台。

相关问题