从一个活动获得价值到另一个活动

时间:2016-10-18 07:52:31

标签: android

如何使用savePreferencesloadPreferences方法 在第一个活动

private static final String GLOBAL_PREFERENCES = "music_status";

public static void savePreferences(@NonNull Context context, String key, int value) {
    SharedPreferences sharedPreferences = context.getSharedPreferences(GLOBAL_PREFERENCES, Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPreferences.edit();
    editor.putInt(key, value);
    editor.apply();
}...
protected void onResume() {
    super.onResume();

    musicGroup = (RadioGroup) findViewById(R.id.radioGroupForMusic);
    turnOn = (RadioButton) findViewById(R.id.radioButtonMusicOn);
    turnOff = (RadioButton) findViewById(R.id.radioButtonMusicOff);
    musicGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(RadioGroup group, int checkedId) {
            switch (checkedId){
                case R.id.radioButtonMusicOff:
                    mediaPlayer.pause();
                    savePreferences(MainMenuActivity.this,"music_status",0);
                case R.id.radioButtonMusicOn:
                    mediaPlayer.start();
                    savePreferences(MainMenuActivity.this,"music_status",1);
            }
        }
    });

}

第二项活动

private static final String GLOBAL_PREFERENCES = "music_status";
public static int loadPreferences(@NonNull Context context, String key, int defaultValue) {
    SharedPreferences sharedPreferences = context.getSharedPreferences(GLOBAL_PREFERENCES, Context.MODE_PRIVATE);
    return sharedPreferences.getInt(key, defaultValue);
}

但我不知道如何从第一项活动中获取价值

3 个答案:

答案 0 :(得分:4)

简短的回答是你不能那样做。除非您的status变量是静态的。这种情况非常糟糕。

你有三个选择。

SharedPreferences

与我之前的修订版相反。这可能是您案例的最佳选择。

如果您只想保存某些内容的状态,您可能会发现最好不要使用类来保存音乐的状态。你可以这样做,@ cricket_007建议并实施SharedPreferences

您可以使用以下示例函数:

private static final String GLOBAL_PREFERENCES = "a.nice.identifier.for.your.preferences.goes.here";

public static void savePreferences(@NonNull Context context, String key, int value) {
    SharedPreferences sharedPreferences = context.getSharedPreferences(GLOBAL_PREFERENCES, Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPreferences.edit();
    editor.putInt(key, value);
    editor.apply();
}

public static int loadPreferences(@NonNull Context context, String key, int defaultValue) {
    SharedPreferences sharedPreferences = context.getSharedPreferences(GLOBAL_PREFERENCES, Context.MODE_PRIVATE);
    return sharedPreferences.getInt(key, defaultValue);
}

然后,您可以在代码中使用这些功能来保存音乐的状态。您可以使用status.setStatus(0);而不是status.setStatus(1);代替Utils.savePreferences(context, "music_status", 1);status.getStatus(),而不是Utils.loadPreferences(context, "music_status", 0);

Parcelable

Parcelable课程中的

One option for you is to implement musicStatus。然后,您可以通过Intent将对象发送到第二个活动。您可以在下面找到一个实现Parcelable的示例类。

一旦你拥有了它,你就可以通过Intent传递它:

musicStatus status = new musicStatus();
status.setStatus(8);
Intent intent = new Intent(this, HighScoreActivity.class);
intent.putExtra("status", status);
startActivity(intent);

班级实施:

public class musicStatus implements Parcelable {
    private int status;

    public int getStatus() {
        return status;
    }

    public void setStatus(int status){
        this.status = status;
    }

    private musicStatus(Parcel in) {
        status = in.readInt();
    }

    public void writeToParcel(Parcel out, int flags) {
        out.writeInt(status);
    }

    public static final Parcelable.Creator<musicStatus> CREATOR = new Parcelable.Creator<musicStatus>() {
        public musicStatus createFromParcel(Parcel in) {
            return new musicStatus(in);
        }

        public musicStatus[] newArray(int size) {
            return new musicStatus[size];
        }
    };

    public int describeContents() {
        return 0;
    }
}

的Singleton

在这种情况下,这确实是一种反模式。但是,它仍有可能。

public class musicStatus {
    private static musicStatus mInstance = null;
    private int status;

    @NonNull
    public static musicStatus getInstance() {
        if (mInstance == null) {
            synchronized(mInstance) {
                if (mInstance == null) {
                    mInstance = new musicStatus();
                }
            }
        }
    }

    public int getStatus(){
        return status;
    }

    public  void setStatus(int status){
        this.status = status;
    }
}

答案 1 :(得分:2)

最简单的方法是,您的musicStatus类需要实现Serializable。

Bundle bundle = new Bundle();
bundle.putSerializable("musicStatus", status);
intent.putExtras(bundle);

在其他活动中:

Intent intent = this.getIntent();
Bundle bundle = intent.getExtras();

musicStatus status=
               (musicStatus)bundle.getSerializable("musicStatus");

答案 2 :(得分:0)

在您的POJO课程中扩展Serviceable

在开始活动2之后。

  intetn.putExtra("obj",pojoObj);

并使用。

获取第二项活动
PojoCls obj = (PojoCls)getIntent().getSerializableExtra("obj");

多数民众赞成。