TextView
慢慢地被来自后台服务的文本填充。我已经重写了MainActivity
中的onSaveInstanceState
((和onRestoreInstanceState
((方法,并在布局中向TextView
添加了android:freezesText="true"
属性。在大多数情况下,当设备旋转或应用程序最小化时,按下主页按钮,然后启动另一个应用程序时,TextView
的内容将被保留。然而,内容有时会丢失。由于它是由后台服务缓慢收集的,因此无法轻易恢复,并且丢失了有价值的信息。
我正在安卓7.0的设备上测试该应用程序,但我也将其分发到了其他不同安卓版本的设备上,它运行良好,只是偶尔会丢失信息。
public class MainActivity extends AppCompatActivity {
private TextView textView;
static private boolean firstRun = true;
private final BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
if (bundle != null) {
String newPost = bundle.getString(MyService.POST);
textView.append((new Date()).toString().substring(11, 19) + " " + newPost + "n");
// Delete 250 leading chars if too many
Editable ed = textView.getEditableText();
int len = ed.length();
if( len > 5000 ) ed.delete(0, 250);
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.idTextView);
if( firstRun ) {
firstRun = false;
Intent intent = new Intent(this, MyService.class);
startService(intent);
}
}
@Override
protected void onSaveInstanceState(@NonNull Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
savedInstanceState.putCharSequence("TEXTVIEW", textView.getText());
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
CharSequence viewContents = savedInstanceState.getCharSequence("TEXTVIEW");
textView.setText(viewContents);
}
@Override
protected void onResume() {
super.onResume();
registerReceiver(receiver, new IntentFilter(MyService.NOTIFICATION));
}
}
我读过很多关于类似问题的帖子,我已经尽了我所能来避免它
EDIT:我已将属性android:configChanges
添加到清单中的Activity
。onCreate ()
现在只被调用一次。尽管如此,TextView
内容有时会因应用程序重新启动而丢失。只有当应用程序被重新绘制、重新配置或被带到前台时,才会发生这种情况。为什么要重新启动?Android Studio中的Logcat报告没有问题。
您使用共享偏好
对于渐变
implementation 'com.google.code.gson:gson:2.8.8'
初始化共享偏好
SharedPreferences mPrefs = getPreferences(MODE_PRIVATE);
保存数据或任何对象和类别
MyObject myObject = new MyObject;
Editor prefsEditor = mPrefs.edit();
Gson gson = new Gson();
String json = gson.toJson(myObject);
prefsEditor.putString("MyObject", json);
prefsEditor.commit();
获取数据
Gson gson = new Gson();
String json = mPrefs.getString("MyObject", "");
MyObject obj = gson.fromJson(json, MyObject.class);
还检查作为参数传递给onCreate
方法的Bundle
@Override
protected void onCreate(Bundle savedInstanceState) {
... your code
checkInstanceState(savedInstanceState); // at the end after GUI init
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
checkInstanceState(savedInstanceState);
}
private void checkInstanceState(Bundle savedInstanceState) {
if (savedInstanceState==null) return;
CharSequence viewContents = savedInstanceState.getCharSequence("TEXTVIEW");
textView.setText(viewContents);
}
当Android偶尔在后台破坏活动,并在应用程序进入前台时重新创建活动时,TextView
内容就会丢失。在这种情况下,在对onCreate()
的调用中,Bundle savedInstanceState
是null
,不能用于恢复TextView
。但是,"活动"中的静态变量会被保留。
解决方案:要在该销毁-创建转换中保留TextView
内容,请将内容保存在onSaveInstanceState()
中的静态变量中,然后在onCreate()
中恢复。在这种情况下,onRestoreInstanceState()
永远不会被调用,也不能被使用。
我在安卓7.0的设备上验证了这个解决方案。其他安卓版本的表现可能有所不同。遗憾的是,安卓系统的文档太少了。