onSaveInstanceState保留活动的最新状态,即使活动已销毁或停止

问题描述:

在此类中,我重写了onSaveInstanceState和onRestoreInstanceState方法,但它使我能够在旋转屏幕时保持活动的最后一个状态,但是,如果我导航到另一个活动,或者我去我的设备的首页,它不保持最新状态,并开始一个新的状态。onSaveInstanceState保留活动的最新状态,即使活动已销毁或停止

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putSerializable("mylist",mAdapter); 
} 

@Override 
protected void onRestoreInstanceState(Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 
    savedInstanceState.getSerializable("mylist"); 

} 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    try { 
     ViewConfiguration config = ViewConfiguration.get(this); 
     Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey"); 
     if (menuKeyField != null) { 
      menuKeyField.setAccessible(true); 
      menuKeyField.setBoolean(config, false); 
     } 
    } catch (Exception ex) { 
     // Ignore 
    } 
    //setHasOptionsMenu(true); 
    recyclerView = (RecyclerView) findViewById(R.id.card_recycler_view); 
    if (savedInstanceState != null && savedInstanceState.getSerializable("mylist")!=null) { 

     savedInstanceState.getSerializable("mylist"); 
     update_START(); 
     recyclerView.setHasFixedSize(true); 
     RecyclerView.LayoutManager layoutManager = new GridLayoutManager(this, 2); 
     recyclerView.setLayoutManager(layoutManager); 
     recyclerView.setAdapter(mAdapter); 
    }else { 
     update_START(); 
     recyclerView.setHasFixedSize(true); 
     RecyclerView.LayoutManager layoutManager = new GridLayoutManager(this, 2); 
     recyclerView.setLayoutManager(layoutManager); 
     recyclerView.setAdapter(mAdapter); 
    } 
} 

任何机构可以告诉我,我应该怎么添加到我的INFORCE活动,以保持其最新状态,即使该活动已被破坏,我的任何代码块添加到任何其他的活动?

我onPostExecute方法如下:

@Override 
    protected void onPostExecute(ArrayList<MovieEntity> result) { 
     mAdapter=null; 
     mAdapter = new ImagesAdapter(getBaseContext(), result); 
     recyclerView.setAdapter(mAdapter); 
    } 

这是我的Manifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.example.prof_mohamed.movieapp"> 

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 

<receiver 
    android:name=".ConnectivityReceiver" 
    android:enabled="true"> 
    <intent-filter> 
     <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> 
    </intent-filter> 
</receiver> 
<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 
    <activity android:name=".MainActivity" android:label="Pop Movies"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <activity android:name=".DetailActivity" android:label="MovieDetail"></activity> 
</application> 

,推测当我活动之间,甚至其他应用程序之间,然后导航返回我的第一个正在运行的应用程序,它应该在开始导航到其他活动或应用程序之前恢复其最新保存的状态

+0

发表您的清单,请 –

+0

@DavidWasser我编辑了我的文章,包括我的Manifest.xml文件,请查看我的Manifest文件的当前状态。 –

+0

您是否启用了开发者选项“不要保留活动”?请将日志记录添加到每个活动的'onDestroy()'中,并查看是否调用了此方法。我的代码或清单中没有看到任何奇怪的东西。你在真实的设备或模拟器上测试吗? –

在开发商选择“不保留活动”选项被启用,你必须让残疾人,现在每一件事正在运行,在活动导航,Home键导航,以及屏幕旋转节能状态,除了重写这两种方法

@Override

保护无效onRestoreInstanceState(捆绑savedInstanceState){

super.onRestoreInstanceState(savedInstanceState); 
    if (savedInstanceState != null && savedInstanceState.getSerializable("mylist")!=null) { 

     savedInstanceState.getSerializable("mylist"); 
    } 
} 

@Override 保护无效onRestoreInstanceState(捆绑savedIns tanceState){

super.onRestoreInstanceState(savedInstanceState);
savedInstanceState.getSerializable( “MYLIST”);

}

@覆盖 保护无效的onCreate(捆绑savedInstanceState){

super.onCreate(savedInstanceState); 
    savedInstanceState.getSerializable("mylist"); 

}

将让您的应用程序保存其状态完全...

+0

通过禁用不守活动您的应用程序可能现在运行良好。但你也需要照顾这种情况。此选项提供给测试应用程序的情况下,系统杀死活动和索赔内存并重新创建它。请搜索并研究这一点。在禁用后,调试您的代码在调用这些方法onRestoreInstanceState和onSaveInstnaceState时不要保留激活选项 – Ramit

如果你想保存状态以备以后使用,你可以写在任何sqlite的分贝或持久性存储必要的数据。通过这种设计,您必须保存使活动处于相同状态所需的所有数据。还有其他选项,但将数据保存在永久性存储中,以满足您的需求和安全。 (假设你想要一个活动始终坚持其状态的事件却破坏)和的onSaveInstanceState自动OnRestoreInstanceState保存视图状态(图采用XML定义ID)不仅旋转,而且通过系统内存要求活动杀。所以你也必须保存视图状态。 (与输入的数据前的EditText或复选框等)

+0

请原谅,亲爱的,你可以在这里用一个完整的资源来评论,比如描述你所说的视频。由于 –

+0

我说了很多东西,对于这部分,你需要澄清请注明,所以我可以为您提供链接 – Ramit

+0

我用一个自定义适配器膨胀在我的recyclerview形象海报。我想有一个链接状态保存这个rec​​yclerview的屏幕旋转,活动和Home键导航使用SQLite保存视图状态或任何 –

首先,你不使用savedInstanceState.getSerializable(“MYLIST”)正确,您应该保存和传递对象的变量和使用它:

列表列表=(列表)savedInstanceState.getSerializable( “MYLIST”);

此时,束被恢复仅在onCreate方法(例如在旋转时的活性被破坏然后重新创建)

为了支持节省活动导航实例状态时,或者当在家按钮被按下时(这称之为的onStop然后在onStart),把相同的逻辑在onRestoreInstanceState内如果条件被后在onStart调用。

+0

亲爱的Karim, 当我把下面两个逻辑放在onRestoreInsatnceState里面,条件是 1. mAdapter =(ImagesAdapter)savedInstanceState.getSerializable(“mylist”); 2. list =(ArrayList)savedInstanceState。getSerializable( “MYLIST”); mAdapter = new ImagesAdapter(getBaseContext(),list); 在现实中,它没有任何意义,它不会影响节能状态 –

+0

答案是禁用的开发商选择“不保留活动” ......非常感谢 –