点击SecondActivity左上角的后退按钮时MainActivity的SavedInstanceState为空

问题描述 投票:0回答:0

我正在开发一个实用的新应用程序,用于 Android 基础知识 02.2:

Android基础02.2:Activity生命周期和状态

请滑到网页底部,出现问题的项目是哪里

我的问题在题中,补充如下:无论是点击Second Activity的后退按钮回到MainActivity,还是在MainActivity中旋转屏幕,MainActivity都会执行onSaveInstanceState方法被销毁,然后重新创建。但是在前者在重新创建时onCreatesavedInstanceState参数为null,后者不为null,正常,又能显示Bundle中存储的数据。请问是什么原因造成的?

请让我说明使问题重现的程序:

  1. 运行应用程序
  2. 在editText中输入内容,然后点击SEND
  3. 在 Second Activity 的 editText 中输入内容,然后点击 REPLY
  4. 在MainActivity的顶部可以看到你在Second Activity中输入的内容显示
  5. 继续输入内容点击发送启动第二个活动
  6. 现在单击 SecondActivity 左上角的后退按钮,而不是单击回复

现在可以看到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");
}
}
android android-activity android-fragmentactivity oncreate onsaveinstancestate
© www.soinside.com 2019 - 2024. All rights reserved.