【发布时间】:2016-03-11 17:38:19
【问题描述】:
关于 android 的视图层次结构的打包/解包,我注意到一些对我来说似乎很奇怪的事情。我希望有人可以为我澄清事情。
我了解,只要指定了 ID,任何视图都会自动将其状态捆绑在一起,Great Ref. here。例如,当屏幕旋转然后再旋转回来时,EditText 将自动将其文本设置回原来的状态。但是,我有一些相关的问题:
为什么在调用 onDestroy 之后 EditText 将其状态传递回 onCreate。我在documented activity lifecycle 中看不到从 onDestroy 到 onCreate 的路径。在我看来,如果它通过 onStop 返回 onCreate,它可以恢复其状态,但是一旦调用 onDestroy,就没有返回 onCreate 的路径。
为什么 TextView 在屏幕旋转后记住它的状态。这让我觉得它与恢复状态的 EditText 非常相似。我猜 TextView 只是没有实现自动捆绑其状态?
我还注意到,如果通过多次点击后退按钮调用 onDestroy,然后如果我带回应用程序,例如,在我的手机上长按中心按钮,然后选择应用程序,则应用程序包不会保存.即 EditText 和 TextViews 状态都设置回它们的初始文本。最后一部分是有道理的,因为 onDestroy 被调用了。
看起来,当屏幕旋转时,onDestroy 的调用方式与多次点击后退按钮时的调用方式不同。
这是一个简单测试应用程序的 java 源代码。我写来演示的。布局只有 1 个按钮、1 个文本视图和 1 个编辑视图。
package com.example.sse.activitylifecycle;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private Button btnSetText;
private EditText editText;
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
if (savedInstanceState == null)
Log.i("myFLAG", "onCreate Called. NO BUNDLE PASSED");
else
Log.i("myFLAG", "onCreate Called. BUNDLE PASSED");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.textView);
editText = (EditText) findViewById(R.id.editText);
btnSetText = (Button) findViewById(R.id.btnSetText);
btnSetText.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
editText.setText("Set Text"); //Text remembered, but only after rotation.
textView.setText("Set Text"); //Text NOT remembered.
}
});
}
@Override
protected void onRestart() {
Log.i("myFLAG", "onRestart Called.");
super.onRestart();
}
@Override
protected void onResume() {
Log.i("myFLAG", "onResume Called.");
super.onResume();
}
@Override
protected void onStart() {
Log.i("myFLAG", "onStart Called.");
super.onStart();
}
@Override
protected void onStop() {
Log.i("myFLAG", "onStop Called.");
super.onStop();
}
@Override
protected void onPause() {
Log.i("myFLAG", "onPause Called.");
super.onPause();
}
@Override
protected void onDestroy() {
Log.i("myFLAG", "onDestroy Called.");
super.onDestroy();
}
}
【问题讨论】:
标签: android android-activity bundle lifecycle