如何保存android活动的状态

Posted

技术标签:

【中文标题】如何保存android活动的状态【英文标题】:How to preserve the state of android activity 【发布时间】: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 来控制行为 【参考方案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;

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

【讨论】:

以上是关于如何保存android活动的状态的主要内容,如果未能解决你的问题,请参考以下文章

Android活动导航保存状态

在Android recyclerVIew中单击项目时如何保存状态

Android:通过保存 Activity 状态进行测试的捷径

Android Fragment 在按下后退按钮时未保存 UI 状态

如何在android中检查3g是不是处于活动状态

如何保存和加载 Android 活动的预设?