টুকরা সঙ্গে রাষ্ট্র সংরক্ষণ

বিভিন্ন অ্যান্ড্রয়েড সিস্টেম অপারেশন আপনার খণ্ডের অবস্থাকে প্রভাবিত করতে পারে। ব্যবহারকারীর অবস্থা সংরক্ষণ করা হয়েছে তা নিশ্চিত করতে, অ্যান্ড্রয়েড ফ্রেমওয়ার্ক স্বয়ংক্রিয়ভাবে টুকরো এবং ব্যাক স্ট্যাক সংরক্ষণ করে এবং পুনরুদ্ধার করে। অতএব, আপনাকে নিশ্চিত করতে হবে যে আপনার খণ্ডের যেকোন ডেটা সংরক্ষণ এবং পুনরুদ্ধার করা হয়েছে।

নিম্নলিখিত সারণীটি সেই ক্রিয়াকলাপগুলির রূপরেখা দেয় যা আপনার খণ্ডের অবস্থা হারাতে পারে, সেই সাথে সেই পরিবর্তনগুলির মাধ্যমে বিভিন্ন ধরণের রাষ্ট্র বজায় থাকে কিনা। সারণিতে উল্লিখিত রাষ্ট্রের প্রকারগুলি নিম্নরূপ:

  • ভেরিয়েবল: খণ্ডে স্থানীয় ভেরিয়েবল।
  • ভিউ স্টেট: ফ্র্যাগমেন্টে এক বা একাধিক ভিউয়ের মালিকানাধীন যেকোন ডেটা।
  • SavedState: এই খণ্ডের উদাহরণের অন্তর্নিহিত ডেটা যা onSaveInstanceState() এ সংরক্ষণ করা উচিত।
  • NonConfig: একটি বাহ্যিক উত্স থেকে টেনে আনা ডেটা, যেমন একটি সার্ভার বা স্থানীয় সংগ্রহস্থল, বা ব্যবহারকারীর তৈরি ডেটা যা একবার প্রতিশ্রুতিবদ্ধ একটি সার্ভারে পাঠানো হয়।

প্রায়শই ভেরিয়েবলগুলিকে SavedState এর মতোই ধরা হয়, কিন্তু নিম্নলিখিত সারণীটি প্রতিটিতে বিভিন্ন ক্রিয়াকলাপের প্রভাব প্রদর্শনের জন্য দুটির মধ্যে পার্থক্য করে।

অপারেশন ভেরিয়েবল রাজ্য দেখুন সংরক্ষিত রাজ্য নন-কনফিগ
ব্যাক স্ট্যাকে যোগ করা হয়েছে x
কনফিগার পরিবর্তন x
প্রক্রিয়া মৃত্যু/বিনোদন x ✓*
সরানো হয়েছে ব্যাক স্ট্যাকে যোগ করা হয়নি x x x x
হোস্ট সমাপ্ত x x x x

* ViewModel-এর জন্য সেভড স্টেট মডিউল ব্যবহার করে নন-কনফিগ অবস্থাটি প্রক্রিয়া মৃত্যুর মধ্যে ধরে রাখা যেতে পারে।

সারণি 1: বিভিন্ন টুকরো ধ্বংসাত্মক ক্রিয়াকলাপ এবং বিভিন্ন রাষ্ট্রের উপর তাদের প্রভাব।

এর একটি নির্দিষ্ট উদাহরণ তাকান. একটি স্ক্রীন বিবেচনা করুন যা একটি এলোমেলো স্ট্রিং তৈরি করে, এটিকে একটি TextView প্রদর্শন করে এবং বন্ধুকে পাঠানোর আগে স্ট্রিংটি সম্পাদনা করার বিকল্প প্রদান করে:

র্যান্ডম টেক্সট জেনারেটর অ্যাপ্লিকেশন যা বিভিন্ন ধরনের রাষ্ট্র প্রদর্শন করে
চিত্র 1. র্যান্ডম টেক্সট জেনারেটর অ্যাপ যা বিভিন্ন ধরনের অবস্থা প্রদর্শন করে।

এই উদাহরণের জন্য, অনুমান করুন যে ব্যবহারকারী একবার সম্পাদনা বোতাম টিপে, অ্যাপটি একটি EditText ভিউ প্রদর্শন করে যেখানে ব্যবহারকারী বার্তাটি সম্পাদনা করতে পারে। ব্যবহারকারী যদি CANCEL এ ক্লিক করেন, তাহলে EditText ভিউ সাফ করা উচিত এবং এর দৃশ্যমানতা View.GONE এ সেট করা উচিত। একটি নির্বিঘ্ন অভিজ্ঞতা নিশ্চিত করতে এই জাতীয় পর্দার চারটি টুকরো ডেটা পরিচালনার প্রয়োজন হতে পারে:

