Я работаю над простым Android Студийным приложением, и у меня есть вопрос, касающийся процесса сохранения информации в пакет, чтобы сохранить ее для следующего экземпляра при возобновлении активности (когда телефон просыпается из спать, точнее). Если я собираюсь что-то сказать неправильно или я что-то не так понял, поправьте меня.
Поэтому я сохранил текст текстового представления в пакет в onSaveInstanceState и «восстановил» его в onRestoreInstanceState , чтобы при повороте телефона содержимое текстового представления не удалялось и сохранялось. Теперь, чтобы сохранить соответствующий текст в связке, я использовал переменную final (которую я не очень понимаю, почему она должна быть final , если вы сохраняете что-то из пакета в ней , хотя это работает в обоих направлениях, но, возможно, есть объяснение безопасности или что-то в этом роде), как в примере ниже. У меня есть несколько вопросов относительно всего:
Если переменная будет final , и вы сохраните в ней подсказку, что следует сохранить позже, то как мы можем позже сохраните значение текста, который мы не хотим потерять снова, так как это final ? Согласно Википедии:
После назначения конечной переменной она всегда содержит одно и то же значение. Если конечная переменная содержит ссылку на объект, то состояние объекта может быть изменено с помощью операций над объектом, но переменная всегда ссылается на один и тот же объект (это свойство final называется нетранзитивностью).
Какова цель сохранения значения, которое мы не хотим потерять, в конечную переменную?
(Наиболее важно) Если все переменные удаляются после выполнения программы, тогда как мы можем сохранить значение чего-то, что мы не хотим потерять, во что-то, что должно быть удалено, и при этом сохранить значение?
PS Я беру Android Студийный курс, и я действительно застрял здесь, и поэтому я спрашиваю.
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");
}
}