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

Android内购SharedPreferences存储后跨类调用及支付校验问题

从SharedPreferences读取支付状态并执行对应任务的实现方案

嘿,既然你已经把购买状态成功存在SharedPreferences里了,那在另一个类里读取判断就很简单啦!我分两种常见场景给你写具体代码:

首先先确认你的存储逻辑(参考)

先假设你在PremiumActivity的购买成功回调里是这么存状态的(如果你的逻辑不一样,后面读取时保持文件名和key一致就行):

// 购买成功后调用这段代码存入状态
SharedPreferences purchasePrefs = getSharedPreferences("PurchaseData", MODE_PRIVATE);
SharedPreferences.Editor editor = purchasePrefs.edit();
editor.putBoolean("hasPurchasedPremium", true);
editor.apply(); // 异步提交,比commit()更适合主线程

场景1:在普通Java类(非Activity/Fragment)中读取

普通类没有自带的Context,所以需要传入Context实例,注意尽量用Application Context避免内存泄漏:

public class PremiumFeatureManager {
    private final Context appContext;

    // 构造方法传入Context,建议传application context
    public PremiumFeatureManager(Context context) {
        this.appContext = context.getApplicationContext();
    }

    public void handlePremiumTask() {
        // 获取和存储时同名的SharedPreferences实例
        SharedPreferences prefs = appContext.getSharedPreferences("PurchaseData", Context.MODE_PRIVATE);
        // 读取支付状态,默认值设为false(未购买)
        boolean isPremiumUser = prefs.getBoolean("hasPurchasedPremium", false);

        if (isPremiumUser) {
            // 已支付,执行你的专属任务
            activatePremiumFeatures();
        } else {
            // 未支付,执行引导购买或限制功能的逻辑
            restrictNonPremiumAccess();
        }
    }

    private void activatePremiumFeatures() {
        // 这里写付费后的具体逻辑,比如解锁高级功能、加载专属内容
        Log.d("PremiumManager", "已解锁所有付费功能");
    }

    private void restrictNonPremiumAccess() {
        // 比如提示用户购买,或者隐藏付费内容
        Toast.makeText(appContext, "请先解锁付费权限哦", Toast.LENGTH_SHORT).show();
    }
}

在Activity里调用这个类的方式:

// 在任意Activity中
PremiumFeatureManager featureManager = new PremiumFeatureManager(this);
featureManager.handlePremiumTask();

场景2:在另一个Activity/Fragment中读取

这种情况更简单,直接用自身的Context获取SharedPreferences就行:

public class HomeActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);

        checkAndApplyPremiumStatus();
    }

    private void checkAndApplyPremiumStatus() {
        SharedPreferences prefs = getSharedPreferences("PurchaseData", MODE_PRIVATE);
        boolean isPurchased = prefs.getBoolean("hasPurchasedPremium", false);

        if (isPurchased) {
            // 执行付费后操作,比如隐藏广告、显示专属按钮
            findViewById(R.id.home_premium_btn).setVisibility(View.VISIBLE);
            findViewById(R.id.home_ad_banner).setVisibility(View.GONE);
        }
    }
}

几个重要提醒

  • 一定要保证SharedPreferences的文件名和存储时的完全一致,key值也要对应上,不然会读取到默认值
  • 不要直接用Activity的Context传给普通类,用getApplicationContext()可以避免内存泄漏
  • 为了安全性,建议结合Google Play Billing Library的购买凭证验证,不要只依赖SharedPreferences(毕竟用户可能手动修改本地文件绕过支付)

内容的提问来源于stack exchange,提问作者Mehran Kasebvatan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:29:20