【问题标题】:How to preserve the state of android activity如何保存android活动的状态
【发布时间】:2019-03-28 03:07:51
【问题描述】:

我有两个活动,我的MainActivity 和另一个名为DetailActivity 的活动。当应用程序首次启动时,它会打开 MainActivity 并在那里绑定 DataService 并调用以获取一些数据并填充列表视图。

从该列表视图中,用户有一个按钮可以为列表中的每个项目打开所谓的详细视图。打开该详细视图意味着开始第二个活动 (DetailActivity)。

这样做是这样的:

final Intent intent = new Intent(getContext(), DetailActivity.class);
intent.putExtra("data", dto);
getContext().startActivity(intent);

当第二个打开时,用户可以通过使用后退按钮(Android 上的主页按钮左侧)或单击标题中的后退箭头来返回。

除了当用户返回MainActivityDataService 再次绑定并调用获取数据并更新列表之外,一切都按预期工作。因此,如果用户位于项目编号的某个位置。 205 他会回到起始项目。

当用户返回它没有刷新时,有没有办法保存MainActivity 的数据或状态?

服务是这样绑定的

@Override
protected void onStart() {
    super.onStart();
    bind(DataService.class);
}

@Override
protected void onDestroy() {
    super.onDestroy();
    unbindService(connection);
}

private void bind(final Class... toBind) {
    for (final Class clazz : toBind) {
        bindService(new Intent(this, clazz), connection, BIND_AUTO_CREATE);
    }
}

private ServiceConnection connection = new ServiceConnection() {
    @Override
    public void onServiceConnected(final ComponentName name, final IBinder service) {
        if (service instanceof DataService.LocalBinder) {
            dataService = ((DataService.LocalBinder) service).getInstance();
            dataService.readData();
        }
    }

    @Override
    public void onServiceDisconnected(final ComponentName name) {
        // Empty By Default
    }
};

【问题讨论】:

  • 是的,对不起,英语不是我的第一语言。我使用了自动更正。
  • 你必须在 Parent Activity 中使用 savedinstancestate 来控制行为

标签: java android android-activity android-service android-service-binding


【解决方案1】:

您可以通过将服务绑定到onCreate() 而不是onStart() 来实现。

您还应该了解您的生命周期的对称性。目前,您在开始时绑定并在销毁时取消绑定。如果您在onStart 中绑定,您可能应该在onStop 中取消绑定。当您将绑定移动到onCreate 时,您可以将取消绑定保留在onDestroy

解释:onCreate() 在首次创建活动时被调用。每次您的活动变得可见时,都会调用onStart()

【讨论】:

  • 我仍然有同样的行为。我还注意到当我从第二个活动回来时调用了 onDestroy。我不确定这是否应该发生。
  • 如果您的设备内存不足或开发者选项中的“不保留活动”处于打开状态,那么您的活动将在它变得不可见时被销毁,并在它变得可见时重新创建。您可以通过实现“onSaveInstanceState(Bundle)”来保存这些情况下的活动状态。您可以将原始值或可序列化或可打包的对象放入捆绑包中,然后在“onCreate”的参数中将该捆绑包交付给您。例如,您可以将滚动项目的索引保存在那里,然后在再次获取数据后以编程方式滚动到它。
【解决方案2】:

设法像这样解决它

@Override
public boolean onSupportNavigateUp() {
    onBackPressed(); // one inherited from android.support.v4.app.FragmentActivity

    return false;
}

这样做是为了成功。我会回到我离开的地方,不需要加载任何数据,因为一切都已经存在了

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-24
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多