android - 暂停Android Activity 时执行字节码会发生什么?

标签 android

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

最佳答案

好吧,我做了一些实验,看了一眼android的源代码,我现在更清楚了。
我发现的东西:
onpause、onresume、onstart、oncreate等都在同一个线程(通过打印Thread.currentThread.getId())中运行,该线程是主事件线程,并且此单个事件线程用于所有活动(除非在清单中分配了新进程)。这并不完全出乎意料,但我确实想知道,例如onpause是否存在于用于停止活动的系统启动线程中。
如果在代码中有无限长的时间(比如在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线程正在执行的任何操作的运行时异常。
如果我完全误解了这一点,并得到了错误的想法,请让我知道!我只使用了android 2.5周,很可能我很困惑!

关于android - 暂停Android Activity 时执行字节码会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17602252/

相关文章:

java - android JVM 也可以在 PC 上运行吗?

android - 程序类型已经存在 : com. android.internal.http.multipart.ByteArrayPartSource

android - 防止回收站 View 占用整个空间

android - 如何在用户更改首选项时在运行时禁用 Crashlytics/Fabric

android - Nativescript ListView 仅显示一项

android - android中的视频录制错误

android - BroadcastReceiver、服务和唤醒锁

android - 当第一个 Observable 为空时 RxJava concat

java - 如何在 Android Studio 中请求位置权限?

java - 在 Android 上停止服务