Android:在什么情况下会出现一个对话框导致onPause()被调用?
Android Activities文档中的一个片段(向下滚动到“ 前景生命周期 ”行)说:
一个活动可以经常在前台进出,例如,当设备进入睡眠状态或出现对话框时,会调用
onPause()
。
我不太明白这一点。 在什么情况下应该发生? 仅当对话框的上下文与要显示对话框的活动不同时,才会调用onPause()
。
编辑:添加代码示例来详细说明我的疑问
通过上面提到的文档引用,当下面代码中的AlertDialog
(或只是Dialog
)被显示时,我的活动的onPause()
方法是否被调用? 显示对话框时是否应该看到“onPause called”日志条目?
但是我没有看到发生。 如果我已经正确理解了Android的生命周期,它也不应该这样做! 那么,这个文件指的是什么呢?
public class LifeCycleTestActivity extends Activity { private static final String TAG = "LifeCycleTest"; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button btn = (Button) findViewById(R.id.button1); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Log.d(TAG, "onClick"); AlertDialog dialog = new AlertDialog.Builder(LifeCycleTestActivity.this).create(); dialog.setMessage("You Clicked on the button"); dialog.setTitle("Dialog!"); dialog.setButton(AlertDialog.BUTTON_NEUTRAL, "OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); dialog.setCancelable(true); dialog.show(); /* Dialog dialog = new Dialog(LifeCycleTestActivity.this); dialog.setTitle("Dialog!"); dialog.setCancelable(true); dialog.show(); */ } }); } @Override protected void onPause() { Log.d(TAG, "onPause() called"); super.onPause(); } @Override protected void onResume() { super.onResume(); Log.d(TAG, "onResume() called"); } }
当您的活动不再位于活动堆栈的顶部时,将调用onPause()。 一个对话框本身不是一个Activity,所以不会replace栈顶的当前Activity,所以不会导致任何事情暂停。
但是,对话框(小写)不需要由Dialog类实现。 例如,实现一个主题设置为对话框的活动的情况并不罕见。 在这种情况下,显示对话框作为一个活动将导致新的活动在堆栈的顶部,暂停以前在那里。
我已经做了很多对话的代码,包括你提到的AlertDialog
,我也试着检查onPause()
是否在对话框popup时被调用,但是到目前为止我的结论是该活动只是保持运行,并且不会调用 onPause()
。
不知道是否有帮助,但至less你现在知道有其他人经历你的经历:-)
我想我记得在Android生命周期的早期版本中读取onPause被调用时没有显示任何活动。 即如果您的某个活动在popup窗口中仍然可见,则不会调用onPause。
也许其他一些专家可以担保这种行为?
在我稍微奇怪的经验上, dialog.setCanceledOnTouchOutside(true);
被调用dialog.setCanceledOnTouchOutside(true);
但onPause
永远不会被调用。
这就是说,我认为文档可能会关注系统对话框(例如电池电量不足)。
在onPause阶段,它的活动错误不再存在于活动栈顶。
条件活动处于暂停状态 –
- 活动部分可见,例如对话活动。
-
活动对象被保留在内存中,它维护所有的状态和成员信息,并保持连接到窗口pipe理器。
例如按下主页button会导致活动进入onPause()。 仍然在堆栈顶部。
在图1中,Activity3将被销毁并从顶层栈中移除
在图2中,现在任务A进入后台,但Activty X仍然在栈顶。 如果在这个状态下重写onPause()方法
图1.任务中的每个新活动如何将项添加到后退堆栈的表示forms。 当用户按下“后退”button时,当前活动被破坏,前一个活动恢复。
图2.两个任务:任务B在前台接收用户交互,而任务A在后台,等待恢复。
onPause()
每当一个Activity进入背景并且Dialog
或者其他Activity
到达时被调用。 这样做是为了优先考虑与用户交互的东西。 例如:假设你是在一个应用程序的主 屏幕 (这又是一个活动), 主屏幕被认为是在foreground
。 当你按下某个button进入下一个屏幕,或者出现一个对话框时,下一个screen/Activity/Dialog
出现在foreGround
而且屏幕会回到地图,这意味着homeScreen的 onPause()
方法被调用了。