ডেটা টাইপ রাজ্যের ধরন বর্ণনা
seed Long নন-কনফিগ এলোমেলোভাবে একটি নতুন ভাল কাজ তৈরির জন্য ব্যবহৃত বীজ। ViewModel তৈরি হলে তৈরি হয়।
randomGoodDeed String SavedState + পরিবর্তনশীল প্রথমবার যখন খণ্ডটি তৈরি হয় তখন তৈরি হয়। randomGoodDeed সংরক্ষণ করা হয়েছে নিশ্চিত করার জন্য যে ব্যবহারকারীরা মৃত্যু এবং বিনোদন প্রক্রিয়ার পরেও একই র্যান্ডম ভাল কাজ দেখতে পান।
isEditing Boolean SavedState + পরিবর্তনশীল ব্যবহারকারী সম্পাদনা শুরু করলে বুলিয়ান পতাকা true সেট করা হয়। খণ্ডটি পুনরায় তৈরি করার সময় পর্দার সম্পাদনা অংশটি দৃশ্যমান থাকে তা নিশ্চিত করতে isEditing সংরক্ষণ করা হয়।
সম্পাদিত পাঠ্য Editable রাজ্য দেখুন ( EditText মালিকানাধীন) EditText ভিউতে সম্পাদিত পাঠ্য। EditText ভিউ এই পাঠ্যটিকে সংরক্ষণ করে যাতে ব্যবহারকারীর অগ্রগতিতে পরিবর্তনগুলি হারিয়ে না যায়।

সারণি 2: র্যান্ডম টেক্সট জেনারেটর অ্যাপকে অবশ্যই পরিচালনা করতে হবে।

ধ্বংসাত্মক ক্রিয়াকলাপগুলির মাধ্যমে কীভাবে আপনার ডেটার অবস্থা সঠিকভাবে পরিচালনা করবেন তা নিম্নলিখিত বিভাগগুলি বর্ণনা করে৷

অবস্থা দেখুন

মতামত তাদের নিজস্ব রাষ্ট্র পরিচালনার জন্য দায়ী. উদাহরণস্বরূপ, যখন একটি ভিউ ব্যবহারকারীর ইনপুট গ্রহণ করে, তখন কনফিগারেশন পরিবর্তনগুলি পরিচালনা করার জন্য সেই ইনপুটটিকে সংরক্ষণ এবং পুনরুদ্ধার করা ভিউয়ের দায়িত্ব। সমস্ত অ্যান্ড্রয়েড ফ্রেমওয়ার্ক-প্রদত্ত ভিউগুলির onSaveInstanceState() এবং onRestoreInstanceState() এর নিজস্ব প্রয়োগ রয়েছে, তাই আপনাকে আপনার খণ্ডের মধ্যে ভিউ স্টেট পরিচালনা করতে হবে না।

উদাহরণস্বরূপ, পূর্ববর্তী দৃশ্যে, সম্পাদিত স্ট্রিং একটি EditText এ রাখা হয়। একটি EditText যে পাঠ্য প্রদর্শন করছে তার মান জানে, সেইসাথে অন্যান্য বিশদ বিবরণ, যেমন কোনো নির্বাচিত পাঠ্যের শুরু এবং শেষ।

একটি ভিউ এর অবস্থা ধরে রাখতে একটি আইডি প্রয়োজন। এই আইডিটি অবশ্যই খণ্ডের মধ্যে অনন্য হতে হবে এবং এর ভিউ হায়ারার্কি। আইডি ছাড়া ভিউ তাদের অবস্থা ধরে রাখতে পারে না।

<EditText
    android:id="@+id/good_deed_edit_text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

সারণি 1-এ উল্লিখিত হিসাবে, সমস্ত ক্রিয়াকলাপের মাধ্যমে ভিউগুলি তাদের ViewState সংরক্ষণ করে এবং পুনরুদ্ধার করে যা খণ্ডটি সরিয়ে দেয় না বা হোস্টকে ধ্বংস করে না।

SavedState

আপনার খণ্ডটি অল্প পরিমাণে গতিশীল অবস্থা পরিচালনার জন্য দায়ী যা খণ্ডটি কীভাবে কাজ করে তার অবিচ্ছেদ্য। আপনি Fragment.onSaveInstanceState(Bundle) ব্যবহার করে সহজে-ক্রমিক ডেটা ধরে রাখতে পারেন। Activity.onSaveInstanceState(Bundle) এর মতোই, আপনি বান্ডেলে যে ডেটা রাখেন সেটি কনফিগারেশন পরিবর্তনের মাধ্যমে এবং মৃত্যু ও বিনোদন প্রক্রিয়ার মাধ্যমে ধরে রাখা হয় এবং এটি আপনার খণ্ডের onCreate(Bundle) , onCreateView(LayoutInflater, ViewGroup, Bundle) , এবং onViewCreated(View, Bundle) এ উপলব্ধ। onViewCreated(View, Bundle) পদ্ধতি।

