来电期间活动生命周期的怪异行为:延迟onStop()

Kru*_*hah 5 java android android-lifecycle android-activity

我有一个没有UI的简单活动。我想在通话期间检查活动的生命周期方法。

呼叫通知到达时,没有发生任何预期的情况。当我接受呼叫时,呼叫活动掩盖了我的活动。因此,理想情况下onStop()应立即调用。我已经检查了日志,仅onPause()在接受呼叫时才被呼叫。但是2-3秒后onStop()也被调用。

活动

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.e(TAG, "onStart: ");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.e(TAG, "onStop: ");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.e(TAG, "onPause: ");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.e(TAG, "onResume: ");
    }
}
Run Code Online (Sandbox Code Playgroud)

表现

   <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
Run Code Online (Sandbox Code Playgroud)

日志

05-17 22:10:25.025 E/MainActivity: onStart: 
05-17 22:10:25.054 E/MainActivity: onResume: 


When call has been accepted:
05-17 22:10:34.405 E/MainActivity: onPause: 

After 2-4 seconds:

05-17 22:10:38.144 E/MainActivity: onStop: 
Run Code Online (Sandbox Code Playgroud)

按照该文件onStop()

Called when you are no longer visible to the user. You will next receive either onRestart(), onDestroy(), or nothing, depending on later user activity.
Run Code Online (Sandbox Code Playgroud)

在这里,另一个活动是覆盖我的活动并将其隐藏。因此,onStop()应在之后立即调用onPause()

我已经在Moto G4设备和Nexus 5仿真器上进行了测试。两者都显示相同的行为。onStop()调用延迟的原因是什么?

谁能解释内部细节?

屏幕截图 通话正在运行

Sag*_*gar 3

根据文档

接到onPause()呼叫后,您通常会收到对 onStop() 的后续调用(在恢复并显示下一个活动之后),但在某些情况下,会直接回调 onResume() 而不会经历停止状态。

尽管文档onStop()有点令人困惑,它声称一旦 Activity 不再可见就调用它,但在调用它之前有一个轻微的延迟(这取决于显示的下一个 Activity)。

如果您收到呼叫,则呼叫进入前台后会产生轻微的延迟。我也在我的个人电话上观察到这种延迟。此延迟将导致onStop()呼叫延迟。