首页 > 解决方案 > 安卓无法关闭应用

问题描述

情况
我的应用程序中有一个超时机制,它会在一段时间不活动后提示用户输入 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)

标签: androidmultithreadingshutdown

解决方案


推荐阅读