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

如何在Android不同Activity间持续修改并共享value变量?

嘿,这个问题我太熟了——你踩了一个Android新手常犯的坑:每个继承HomePage的Activity都是独立的实例,你在之前页面里修改的value,和新跳转的Activity里的value根本不是同一个变量!所以跳转后自然拿不到之前修改的值。

下面给你几种靠谱的解决方案,从简单到符合现代Android架构的都有:

方案1:用自定义Application存全局变量(最简单的全局共享)

Application是整个App的全局上下文,它的实例在App运行期间只有一个,完美用来存这种跨页面共享的状态。

步骤1:创建自定义Application类

public class MyApp extends Application {
    private int globalValue;

    // 提供get/set方法来操作这个值
    public int getGlobalValue() {
        return globalValue;
    }

    public void setGlobalValue(int globalValue) {
        this.globalValue = globalValue;
    }
}

步骤2:在Manifest里注册它

打开AndroidManifest.xml,给<application>标签加上android:name属性:

<application
    android:name=".MyApp"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    ...>
    <!-- 你的Activity等组件配置 -->
</application>

步骤3:在你的Activity里修改/获取值

public class XXXXXX extends HomePage {
    int times;
    Button Next;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 初始化你的布局、按钮绑定等操作
    }

    public void onClick(View view) {
        // 获取全局Application实例
        MyApp myApp = (MyApp) getApplicationContext();
        switch (times) {
            case 0:
                // 修改全局value
                myApp.setGlobalValue(myApp.getGlobalValue() + 1);
                times++;
                break;
            case 1:
                startActivity(new Intent(XXXXXX.this, Showvalue.class));
                break;
        }
    }
}

在Showvalue里获取值

public class Showvalue extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_showvalue);
        
        MyApp myApp = (MyApp) getApplicationContext();
        int currentValue = myApp.getGlobalValue();
        // 这里把currentValue显示到TextView或者其他控件里
    }
}

方案2:用Jetpack ViewModel(推荐,符合现代Android架构)

ViewModel是Google Jetpack提供的组件,专门用来存储UI相关的数据,它的生命周期不受Activity重建(比如旋转屏幕)影响,而且能轻松实现跨页面共享。

步骤1:创建共享ViewModel

import androidx.lifecycle.ViewModel;

public class SharedValueViewModel extends ViewModel {
    private int value = 0;

    // 封装自增逻辑,对外只暴露方法,不直接操作变量
    public void incrementValue() {
        value++;
    }

    public int getValue() {
        return value;
    }
}

步骤2:在你的Activity里使用ViewModel

import androidx.lifecycle.ViewModelProvider;

public class XXXXXX extends HomePage {
    int times;
    Button Next;
    private SharedValueViewModel viewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 获取全局共享的ViewModel(用Application作为Owner,确保所有页面拿到同一个实例)
        viewModel = new ViewModelProvider((ViewModelStoreOwner) getApplication()).get(SharedValueViewModel.class);
    }

    public void onClick(View view) {
        switch (times) {
            case 0:
                viewModel.incrementValue();
                times++;
                break;
            case 1:
                startActivity(new Intent(XXXXXX.this, Showvalue.class));
                break;
        }
    }
}

在Showvalue里获取值

import androidx.lifecycle.ViewModelProvider;

public class Showvalue extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_showvalue);
        
        SharedValueViewModel viewModel = new ViewModelProvider((ViewModelStoreOwner) getApplication()).get(SharedValueViewModel.class);
        int currentValue = viewModel.getValue();
        // 显示值
    }
}

方案3:用单例类存储(轻量全局状态)

单例类也是全局唯一的实例,适合存储这种简单的数值状态:

public class ValueManager {
    // 单例实例
    private static ValueManager instance;
    private int value = 0;

    // 私有构造方法,防止外部实例化
    private ValueManager() {}

    // 获取单例的方法,加synchronized保证线程安全
    public static synchronized ValueManager getInstance() {
        if (instance == null) {
            instance = new ValueManager();
        }
        return instance;
    }

    public void incrementValue() {
        value++;
    }

    public int getValue() {
        return value;
    }
}

然后在你的Activity里用:

public void onClick(View view) {
    switch (times) {
        case 0:
            ValueManager.getInstance().incrementValue();
            times++;
            break;
        case 1:
            startActivity(new Intent(XXXXXX.this, Showvalue.class));
            break;
    }
}

在Showvalue里获取:

int currentValue = ValueManager.getInstance().getValue();

方案4:Intent传递+返回结果(适合少量页面跳转场景)

如果只是在两个页面间传递值,也可以用Intent传参+返回结果,但如果是多次跳转,这种方式会很繁琐,适合简单场景:

在XXXXXX里跳转时传值

case 1:
    Intent intent = new Intent(XXXXXX.this, Showvalue.class);
    intent.putExtra("current_value", value);
    startActivityForResult(intent, 100); // 100是请求码,自己定义
    break;

在Showvalue里接收并返回修改后的值

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_showvalue);
    
    // 接收传递过来的值
    int currentValue = getIntent().getIntExtra("current_value", 0);
    
    // 假设你在Showvalue里也修改了值,然后返回
    // 比如点击某个按钮后:
    Button backBtn = findViewById(R.id.back_btn);
    backBtn.setOnClickListener(v -> {
        Intent resultIntent = new Intent();
        resultIntent.putExtra("updated_value", currentValue + 1); // 假设修改了值
        setResult(RESULT_OK, resultIntent);
        finish();
    });
}

在XXXXXX里接收返回结果

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 100 && resultCode == RESULT_OK) {
        // 更新当前页面的value
        value = data.getIntExtra("updated_value", 0);
    }
}

内容的提问来源于stack exchange,提问作者Cyrus Emiya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:15:23