You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android激励视频广告积分持久化问题:如何保留退出应用后的积分

解决积分持久化问题:别用onDestroy或savedInstanceState!

嘿,我来帮你搞定这个积分重启就消失的问题!首先得说清楚:onDestroy和savedInstanceState都不适合用来持久化用户的积分数据,原因如下:

  • savedInstanceState 只是用来保存临时状态的(比如屏幕旋转时的界面状态),当应用完全退出、进程被系统杀死后,这个存储的状态就会丢失,根本存不住长期数据。
  • onDestroy 方法不可靠,系统在内存紧张的时候可能直接杀死你的应用进程,根本不会调用这个方法,所以靠它存数据完全没保障。

那该用啥?给你两个实用方案,按需选:

方案1:本地轻量存储——SharedPreferences

这个方案适合只需要在本地保存积分的场景,简单又高效。

修改步骤:

  1. 读取保存的积分:在onCreate方法里,初始化pointCount的时候,从SharedPreferences里读取之前保存的值,而不是直接设为0。
  2. 保存积分:每次用户获得积分(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的相关类,如果你想让用户换设备登录后也能看到自己的积分,这个方案就完美适配。

修改步骤:

  1. 获取当前用户ID:利用你已有的firebaseUser获取UID,作为数据库中用户节点的唯一标识。
  2. 读取云端积分:在onCreate里监听数据库中用户积分的变化,实时更新UI。
  3. 更新云端积分:每次用户获得积分时,把新的积分值同步到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 14:19:07