Sobes.tech
Junior

როგორ გადავცეთ მონაცემები ერთ Activity-დან მეორე Activity-მდე?

sobes.tech AI

პასუხი AI-სგან

Маалыматтарды өткөрүү жолдору:

  1. Intent Extras: Адатта колдонулган жол. Маалыматтар ачкыч-баа жуптары түрүндө Intentке кошулат.
// Жөнөтүүчү Activityде
Intent intent = new Intent(this, TargetActivity.class);
intent.putExtra("key_string", "Салам!");
intent.putExtra("key_int", 42);
intent.putExtra("key_boolean", true);
startActivity(intent);
// Алып жаткан Activityде
Bundle extras = getIntent().getExtras();
if (extras != null) {
    String stringData = extras.getString("key_string");
    int intData = extras.getInt("key_int");
    boolean booleanData = extras.getBoolean("key_boolean", false); // Дефолт мааниси менен
}

Талап кылынган түрлөрү: primitives, String, Bundle, Parcelable, Serializable. Кыйынчылык объекттери үчүн Parcelable артыкчылыкка ээ.

  1. ViewModel (LiveData же Channel менен): Көбүрөөк кыйын сценарийлер үчүн ылайыктуу, анда маалыматтар экранды бурууда сакталуусу керек же бир нече компоненттер тарабынан колдонулушу керек. DataFlow аркылуу MutableLiveData же Channel аркылуу ишке ашырылат.
// Жалпы ViewModelде (мисалы, хостинг Activity жана фрагменттер үчүн)
private val _data = MutableLiveData<MyData>()
val data: LiveData<MyData> = _data

fun setData(newData: MyData) {
    _data.value = newData
}
// Жөнөтүүчү Activity/Fragmentте
viewModel.setData(MyData(...))
// Алып жаткан Activity/Fragmentте ViewModelди байкоо
viewModel.data.observe(viewLifecycleOwner) { data ->
    // Маалыматты колдонуу
}
  1. Callback / Interface (Activity натыйжасын алуу үчүн): Кайсы бир Activity башка Activityдан натыйжа кайтаруусу керек болгондо колдонулат.
// Жөнөтүүчү Activityде
ActivityResultLauncher<Intent> someActivityResultLauncher = registerForActivityResult(
    new ActivityResultContracts.StartActivityForResult(),
    result -> {
        if (result.getResultCode() == Activity.RESULT_OK) {
            Intent data = result.getData();
            if (data != null && data.getExtras() != null) {
                String resultData = data.getExtras().getString("result_key");
            }
        }
    });

// Натыйжа алуу үчүн Activityны иштетүү
Intent intent = new Intent(this, TargetActivity.class);
someActivityResultLauncher.launch(intent);
// Алып жаткан Activityде
Intent resultIntent = new Intent();
resultIntent.putExtra("result_key", "Натыйжа");
setResult(Activity.RESULT_OK, resultIntent);
finish();
  1. Жергиликтүү базалар / Shared Preferences / ички сактагыч: Көбүрөөк маалыматтарды өткөрүү же сактоо үчүн:
// Каттоо (мисалы, Shared Preferences)
SharedPreferences sharedPref = getSharedPreferences("MyPrefs", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putString("saved_data", "Маалымат сакталды");
editor.apply();
// Окуу (мисалы, Shared Preferences)
SharedPreferences sharedPref = getSharedPreferences("MyPrefs", Context.MODE_PRIVATE);
String savedData = sharedPref.getString("saved_data", null);

Бул ыкма маалыматтын жашоо циклине кошумча логика талап кылат.

  1. Синглтон / Глобалдык статикалык объект: Кеңеш берилбейт — мээнин агып кетүүсү жана архитектуранын бузулушу мүмкүн. Өтө жөнөкөй жана акыркы учурларда гана колдонуу керек.

    // Синглтон классы
    public class DataHolder {
        private static final DataHolder instance = new DataHolder();
        private String data;
    
        private DataHolder() {}
    
        public static DataHolder getInstance() {
            return instance;
        }
    
        public String getData() {
            return data;
        }
    
        public void setData(String data) {
            this.data = data;
        }
    }
    
    // Жөнөтүүчү Activityде
    DataHolder.getInstance().setData("Синглтон аркылуу маалымат");
    
    // Алып жаткан Activityде
    String data = DataHolder.getInstance().getData();
    

Маалыматтын көлөмү, кыйынчылыгы, сактоо зарылдыгы жана өз ара аракеттешүү талаптарына жараша ыкма тандалат. Эң кеңири колдонулган жана сунушталган ыкмалар — Intent Extras жана ViewModel.