关于ZAKER 融媒体解决方案 合作 加入

android- 如何保存数据并重新打开上次使用的 .

CocoaChina 10-23

我已经掌握了大部分游戏技巧 , 现在我需要能够:

> 保存当前活动的所有数据 , 并在返回时进行检索 ( 如果需要的话 , 我将感谢一个 SharedPreferences 示例 )

> 重新打开离开时和离开时的同一活动 .

为了更清楚一点:每次应用程序关闭或被杀死时 , 我都不想从我的主活动中重新启动 .

编辑:

好了 , 我已使用此Google article来保存我的活动并稍后重新创建 .

我的活动之一中的代码如下:

的 onCreate ( )

@Overrideprotected void onCreate ( Bundle savedInstanceState ) { super.onCreate ( savedInstanceState ) ; setContentView ( R.layout.activity_player_selection ) ; // Check whether we're recreating a previously destroyed instance if ( savedInstanceState != null ) { // Restore value of members from saved state village = savedInstanceState.getString ( VILLAGE ) ; seekBarProgress = savedInstanceState.getInt ( PROGRESS ) ; } else { // Probably initialize members with default values for a new instance initializeVariables ( ) ; Bundle bundle = getIntent ( ) .getExtras ( ) ; village = bundle.getString ( VILLAGE ) ; } [ ... ] // Other code skipped }

的 onSaveInstanceState ( )

@Overridepublic void onSaveInstanceState ( Bundle savedInstanceState ) { // Save the user's current game state savedInstanceState.putString ( VILLAGE, village ) ; savedInstanceState.putInt ( PROGRESS, seekBarProgress ) ; // Always call the superclass so it can save the view hierarchy state super.onSaveInstanceState ( savedInstanceState ) ;}

因此 , 我创建了一个Dispatcher Activity ( 现在是我的 Main ) , 当该应用程序被杀死然后重新启动时 , 它知道哪个是最后一个打开的 Activity. 但是当我尝试这样做时 , 它应该打开 ( 即 ) PlayerSelection 活动 , 我得到一个

java.lang.NullPointerException

在运行这部分代码时

其他 {

????// 可能使用新实例的默认值初始化成员

????initializeVariables ( ) ;

???? 捆绑包 bundle = getIntent ( ) .getExtras ( ) ;

???? 村庄 = bundle.getString ( VILLAGE ) ;

}

而不是前一个 if 语句 , 它将运行 else.

调度员

这是分派器活动 , 它过滤应启动的活动:

public class Dispatcher extends Activity {@Overrideprotected void onCreate ( Bundle savedInstanceState ) { super.onCreate ( savedInstanceState ) ; Class<?> activityClass; try { SharedPreferences prefs = getSharedPreferences ( "X", MODE_PRIVATE ) ; activityClass = Class.forName ( prefs.getString ( "lastActivity", MainActivity.class.getName ( ) ) ) ; } catch ( ClassNotFoundException ex ) { activityClass = MainActivity.class; } startActivity ( new Intent ( this, activityClass ) ) ; }}

这是我发送给调度程序活动的内容:

@Overrideprotected void onPause ( ) { super.onPause ( ) ; SharedPreferences prefs = getSharedPreferences ( "X", MODE_PRIVATE ) ; SharedPreferences.Editor editor = prefs.edit ( ) ; editor.putString ( "lastActivity", getClass ( ) .getName ( ) ) ; editor.commit ( ) ; }}

为什么会发生?我该怎么做才能解决此问题?

Why does it happen?

在 onSaveInstanceState 中创建的 Bundle 仅保留用于短期重启 , 例如由于方向变化而重新创建活动时 . 如果您的活动正常停止 , 则不会保留此捆绑包 , 因此无法将其交付给 onCreate.

What can I do to fix this?

不要使用 instanceState 模型 , 而是将活动状态保存在 SharedPreferences 中 ( 类似于您已经保存的 lastActivity ) .

您应将状态保存在 onStop 或 onPause 中 , 并将其分别还原到 onStart 或 onResume 中 . 在大多数情况下 , 前者已足够 , 而后者仅产生不必要的开销 .

@Overrideprotected void onStart ( ) { super.onStart ( ) ; String saved = sharedPreferences.getString ( "myKey", null ) ; MyPojo pojo; if ( saved == null ) { pojo = defaultValue; }else { pojo = new Gson ( ) .fromJson ( saved, MyPojo.class ) ; }}@Overrideprotected void onStop ( ) { sharedPreferences.edit ( ) .putString ( "myKey", new Gson ( ) .toJson ( pojo ) ) .apply ( ) ; super.onStop ( ) ;}

以上内容由"CocoaChina"上传发布 查看原文
相关标签 数据google调度员

觉得文章不错,微信扫描分享好友

扫码分享