我有一个没有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()电话的原因是什么?
任何人都可以解释内部细节吗?
答案 0 :(得分:2)
收到
onPause()
电话后,您通常会收到以下电话 onStop()(在下一个活动恢复并显示之后), 但是在某些情况下会直接回调onResume() 没有经过停止状态。
尽管onStop()
的文档有点令人困惑,但是当Activity不再可见时它声称会调用它,但在调用之前会有一点延迟(它取决于显示的下一个活动)。
如果您接到电话,呼叫进入前台后会出现微不足道的延迟。我也在我的个人电话上发现了这种延迟。此延迟会导致onStop()
来电延迟。
答案 1 :(得分:0)
当我接受电话时,电话的活动就会掩盖我的活动。因此,理想情况下应立即调用onStop()。
接听电话不会从任务堆栈中删除活动,并且当您重新进入应用程序时可用。=&gt; onPause()=&gt;的onStop()。
这就是为什么在收到电话后没有立即调用onStop的原因。
如果活动失去焦点但仍然可见(即新的活动 非全尺寸或透明的活动专注于您的 活动),它被暂停了。暂停的活动完全存在(它 维护所有州和会员信息并保持附加 窗口管理器),但可以在极低内存中被系统杀死 情况
答案 2 :(得分:0)
序列是可预测的,并记录在Starting one activity from another
中协调活动:以下是发生的操作顺序 当活动A开始活动B时:
- 活动A的
onPause()
方法执行。- 活动B的
onCreate()
,onStart()
和onResume()
方法按顺序执行。 (活动B现在具有用户关注点。)- 然后,如果屏幕上不再显示活动A,则执行其
醇>onStop()
方法。
基本上,在消失的onPause()
和onStop()
回调之间创建并完全初始化出现的活动。
这可能需要一些时间,甚至根本不会调用onStop()
方法,例如,如果新活动使用对话框样式(因此旧的仍然部分可见)
答案 3 :(得分:0)
我认为这更多地与调用显示的实现方式有关。当您的活动不再将主要焦点放在前台时,会调用onPause
,但技术上仍然是#34;可见&#34;。当您的活动根本不再可见时,会调用onStop
。
两个活动可能具有可见状态,这将导致仅在没有焦点的情况下为活动调用onPause
。通过在您的活动之上显示呼叫视图,您的活动仍然可以“访问”#34; visibile&#34;没有完全消失。因此,为什么调用onPause
,而不是onStop
。
答案 4 :(得分:-1)
如果您在活动A之上打开活动B,这就是生命周期的方式
正如您所看到的,在活动A的暂停和停止之间调用了很多方法,因此延迟