পূর্ববর্তী উদাহরণের সাথে অবিরত, randomGoodDeed হল সেই দলিল যা ব্যবহারকারীর কাছে প্রদর্শিত হয় এবং isEditing হল একটি পতাকা যা নির্ধারণ করে যে খণ্ডটি EditText দেখায় বা লুকিয়ে রাখে। এই সংরক্ষিত অবস্থাটি onSaveInstanceState(Bundle) ব্যবহার করে বজায় রাখা উচিত, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

কোটলিন

override fun onSaveInstanceState(outState: Bundle) {
    super.onSaveInstanceState(outState)
    outState.putBoolean(IS_EDITING_KEY, isEditing)
    outState.putString(RANDOM_GOOD_DEED_KEY, randomGoodDeed)
}

জাভা

@Override
public void onSaveInstanceState(@NonNull Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putBoolean(IS_EDITING_KEY, isEditing);
    outState.putString(RANDOM_GOOD_DEED_KEY, randomGoodDeed);
}

onCreate(Bundle) এ অবস্থা পুনরুদ্ধার করতে বান্ডেল থেকে সঞ্চিত মান পুনরুদ্ধার করুন:

কোটলিন

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    isEditing = savedInstanceState?.getBoolean(IS_EDITING_KEY, false)
    randomGoodDeed = savedInstanceState?.getString(RANDOM_GOOD_DEED_KEY)
            ?: viewModel.generateRandomGoodDeed()
}

জাভা

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (savedInstanceState != null) {
        isEditing = savedInstanceState.getBoolean(IS_EDITING_KEY, false);
        randomGoodDeed = savedInstanceState.getString(RANDOM_GOOD_DEED_KEY);
    } else {
        randomGoodDeed = viewModel.generateRandomGoodDeed();
    }
}

সারণি 1 এ উল্লিখিত হিসাবে, নোট করুন যে ভেরিয়েবলগুলি ধরে রাখা হয় যখন খণ্ডটি ব্যাকস্ট্যাকের উপর স্থাপন করা হয়। তাদের সংরক্ষিত অবস্থা হিসাবে বিবেচনা করা নিশ্চিত করে যে তারা সমস্ত ধ্বংসাত্মক ক্রিয়াকলাপের মাধ্যমে অব্যাহত থাকে।

নন-কনফিগ

NonConfig ডেটা আপনার খণ্ডের বাইরে স্থাপন করা উচিত, যেমন একটি ViewModel এ। উপরের পূর্ববর্তী উদাহরণে, ViewModelseed (আমাদের নন-কনফিগ অবস্থা) তৈরি করা হয়েছে। তার রাষ্ট্র বজায় রাখার যুক্তি ViewModel এর মালিকানাধীন।

কোটলিন

public class RandomGoodDeedViewModel : ViewModel() {
    private val seed = ... // Generate the seed

    private fun generateRandomGoodDeed(): String {
        val goodDeed = ... // Generate a random good deed using the seed
        return goodDeed
    }
}

জাভা

public class RandomGoodDeedViewModel extends ViewModel {
    private Long seed = ... // Generate the seed

    private String generateRandomGoodDeed() {
        String goodDeed = ... // Generate a random good deed using the seed
        return goodDeed;
    }
}

ViewModel ক্লাস অন্তর্নিহিতভাবে ডেটাকে কনফিগারেশন পরিবর্তনগুলিকে টিকে থাকতে দেয়, যেমন স্ক্রীন ঘূর্ণন, এবং যখন টুকরোটি পিছনের স্ট্যাকের উপর রাখা হয় তখন মেমরিতে থাকে। প্রক্রিয়া মৃত্যু এবং বিনোদনের পরে, ViewModel পুনরায় তৈরি করা হয় এবং একটি নতুন seed উত্পন্ন হয়। আপনার ViewModel এ একটি SavedState মডিউল যোগ করার ফলে ViewModel প্রক্রিয়া মৃত্যু এবং বিনোদনের মাধ্যমে সহজ অবস্থা বজায় রাখতে পারে।

অতিরিক্ত সম্পদ

খণ্ড অবস্থা পরিচালনা সম্পর্কে আরও তথ্যের জন্য, নিম্নলিখিত অতিরিক্ত সংস্থানগুলি দেখুন।

কোডল্যাব

গাইড