java - 捆绑存储在变量中的数据
问题描述
我正在开发一个简单的 Android Studio 应用程序,我有一个关于将信息保存到包中的过程的问题,以便在活动恢复时保留它以供下一个实例使用(更准确地说,当手机从睡眠中唤醒时) . 如果我要说错什么或我理解错了什么,请纠正我。
所以我将文本视图的文本保存到onSaveInstanceState中的一个包中,并在onRestoreInstanceState方法中“恢复”它,这样当我旋转手机时,文本视图的内容不会被删除并被保留。现在,为了将适当的文本保存到包中,我使用了一个final变量(我真的不明白如果你从包中存储一些东西,为什么它应该是最终的,即使它可以双向工作,但也许有安全解释或其他内容),如下例所示。我对所有事情都有一些疑问:
如果变量是final,并且您在其中存储了以后应该保存什么的提示,那么我们以后如何存储我们不想再次丢失的文本的值,因为它是final?根据维基百科:
一旦分配了最终变量,它总是包含相同的值。如果 final 变量持有对对象的引用,那么对象的状态可能会通过对对象的操作而改变,但变量总是引用同一个对象(final 的这个属性称为非传递性)。
将我们不想丢失的值存储到最终变量中的目的是什么?
(最重要)如果程序执行后所有变量都被删除了,那么我们如何将我们不想丢失的东西的值存储到应该删除的东西中并且仍然保留该值?
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");
}
}
解决方案
推荐阅读
- android - 如何在 Kotlin 中将对象列表从活动 A 传递到活动 B?
- python - 如何在 Pandas 数据框中获取列表的长度
- c# - 保护 Excel 中的某些单元格 - C# Epplus
- vb.net - 如何在 VB.Net 中的 Application.word 上使用 DocumentBeforeClose 事件
- java - 在不停止掷骰子的情况下无法添加音效
- r - 使用 R 中的 put_acl() 为 S3 存储桶中的对象设置(或更改)ACL?
- node.js - 如何在nestjs中加入两个模式?
- ios - Xcode11 Swift5 框架不包含模拟器的头文件,仅适用于 arm64 和 armv7a
- java - 按执行顺序列出给定进程的所有任务
- assembly - 整数相乘的 ASM 代码实现