暂停android活动时执行字节码会发生什么情况?

暂停android活动时执行字节码会发生什么情况?,android,Android,我有一些在启动android活动时运行的代码。如果需要,我将从共享首选项和web服务器中读取。其中一些将发生在主线程上,显然服务器请求位于异步任务中 现在我想知道的是,如果应用程序暂停会发生什么。字节码是否在程序计数器所在的位置停止,或等待主循环上发生的任何事情完成,然后调用onPause 此外,我还担心从网络接收数据时回调会发生什么情况。回调是否会在暂停恢复后发生,还是总是丢失?据我所知,当活动暂停时,从网络读取的线程仍然可以运行。好吧,我已经做了一些实验,并浏览了Android源代码中的活动

我有一些在启动android活动时运行的代码。如果需要,我将从共享首选项和web服务器中读取。其中一些将发生在主线程上,显然服务器请求位于异步任务中

现在我想知道的是,如果应用程序暂停会发生什么。字节码是否在程序计数器所在的位置停止,或等待主循环上发生的任何事情完成,然后调用onPause


此外,我还担心从网络接收数据时回调会发生什么情况。回调是否会在暂停恢复后发生,还是总是丢失?据我所知,当活动暂停时,从网络读取的线程仍然可以运行。

好吧,我已经做了一些实验,并浏览了Android源代码中的活动,现在我更清楚了

我发现的东西:

  • onPause、onResume、onStart、onCreate等都在同一个线程内运行(通过打印
    thread.currentThread.getId()
    ),该线程是主事件线程,并且该单个事件线程用于所有活动(除非您在清单中分配了新进程)。这并非完全出乎意料,但我确实怀疑onPause是否存在于用于停止活动的系统启动线程中

  • 如果您的代码中有一个无限的while(比如在onResume中,或者在由于按下按钮而执行的代码中),那么onPause和其余的将永远不会执行。此外,该循环将继续执行,例如,每秒打印一次日志。如果你要进入主屏幕(或者其他任何应该在暂停甚至停止时生成的内容),这些打印仍然会出现,尽管应用程序不可见,循环仍会继续。您仍将进入主屏幕。如果你愿意的话,你可以回到你的应用程序中,但它仍然会被困在循环中。因此,当文档讨论暂停或停止活动的操作时,显然这不会停止应用程序在任何地方的执行,也不会在主线程中生成运行时异常(在调用onPause之前)或其他任何操作。暂停和终止活动似乎与linux进程中的概念毫无关系

  • 如果在AsyncTask中运行一个缓慢的web请求,那么AsyncTask代码将在不同的线程中运行,正如您所期望的那样。如果启动任务的活动在任务完成其工作之前暂停,并且onPause、onStop作为正常调用,那么当asynctask完成其回调(在活动中定义)时,onPostExecute仍将在主gUI线程中被调用和执行。尽管“活动”已经完全停止,但情况仍然如此

  • 我由此得出的结论是,所有onStop和onStart等都只是主事件循环中的事件,就像其他事件一样,必须等待轮到它们在主线程中被调用。它们没有任何特殊之处,不会立即执行或类似的操作,并且可以被循环中的任何其他内容阻止

    此外,活动的概念实际上只是一个GUI东西,因此,如果活动停止,则没有屏幕或按钮与之交互或显示。但是,这与底层进程没有关系,底层进程将继续处于活动状态,并且可以打印或响应回调等。JVM继续存在,其所有类继续存在,进程继续执行。显然,如果没有从GUI接收任何事件或交互,并且已经接收到onPause,那么它应该什么也不做。如果它占用了任何类型的资源,那么这个过程当然可以被关闭——这就是为什么您应该实现生命周期回调

    另一方面,我们可以在Activity.java中看到,暂停是通过调用

    final void performPause() {
            mFragments.dispatchPause();
            mCalled = false;
            onPause();
            mResumed = false;
    
    然后

    protected void onPause() {
            if (DEBUG_LIFECYCLE) Slog.v(TAG, "onPause " + this);
            getApplication().dispatchActivityPaused(this);
            mCalled = true;
        }
    
    这表明,正如测试所预期的,暂停实际上只是将另一个事件分派到主循环

    我假定mCalled变量有两个用途——一个用于确保在活动派生类中调用super()版本,另一个用于系统在销毁需要资源的进程之前检查是否调用了它

    考虑到这是如何工作的,如果onPause运行缓慢,或者被偶数循环中的其他东西阻塞,那么您的进程可能在onPause完成之前被终止

    显然,这其中的一些可能对某些人来说是显而易见的。但是我发现文档很混乱。我无法在不理解运行、暂停等概念在代码排序方面的实际含义的情况下对代码可能进入的状态进行推理,因为我认为暂停可能意味着gui线程正在执行的任何操作的运行时异常

    如果我完全误解了这一点,并得到了错误的想法,请务必让我知道!我只使用了安卓2.5周,很可能我很困惑