首页 > 解决方案 > 捆绑存储在变量中的数据

问题描述

我正在开发一个简单的 Android Studio 应用程序,我有一个关于将信息保存到包中的过程的问题,以便在活动恢复时保留它以供下一个实例使用(更准确地说,当手机从睡眠中唤醒时) . 如果我要说错什么或我理解错了什么,请纠正我。

所以我将文本视图的文本保存到onSaveInstanceState中的一个包中,并在onRestoreInstanceState方法中“恢复”它,这样当我旋转手机时,文本视图的内容不会被删除并被保留。现在,为了将适当的文本保存到包中,我使用了一个final变量(我真的不明白如果你从包中存储一些东西,为什么它应该是最终的,即使它可以双向工作,但也许有安全解释或其他内容),如下例所示。我对所有事情都有一些疑问:

  1. 如果变量是final,并且您在其中存储了以后应该保存什么的提示,那么我们以后如何存储我们不想再次丢失的文本的值,因为它是final?根据维基百科:

    一旦分配了最终变量,它总是包含相同的值。如果 final 变量持有对对象的引用,那么对象的状态可能会通过对对象的操作而改变,但变量总是引用同一个对象(final 的这个属性称为非传递性)。

  2. 将我们不想丢失的值存储到最终变量中的目的是什么?

  3. (最重要)如果程序执行后所有变量都被删除了,那么我们如何将我们不想丢失的东西的值存储到应该删除的东西中并且仍然保留该值?

PS我正在学习Android Studio课程,我真的被困在这里,这就是我问的原因。

package academy.learnprogramming.buttonclickapp;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.text.method.ScrollingMovementMethod;
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 EditText userInput;
    private TextView textView;
    private static final String TAG = "MainActivity";
    private final String TEXT_CONTENTS = "TextContents";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Log.d(TAG, "onCreate: in");

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        userInput = findViewById(R.id.editText);
        Button button = findViewById(R.id.button);
        textView = findViewById(R.id.textView);

        textView.setMovementMethod(new ScrollingMovementMethod());

        View.OnClickListener ourOnClickListener = new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String result = userInput.getText().toString();
                result += "\n";
                textView.append(result);
                userInput.setText("");
            }
        };
        button.setOnClickListener(ourOnClickListener);
        Log.d(TAG, "onCreate: out");
    }

    @Override
    protected void onStart() {
        Log.d(TAG, "onStart: in");
        super.onStart();
        Log.d(TAG, "onStart: out");
    }

    @Override
    protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
        Log.d(TAG, "onRestoreInstanceState: in");
        super.onRestoreInstanceState(savedInstanceState);
        textView.setText(savedInstanceState.getString(TEXT_CONTENTS));
        Log.d(TAG, "onRestoreInstanceState: out");
    }

    @Override
    protected void onRestart() {
        Log.d(TAG, "onRestart: in");
        super.onRestart();
        Log.d(TAG, "onRestart: out");
    }

    @Override
    protected void onResume() {
        Log.d(TAG, "onResume: in");
        super.onResume();
        Log.d(TAG, "onResume: out");
    }

    @Override
    protected void onPause() {
        Log.d(TAG, "onPause: in");
        super.onPause();
        Log.d(TAG, "onPause: out");
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        Log.d(TAG, "onSaveInstanceState: in");
        outState.putString(TEXT_CONTENTS, textView.getText().toString());
        super.onSaveInstanceState(outState);
        Log.d(TAG, "onSaveInstanceState: out");
    }

    @Override
    protected void onStop() {
        Log.d(TAG, "onStop: in");
        super.onStop();
        Log.d(TAG, "onStop: out");
    }

    @Override
    protected void onDestroy() {
        Log.d(TAG, "onDestroy: in");
        super.onDestroy();
        Log.d(TAG, "onDestroy: out");
    }
}

活动生命周期

标签: javaandroid-studiovariablesbundle

解决方案


推荐阅读