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

时间:2018-05-17 16:49:23

标签: java android android-activity android-lifecycle

我有一个没有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: ");
    }
}

清单

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

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

日志

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: 

根据onStop()的{​​{3}}:

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

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

我在Moto G4设备和Nexus 5仿真器上测试过它。两者都表现出相同的行为。 延迟onStop()电话的原因是什么?

任何人都可以解释内部细节吗?

截图 documentation

5 个答案:

答案 0 :(得分:2)

基于documentation

  

收到onPause()电话后,您通常会收到以下电话   onStop()(在下一个活动恢复并显示之后),   但是在某些情况下会直接回调onResume()   没有经过停止状态。

尽管onStop()的文档有点令人困惑,但是当Activity不再可见时它声称会调用它,但在调用之前会有一点延迟(它取决于显示的下一个活动)。

如果您接到电话,呼叫进入前台后会出现微不足道的延迟。我也在我的个人电话上发现了这种延迟。此延迟会导致onStop()来电延迟。

答案 1 :(得分:0)

  

当我接受电话时,电话的活动就会掩盖我的活动。因此,理想情况下应立即调用onStop()。

接听电话不会从任务堆栈中删除活动,并且当您重新进入应用程序时可用。=&gt; onPause()=&gt;的onStop()。

这就是为什么在收到电话后没有立即调用onStop的原因。

引自Official Documentation

  

如果活动失去焦点但仍然可见(即新的活动   非全尺寸或透明的活动专注于您的   活动),它被暂停了。暂停的活动完全存在(它   维护所有州和会员信息并保持附加   窗口管理器),但可以在极低内存中被系统杀死   情况

答案 2 :(得分:0)

序列是可预测的,并记录在Starting one activity from another

  协调活动:      

以下是发生的操作顺序   当活动A开始活动B时:

     
      
  1. 活动A的onPause()方法执行。
  2.   
  3. 活动B的onCreate()onStart()onResume()方法按顺序执行。 (活动B现在具有用户关注点。)
  4.   
  5. 然后,如果屏幕上不再显示活动A,则执行其onStop()方法。
  6.   

基本上,在消失的onPause()onStop()回调之间创建并完全初始化出现的活动。 这可能需要一些时间,甚至根本不会调用onStop()方法,例如,如果新活动使用对话框样式(因此旧的仍然部分可见)

答案 3 :(得分:0)

我认为这更多地与调用显示的实现方式有关。当您的活动不再将主要焦点放在前台时,会调用onPause,但技术上仍然是#34;可见&#34;。当您的活动根本不再可见时,会调用onStop

两个活动可能具有可见状态,这将导致仅在没有焦点的情况下为活动调用onPause。通过在您的活动之上显示呼叫视图,您的活动仍然可以“访问”#34; visibile&#34;没有完全消失。因此,为什么调用onPause,而不是onStop

答案 4 :(得分:-1)

如果您在活动A之上打开活动B,这就是生命周期的方式

  1. onPause of activity A被称为
  2. onCreate of activity B被称为
  3. onStart of activity B被称为
  4. onResume of activity B被调用 onStop of activity A被调用(除了部分可见的活动)
  5. 在内存不足的情况下,活动A的销毁也可以被称为
  6. 正如您所看到的,在活动A的暂停和停止之间调用了很多方法,因此延迟