android - 安卓无法关闭应用
问题描述
情况
我的应用程序中有一个超时机制,它会在一段时间不活动后提示用户输入 PIN 码。为此,我在当前活动的活动之上开始了一项新活动。然后用户有几次尝试输入正确的 PIN。如果没有剩余尝试,应用程序将重置并自行关闭。
为了实现计时器,我有一个后台线程,它会在我的应用程序中发生的每个触摸事件都会收到通知。每次触摸屏幕时,不活动计时器都会重置。如果在持续时间结束之前没有通知线程,它会启动 PIN 活动。
public class TimeoutThread extends Thread {
private final Semaphore semaphore = new Semaphore(0);
protected TimeoutThread() {
super(TimeoutThread.class.getSimpleName());
}
@Override
public void run() {
while (!isInterrupted()) {
try {
if (!semaphore.tryAcquire(appData.getDisplayTimeoutTime(), TimeUnit.MILLISECONDS)) {
// this is where i start the PIN-Activity
semaphore.acquire();
}
} catch (InterruptedException ignored) {
break;
}
}
contextWeakReference.clear();
}
protected void resetTimer() {
if (semaphore.availablePermits() == 0) {
semaphore.release();
}
}
}
这个线程位于我的Application
班级。它从应用程序开始onCreate
,因此从 Appstart 开始运行。
现在正如我所说,如果输入了错误的 PIN,应用程序应该关闭。为此,我的应用程序中有一个关闭方法,它会中断线程,将其引用设置为 null 并调用System.exit(0)
。
问题
无论我尝试什么,android 都会重新启动我的应用程序,这似乎是因为我的线程。如果我不启动它,请手动启动我的 PIN-Activity 并输入错误的 PIN,它会正常关闭。在调用 System.exit(0) 时,线程已正确停止并死亡。我不明白死线程如何导致重新启动。我能想到的唯一其他区别是,如果我手动导航到 UI-Thread,我的 PIN-Activity Intent 是从 UI-Thread 开始的,而 app-timeout 从超时线程开始。
问题
为什么会发生这种情况,我该如何解决?调用 startActivity(Intent) 方法的线程会影响结果吗?
我也尝试过我尝试使用,
关闭我的应用程序(在所有剩余的活动上)和System.exit()
Activity#finishAndRemoveTask()
android.os.Process.killProcess(myPid)
解决方案
推荐阅读
- wordpress - 如何防止用户(作者)在单个帖子中添加新标签?
- haskell - “忽略(可能损坏)包的 abi-depends 字段”是什么意思?
- javascript - 如何通过ts中的变量获取属性
- ios - ios中的离子推送通知
- python - 数据框python删除重复项
- ios - 为 Flutter iOS 项目生成一个用于测试目的的 diawi 链接
- javascript - Jquery 自动完成返回表中的所有行,而 PHP 根据查询返回结果
- amazon-web-services - AWS cognito-创建新用户给出“无法解析数字”错误
- java - 使用实体类验证 json
- mysql - 在存储过程中似乎找不到错误或设置 SQL 变量