TextView有时会在配置更改或主页按钮上丢失内容



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添加到清单中的ActivityonCreate ()现在只被调用一次。尽管如此,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 savedInstanceStatenull,不能用于恢复TextView。但是,"活动"中的静态变量会被保留。

解决方案:要在该销毁-创建转换中保留TextView内容,请将内容保存在onSaveInstanceState()中的静态变量中,然后在onCreate()中恢复。在这种情况下,onRestoreInstanceState()永远不会被调用,也不能被使用。

我在安卓7.0的设备上验证了这个解决方案。其他安卓版本的表现可能有所不同。遗憾的是,安卓系统的文档太少了。

最新更新