我正在开发一个实用的新应用程序,用于 Android 基础知识 02.2:
请滑到网页底部,出现问题的项目是哪里
我的问题在题中,补充如下:无论是点击Second Activity的后退按钮回到MainActivity,还是在MainActivity中旋转屏幕,MainActivity都会执行onSaveInstanceState方法被销毁,然后重新创建。但是在前者在重新创建时onCreatesavedInstanceState参数为null,后者不为null,正常,又能显示Bundle中存储的数据。请问是什么原因造成的?
请让我说明使问题重现的程序:
现在可以看到MainActivity顶部显示的内容已经消失了。但是我查看日志的时候发现MainActivity在销毁之前确实执行了onSaveInstanceState(我在那个方法中添加了一条log语句)。但是当MainActivity重新创建,OnCreate方法中的参数savedInstanceState为null,屏幕上什么也没有。数据在哪里?
相反,当我旋转屏幕时,没有出现问题,MainActivity 顶部显示的内容仍然存在(旋转屏幕属于系统配置更改,Actitvity 也会先销毁,然后重新创建)。这意味着 savedInstanceState 不为空并且应用程序正常运行 是什么以及为什么导致这个问题,我不明白,请帮助我。非常感谢!
主要活动:
package com.example.twoactivities;
public class MainActivity extends AppCompatActivity {
private static final String LOG_TAG =
MainActivity.class.getSimpleName();
public static final String EXTRA_MESSAGE =
"com.example.android.twoactivities.extra.MESSAGE";
public static final int TEXT_REQUEST = 1;
private TextView mReplyHeadTextView;
private TextView mReplyTextView;
private EditText mMessageEditText;
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.d(LOG_TAG, "-------");
Log.d(LOG_TAG, "onCreate");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mMessageEditText = findViewById(R.id.editText_main);
mReplyHeadTextView = findViewById(R.id.text_header_reply);
mReplyTextView = findViewById(R.id.text_message_reply);
if(savedInstanceState != null){
Log.d(LOG_TAG, "enter saveInstance");
boolean isVisible = savedInstanceState.getBoolean("reply_visible");
if(isVisible){
mReplyHeadTextView.setVisibility(View.VISIBLE);
mReplyTextView.setText(savedInstanceState.getString("reply_text"));
mReplyTextView.setVisibility(View.VISIBLE);
}
}
}
public void launchSecondActivity(View view) {
Log.d(LOG_TAG, "Button clicked!");
String message = mMessageEditText.getText().toString();
Intent intent = new Intent(this, SecondActivity.class);
intent.putExtra(EXTRA_MESSAGE, message);
startActivityForResult(intent, TEXT_REQUEST);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data){
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == TEXT_REQUEST){
if(resultCode == RESULT_OK){
String reply = data.getStringExtra(SecondActivity.EXTRA_REPLY);
mReplyHeadTextView.setVisibility(View.VISIBLE);
mReplyTextView.setText(reply);
mReplyTextView.setVisibility(View.VISIBLE);
}
}
}
@Override
public void onStart(){
super.onStart();
Log.d(LOG_TAG, "onStart");
}
@Override
protected void onPause() {
super.onPause();
Log.d(LOG_TAG, "onPause");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d(LOG_TAG, "onRestart");
}
@Override
protected void onStop() {
super.onStop();
Log.d(LOG_TAG,"onStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(LOG_TAG, "onDestroy");
}
@Override
protected void onResume() {
super.onResume();
Log.d(LOG_TAG, "onResume");
}
@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
Log.d(LOG_TAG, "saving Instance");
if(mReplyHeadTextView.getVisibility() == View.VISIBLE){
outState.putBoolean("reply_visible", true);
outState.putString("reply_text", mReplyTextView.getText().toString());
}
}
}
第二个活动:
package com.example.twoactivities;
public class SecondActivity extends AppCompatActivity {
public static final String LOG_TAG =
SecondActivity.class.getSimpleName();
public static final String EXTRA_REPLY =
"com.example.android.twoactivities.extra.REPLY";
private EditText mReply;
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.d(LOG_TAG, "-------");
Log.d(LOG_TAG, "Sec onCreate");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
mReply = findViewById(R.id.editText_second);
Intent intent = getIntent();
String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
TextView textView = findViewById(R.id.text_message);
textView.setText(message);
}
public void returnReply(View view) {
String reply = mReply.getText().toString();
Intent replyIntent = new Intent();
replyIntent.putExtra(EXTRA_REPLY, reply);
setResult(RESULT_OK, replyIntent);
finish();
Log.d(LOG_TAG, "End SecondActivity");
}
@Override
public void onStart(){
super.onStart();
Log.d(LOG_TAG, "Sec onStart");
}
@Override
protected void onPause() {
super.onPause();
Log.d(LOG_TAG, "Sec onPause");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d(LOG_TAG, "Sec onRestart");
}
@Override
protected void onStop() {
super.onStop();
Log.d(LOG_TAG,"Sec onStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(LOG_TAG, "Sec onDestroy");
}
@Override
protected void onResume() {
super.onResume();
Log.d(LOG_TAG, "Sec onResume");
}
}