我的应用程序在停止后仍然运行。我怎么能阻止它?

时间:2013-10-11 23:24:13

标签: android

我的Android应用程序的设计使用户可以阻止它的唯一方法是点击手机上的后退键。当命中该键时,onStop事件确实在我有一个log命令的地方执行,并执行super.onStop();

但该应用程序并未停止。我知道这是因为我有一个经常发生的计时器,并向我发送一封包含调试条目的电子邮件。

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

在我“停止应用程序”后,我一整天都收到电子邮件 - 它仍在运行中。

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

如何让这个应用程序停止?

谢谢, 加里

这是我的编辑。 。

下面的Timer执行我的getRTlegsFromServer,它调用与我的REST服务对话的asynctask。 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解决方案是个坏主意。此应用程序不使用任何服务。

3 个答案:

答案 0 :(得分:2)

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

要注意的两件事是:

  • 要停止活动,请使用finish()。无论你打电话给finish(),你都应该cancel()计时器。
  • 而不是onStop()用户离开应用程序的事件做出反应(后退按钮,主页按钮,...)覆盖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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您没有取消计时器。这就是你继续接收电子邮件的原因。

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