Android激励视频广告积分持久化问题:如何保留退出应用后的积分
解决积分持久化问题:别用onDestroy或savedInstanceState!
嘿,我来帮你搞定这个积分重启就消失的问题!首先得说清楚:onDestroy和savedInstanceState都不适合用来持久化用户的积分数据,原因如下:
savedInstanceState只是用来保存临时状态的(比如屏幕旋转时的界面状态),当应用完全退出、进程被系统杀死后,这个存储的状态就会丢失,根本存不住长期数据。onDestroy方法不可靠,系统在内存紧张的时候可能直接杀死你的应用进程,根本不会调用这个方法,所以靠它存数据完全没保障。
那该用啥?给你两个实用方案,按需选:
方案1:本地轻量存储——SharedPreferences
这个方案适合只需要在本地保存积分的场景,简单又高效。
修改步骤:
- 读取保存的积分:在
onCreate方法里,初始化pointCount的时候,从SharedPreferences里读取之前保存的值,而不是直接设为0。 - 保存积分:每次用户获得积分(
addPoints方法里),把更新后的pointCount存到SharedPreferences里。
修改后的关键代码:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_profile); // ... 其他初始化代码 ... // 积分统计:从SharedPreferences读取保存的积分 mText = findViewById(R.id.textView); SharedPreferences prefs = getSharedPreferences("MyAppPrefs", MODE_PRIVATE); pointCount = prefs.getInt("user_points", 0); // 默认值0 mText.setText("Points: " + pointCount); loadRewardedVideoAd(); } private void addPoints(int points) { pointCount += points; mText.setText("Points: " + pointCount); // 保存积分到SharedPreferences SharedPreferences prefs = getSharedPreferences("MyAppPrefs", MODE_PRIVATE); SharedPreferences.Editor editor = prefs.edit(); editor.putInt("user_points", pointCount); editor.apply(); // 异步保存,不阻塞主线程 }
方案2:跨设备同步——Firebase实时数据库
你代码里已经引入了Firebase的相关类,如果你想让用户换设备登录后也能看到自己的积分,这个方案就完美适配。
修改步骤:
- 获取当前用户ID:利用你已有的
firebaseUser获取UID,作为数据库中用户节点的唯一标识。 - 读取云端积分:在
onCreate里监听数据库中用户积分的变化,实时更新UI。 - 更新云端积分:每次用户获得积分时,把新的积分值同步到Firebase数据库。
修改后的关键代码:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_profile); // ... 其他初始化代码 ... firebaseAuth = FirebaseAuth.getInstance(); firebaseUser = firebaseAuth.getCurrentUser(); firebaseDatabase = FirebaseDatabase.getInstance(); databaseReference = firebaseDatabase.getReference("users").child(firebaseUser.getUid()); // 积分统计:从Firebase读取用户积分 mText = findViewById(R.id.textView); // 监听积分变化,实时更新UI databaseReference.child("points").addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { if (snapshot.exists()) { pointCount = snapshot.getValue(Integer.class); } else { pointCount = 0; } mText.setText("Points: " + pointCount); } @Override public void onCancelled(@NonNull DatabaseError error) { Toast.makeText(ProfileActivity.this, "读取积分失败", Toast.LENGTH_SHORT).show(); } }); loadRewardedVideoAd(); } private void addPoints(int points) { pointCount += points; mText.setText("Points: " + pointCount); // 同步积分到Firebase数据库 databaseReference.child("points").setValue(pointCount) .addOnSuccessListener(aVoid -> Toast.makeText(ProfileActivity.this, "积分已保存", Toast.LENGTH_SHORT).show()) .addOnFailureListener(e -> Toast.makeText(ProfileActivity.this, "保存积分失败", Toast.LENGTH_SHORT).show()); }
最后总结
- 只需要本地保存积分?选SharedPreferences,简单快捷。
- 需要跨设备同步或者云端备份?用Firebase实时数据库,刚好你已经引入了相关依赖,直接用就行。
内容的提问来源于stack exchange,提问作者Carlos Craig
相关产品推荐
相关产品推荐

