2

我的 android 应用程序被设计为用户可以阻止它的唯一方法是点击手机上的后退键。当那个键被按下时,onStop 事件确实在我有一个日志命令的地方执行,我执行 super.onStop();

但应用程序并没有停止。我知道这一点是因为我有一个计时器,它经常响起并给我发送一封包含调试条目的电子邮件。

(它不通过电话发送电子邮件,而是通过邮件发送到我发送电子邮件的服务器)。

在我“停止应用程序”之后,我整天都会收到电子邮件——它肯定还在运行。

如果我检查手机(Galaxy S3)的“正在运行”的应用程序,它没有列出,但如果我查看应用程序的属性,则启用了“强制关闭”。如果我点击“强制关闭”应用程序然后停止发送电子邮件。

我怎样才能让这个应用程序停止?

谢谢,加里

这是我的编辑。. .

下面的计时器执行我的 getRTlegsFromServer,它调用一个与我的 REST 服务对话的异步任务。DebugLog 通过另一个 REST 服务向我发送电子邮件。这一切都很好,实际上很好,以至于无法停止。我在我的电子邮件中收到“onStop 事件”,然后整天收到更多 DebugLog 消息,直到我在电话上强制停止。

    timer = new Timer();
    timer.schedule(new TimerTask()
    {
        @Override
        public void run()
        {
            TimerMethod();
        }
    }, 0, 10*1000);  


private void TimerMethod()
    {
        //debugLog("TimerMethod is executing", false);  


        runOnUiThread(new Runnable()
        {
            @Override
            public void run()
            {

                if (timeForAnother == true)
                {
                    getRTlegsFromServer();
                }
                else
                {
                    DebugLog.debugLog("NOT making server call because timeForAnother is false", false);
                }

            }
        });

    }

    @Override
    public void onStop()
    {
        DebugLog.debugLog("onStop event ", true);
        //timer.cancel();
        super.onStop();
    }

timer.cancel() 被注释掉(我试图停止它),因为它得到了 NullPointerException。我在其他线程上读到 KillProcess 解决方案是个坏主意。此应用程序不使用任何服务。

4

3 回答 3

2

调用onStop()意味着 Activity 已停止,但并不意味着应用程序不再处于活动状态。这也不意味着用户已经停止了应用程序。他/她也可以旋转设备(这也会停止并破坏 Activity 并重新创建、重新启动它)。

有两件事要看:

  • 要停止 Activity,请使用finish(). 无论您打电话到哪里,finish()都应该cancel()设置计时器。
  • 而不是真正对用户离开应用程序(后退按钮,主页按钮,...)onStop()的事件做出反应override 。onUserLeaveHint()

我对 Android 处理 Activity 生命周期的方式感到困惑。所以我写了一个简单的 Activity 覆盖所有回调并在调用时记录它们。这是输出:

First Start
    onCreate
    onStart
    onResume

Turn orientation
    onPause
    onSaveInstanceState
    onStop
    onDestroy
    onCreate
    onStart
    onResume

Switch to another App
    onUserLeaveHint
    onPause
    onSaveInstanceState
    onStop

Get back to this App
    onRestart or onDestroy, onCreate
    onStart
    onResume

Press Home Button
    onUserLeaveHint
    onPause
    onSaveInstanceState
    onStop

Start another Application
---

Start this Application again
    onRestart/onCreate
    onStart
    onResume
于 2013-10-12T19:19:50.830 回答
0

你没有取消你的定时器。这就是您不断收到电子邮件的原因。

onStop()方法调用timer.cancel();中,这可能会解决您的问题。

于 2013-12-10T09:10:34.040 回答
0

在运行了几个测试程序后,我可以证明调用 finish() 并让程序完成 onDestroy 事件并不会停止活动的运行。计时器仍在运行,程序可以发送电子邮件、播放声音等。停止程序的唯一方法是让用户进入应用程序设置并“强制停止”。显然没有办法以编程方式复制它。

于 2013-10-17T23:17:57.280 回答