কনফিগারেশন পরিবর্তন হ্যান্ডেল

অ্যাপটি চলার সময় ডিভাইসের কিছু কনফিগারেশন পরিবর্তিত হতে পারে। এগুলোর মধ্যে রয়েছে, তবে তা শুধু এগুলোর মধ্যেই সীমাবদ্ধ নয়:

  • অ্যাপ প্রদর্শনের আকার
  • স্ক্রিন ওরিয়েন্টেশন
  • ফন্টের আকার এবং ওজন
  • অবস্থান
  • ডার্ক মোড বনাম লাইট মোড
  • কিবোর্ডের প্রাপ্যতা

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

এই প্যারামিটারগুলোর জন্য সাধারণত আপনার অ্যাপ্লিকেশনের UI-তে যথেষ্ট বড় পরিবর্তনের প্রয়োজন হয়, এবং সেই পরিবর্তনের জন্য অ্যান্ড্রয়েড প্ল্যাটফর্মে একটি বিশেষ ব্যবস্থা রয়েছে। এই ব্যবস্থাটি হলো Activity রিক্রিয়েশন

কার্যকলাপ বিনোদন

কনফিগারেশনে কোনো পরিবর্তন ঘটলে সিস্টেম একটি Activity পুনরায় তৈরি করে। এটি করার জন্য, সিস্টেম onDestroy কল করে এবং বিদ্যমান Activity ইনস্ট্যান্সটিকে ধ্বংস করে দেয়। এরপর এটি onCreate ব্যবহার করে একটি নতুন ইনস্ট্যান্স তৈরি করে, এবং এই নতুন Activity ইনস্ট্যান্সটি নতুন ও হালনাগাদ করা কনফিগারেশন দিয়ে ইনিশিয়ালাইজ করা হয়। এর মানে হলো, সিস্টেম নতুন কনফিগারেশন দিয়ে UI-টিও পুনরায় তৈরি করে।

সাধারণত, Activity কম্পোজেবলগুলোর জন্য হোস্ট হিসেবে কাজ করে। যখন Activity পুনরায় তৈরি করা হয়, কম্পোজ নতুন কনফিগারেশন মানগুলো ব্যবহার করে আপনার UI-ও পুনরায় তৈরি করে।

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

বিনোদনের উদাহরণ

এমন একটি কম্পোজেবল বিবেচনা করুন যা স্ট্রিং রিসোর্স ব্যবহার করে একটি স্থির শিরোনাম প্রদর্শন করে:

// In the res/values/strings.xml file
// <string name="compose">Jetpack Compose</string>

// In your Compose code
Text(
    text = stringResource(R.string.compose)
)

Activity তৈরি করার সময়, Text কম্পোজেবল বর্তমান কনফিগারেশন (যেমন ভাষা) পড়ে এবং উপযুক্ত স্ট্রিং রিসোর্সটি সমাধান করে।

ভাষা পরিবর্তিত হলে, সিস্টেম অ্যাক্টিভিটিটি পুনরায় তৈরি করে। এমনটা ঘটলে, কম্পোজ UI-টিও পুনরায় তৈরি করে। যেহেতু stringResource বর্তমান কনফিগারেশন থেকে ডেটা পড়ে, তাই টাইটেলটি স্বয়ংক্রিয়ভাবে সঠিক স্থানীয় ভাষায় আপডেট হয়ে যায়।

এই বিনোদনটি Activity মধ্যে ক্ষেত্র হিসাবে রাখা যেকোনো অবস্থাকেও পরিষ্কার করে দেয়।

কনফিগারেশন পরিবর্তনের পরেও আপনার UI স্টেট অক্ষুণ্ণ রাখতে, প্রস্তাবিত স্টেট ম্যানেজমেন্ট প্যাটার্নগুলো ব্যবহার করুন। ডেটা এবং বিজনেস লজিকের জন্য ViewModel এবং UI-স্তরের স্টেটের জন্য rememberSaveable ব্যবহার করুন। এই পদ্ধতিগুলোর সাহায্যে, নতুন কনফিগারেশন অনুযায়ী UI আপডেট হলেও Activity পুনরায় তৈরি হওয়ার পরেও আপনার স্টেট অক্ষুণ্ণ থাকে।

Compose-এ স্টেট সংরক্ষণ সম্পর্কে আরও তথ্যের জন্য, “Save UI state in Compose” দেখুন।

ব্যবহারকারীর প্রত্যাশা

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

আপনার অ্যাপ্লিকেশনে স্টেট সংরক্ষিত আছে কিনা তা যাচাই করার জন্য, অ্যাপটি ফোরগ্রাউন্ডে এবং ব্যাকগ্রাউন্ডে উভয় অবস্থাতেই আপনি এমন কিছু কাজ করতে পারেন যা কনফিগারেশনে পরিবর্তন আনে। এই কাজগুলোর মধ্যে রয়েছে:

  • ডিভাইসটি ঘোরানো
  • মাল্টি-উইন্ডো মোডে প্রবেশ করা
  • মাল্টি-উইন্ডো মোডে বা একটি ফ্রি-ফর্ম উইন্ডোতে থাকাকালীন অ্যাপ্লিকেশনটির আকার পরিবর্তন করা
  • একাধিক ডিসপ্লে সহ একটি ফোল্ডেবল ডিভাইস ভাঁজ করা
  • সিস্টেম থিম পরিবর্তন করা, যেমন ডার্ক মোড বনাম লাইট মোড
  • ফন্টের আকার পরিবর্তন করা
  • সিস্টেম বা অ্যাপের ভাষা পরিবর্তন করা
  • হার্ডওয়্যার কিবোর্ড সংযোগ বা বিচ্ছিন্ন করা
  • ডক সংযোগ বা বিচ্ছিন্ন করা

Activity রিক্রিয়েশনের মাধ্যমে প্রাসঙ্গিক স্টেট সংরক্ষণ করার জন্য আপনি বিভিন্ন পদ্ধতি অবলম্বন করতে পারেন। কোনটি ব্যবহার করবেন তা নির্ভর করে আপনি কোন ধরনের স্টেট সংরক্ষণ করতে চান তার উপর:

  • জটিল বা বৃহৎ ডেটার ক্ষেত্রে প্রসেস বন্ধ হয়ে যাওয়া সামাল দেওয়ার জন্য লোকাল পারসিস্টেন্স ব্যবহার করা হয়। পারসিস্টেন্ট লোকাল স্টোরেজের মধ্যে ডেটাবেস বা DataStore অন্তর্ভুক্ত।
  • ব্যবহারকারী যখন সক্রিয়ভাবে অ্যাপটি ব্যবহার করেন, তখন মেমরিতে UI-সম্পর্কিত অবস্থা পরিচালনা করার জন্য ViewModel ইনস্ট্যান্সের মতো অবজেক্টগুলো ধরে রাখা হয়
  • কনফিগারেশন পরিবর্তন এবং সিস্টেম-প্রবর্তিত প্রসেস বন্ধ হয়ে যাওয়ার পরেও ক্ষণস্থায়ী UI স্টেট সংরক্ষণ করার জন্য rememberSaveable করা হয়। এটি এমন স্টেটের জন্য উপযুক্ত যা ব্যবহারকারীর ইনপুট, স্ক্রোল পজিশন বা নেভিগেশনের উপর নির্ভর করে, কিন্তু কোনো ViewModel এর অন্তর্ভুক্ত নয়।

এগুলোর প্রত্যেকটির এপিআই (API) সম্পর্কে বিস্তারিতভাবে জানতে এবং কখন কোনটি ব্যবহার করা উপযুক্ত, তা জানতে সেভ ইউআই স্টেটস (Save UI states) দেখুন।

বিনোদনমূলক কার্যকলাপ সীমিত করুন

নির্দিষ্ট কিছু কনফিগারেশন পরিবর্তনের জন্য আপনি স্বয়ংক্রিয়ভাবে অ্যাক্টিভিটি পুনরায় তৈরি হওয়া আটকাতে পারেন। আধুনিক কম্পোজ-অনলি অ্যাপগুলিতে, আপনার UI এমনিতেই পুনর্গঠিত হয়, কিন্তু কনফিগারেশন পরিবর্তনটি সরাসরি পরিচালনা করার পরামর্শ দেওয়া হয়।

ডিফল্টরূপে, কোনো কনফিগারেশন পরিবর্তন হলে সিস্টেম অ্যাক্টিভিটিটিকে ধ্বংস করে পুনরায় তৈরি করতে বাধ্য হয়, যার মধ্যে UI এবং অ্যাক্টিভিটি থেকে উদ্ভূত যেকোনো অবজেক্ট অন্তর্ভুক্ত থাকে। যদি আপনি ঘোষণা করেন যে আপনার অ্যাক্টিভিটি নিজেই কনফিগারেশন পরিবর্তনটি পরিচালনা করবে, তবে সিস্টেম এটি প্রতিরোধ করে। এর পরিবর্তে, শুধুমাত্র Configuration অবজেক্টটি আপডেট হয় এবং Compose নতুন মানগুলো দিয়ে আপনার UI-কে পুনরায় গঠন করে।

কম্পোজে সরাসরি কনফিগারেশন পরিবর্তন পরিচালনা করার বেশ কিছু সুবিধা রয়েছে:

  • উন্নত পারফরম্যান্স: একটি সম্পূর্ণ অ্যাক্টিভিটি পুনর্নির্মাণ চক্রের তুলনায় UI পুনর্গঠন করা কম ব্যয়বহুল, বিশেষ করে ছোটখাটো পরিবর্তনের ক্ষেত্রে।
  • সাবলীল অ্যানিমেশন: অ্যাক্টিভিটি রিস্টার্ট এড়ানোর মাধ্যমে আপনি কনফিগারেশন পরিবর্তনের সময়ও নিরবচ্ছিন্ন অ্যানিমেশন চালাতে পারেন, যেমন ডিভাইস ঘোরানোর সময় মসৃণ লেআউট পরিবর্তন।
  • স্টেট সংরক্ষণ: অ্যাক্টিভিটি ইনস্ট্যান্সটি ধরে রাখলে স্ক্রিন রোটেশনের মতো কোনো ঘটনার সময় ক্ষণস্থায়ী UI স্টেট হারিয়ে যাওয়ার ঝুঁকি কমে। মনে রাখবেন, সিস্টেম-প্রবর্তিত প্রসেস বন্ধ হয়ে যাওয়ার ক্ষেত্রেও আপনাকে স্টেট সংরক্ষণের ব্যবস্থা নিতে হবে।

নির্দিষ্ট কনফিগারেশন পরিবর্তনের জন্য অ্যাক্টিভিটি পুনরায় তৈরি হওয়া বন্ধ করতে, আপনার AndroidManifest.xml ফাইলের <activity> এন্ট্রিতে android:configChanges সাথে কনফিগারেশন টাইপটি যোগ করুন। android:configChanges অ্যাট্রিবিউটের ডকুমেন্টেশনে সম্ভাব্য মানগুলো দেওয়া আছে।

নিম্নলিখিত ম্যানিফেস্ট কোডটি স্ক্রিন ওরিয়েন্টেশন এবং কীবোর্ডের প্রাপ্যতা পরিবর্তিত হলে MyActivity এর জন্য Activity পুনরায় তৈরি করা নিষ্ক্রিয় করে:

<activity
    android:name=".MyActivity"
    android:configChanges="orientation|screenSize|screenLayout|keyboardHidden"
    android:label="@string/app_name">

কনফিগারেশন পরিবর্তনে প্রতিক্রিয়া জানান

Jetpack Compose আপনার অ্যাপকে কনফিগারেশন পরিবর্তনে আরও সহজে প্রতিক্রিয়া জানাতে সাহায্য করে। তবে, যেখানে সম্ভব সেখানে যদি আপনি সমস্ত কনফিগারেশন পরিবর্তনের জন্য Activity পুনরায় তৈরি করা নিষ্ক্রিয় করে দেন, তাহলেও আপনার অ্যাপকে অবশ্যই কনফিগারেশন পরিবর্তনগুলি সঠিকভাবে পরিচালনা করতে হবে।

Configuration অবজেক্টটি Compose UI হায়ারার্কিতে LocalConfiguration কম্পোজিশন লোকালের সাথে উপলব্ধ থাকে। যখনই এটি পরিবর্তিত হয়, LocalConfiguration.current থেকে ডেটা পাঠকারী কম্পোজেবল ফাংশনগুলো পুনরায় কম্পোজ হয়। কম্পোজিশন লোকাল কীভাবে কাজ করে সে সম্পর্কে তথ্যের জন্য, “Locally scoped data with CompositionLocal” দেখুন।

উদাহরণ

নিম্নলিখিত উদাহরণে, একটি কম্পোজেবল একটি নির্দিষ্ট ফরম্যাটে তারিখ প্রদর্শন করে। কম্পোজেবলটি সিস্টেম লোকেল কনফিগারেশন পরিবর্তনের প্রতিক্রিয়ায় ConfigurationCompat.getLocales সহ LocalConfiguration.current কল করে।

@Composable
fun DateText(year: Int, dayOfYear: Int) {
    val dateTimeFormatter = DateTimeFormatter.ofPattern(
        "MMM dd",
        ConfigurationCompat.getLocales(LocalConfiguration.current)[0]
    )
    Text(
        dateTimeFormatter.format(LocalDate.ofYearDay(year, dayOfYear))
    )
}

লোকেল পরিবর্তনের সময় Activity পুনরায় তৈরি হওয়া এড়াতে, কম্পোজ কোড হোস্টকারী Activity লোকেল কনফিগারেশন পরিবর্তন থেকে অপ্ট-আউট করতে হবে। এটি করার জন্য, আপনাকে android:configChanges locale|layoutDirection এ সেট করতে হবে।

কনফিগারেশন পরিবর্তন: মূল ধারণা এবং সর্বোত্তম অনুশীলন

কনফিগারেশন পরিবর্তন নিয়ে কাজ করার সময় এই মূল ধারণাগুলো আপনার জানা প্রয়োজন:

  • কনফিগারেশন: ডিভাইস কনফিগারেশন নির্ধারণ করে যে ব্যবহারকারীর কাছে UI কীভাবে প্রদর্শিত হবে, যেমন অ্যাপের প্রদর্শনের আকার, লোকেল বা সিস্টেম থিম। Compose-এ, আপনি LocalConfiguration ব্যবহার করে কনফিগারেশনের মানগুলো অ্যাক্সেস করতে পারেন।
  • কনফিগারেশন পরিবর্তন: ব্যবহারকারীর কার্যকলাপের মাধ্যমে কনফিগারেশন পরিবর্তিত হয়। উদাহরণস্বরূপ, ব্যবহারকারী ডিভাইসের সেটিংস বা ডিভাইসটি ব্যবহারের পদ্ধতি পরিবর্তন করতে পারেন। কনফিগারেশন পরিবর্তন রোধ করার কোনো উপায় নেই।
  • Activity পুনঃসৃষ্টি: কনফিগারেশন পরিবর্তনের ফলে ডিফল্টরূপে Activity পুনঃসৃষ্ট হয়। নতুন কনফিগারেশনের জন্য অ্যাপের অবস্থা পুনরায় চালু করার এটি একটি অন্তর্নির্মিত ব্যবস্থা।
  • Activity ধ্বংসকরণ: Activity পুনঃসৃষ্টি করলে সিস্টেম পুরানো Activity ইনস্ট্যান্সটি ধ্বংস করে দেয় এবং তার জায়গায় একটি নতুন ইনস্ট্যান্স তৈরি করে। পুরানো ইনস্ট্যান্সটি এখন অপ্রচলিত। লাইফসাইকেল-স্কোপড অবজেক্টের রেফারেন্স তাদের উদ্দিষ্ট স্কোপের বাইরে ধরে রাখা পরিহার করুন।
  • স্টেট: পুরোনো Activity ইনস্ট্যান্সের স্টেট নতুন Activity ইনস্ট্যান্সে উপস্থিত থাকে না, কারণ এগুলি দুটি ভিন্ন অবজেক্ট ইনস্ট্যান্স। Activity-র সাথে স্টেট যুক্ত করার পরিবর্তে, "Save UI states" -এ বর্ণিত অ্যাপ এবং ব্যবহারকারীর স্টেট সংরক্ষণ করতে প্রস্তাবিত API ব্যবহার করুন।
  • অপ্ট-আউট: কোনো ধরনের কনফিগারেশন পরিবর্তনের জন্য অ্যাক্টিভিটি পুনরায় তৈরি হওয়া থেকে অপ্ট-আউট করতে হলে, নতুন কনফিগারেশনের প্রতিক্রিয়ায় আপনার অ্যাপটিকে সঠিকভাবে আপডেট হতে হবে। বেশিরভাগ কম্পোজ অ্যাপের জন্য এটি সুপারিশ করা হয় না।

ব্যবহারকারীদের ভালো অভিজ্ঞতা প্রদানের জন্য নিম্নলিখিত সর্বোত্তম অনুশীলনগুলো অনুসরণ করুন:

  • ঘন ঘন কনফিগারেশন পরিবর্তনের জন্য প্রস্তুত থাকুন: এপিআই লেভেল, ফর্ম ফ্যাক্টর বা ইউআই টুলকিট নির্বিশেষে, কনফিগারেশন পরিবর্তন বিরল বা কখনোই হয় না—এমনটা ধরে নেবেন না। যখন কোনো ব্যবহারকারী কনফিগারেশন পরিবর্তন করেন, তখন তিনি আশা করেন যে অ্যাপগুলো আপডেট হবে এবং নতুন কনফিগারেশনের সাথে সঠিকভাবে কাজ করতে থাকবে।
  • স্টেট সংরক্ষণ করুন: Activity পুনরায় তৈরি করার সময় ব্যবহারকারীর স্টেট যেন হারিয়ে না যায়। ViewModel এবং rememberSaveable এর মতো API ব্যবহার করে UI স্টেট সংরক্ষণ করার পদ্ধতিতে স্টেট সংরক্ষণ করুন।
  • দ্রুত সমাধান হিসেবে অপ্ট-আউট করা থেকে বিরত থাকুন: স্টেট হারানোর ঝুঁকি এড়ানোর শর্টকাট হিসেবে Activity রিক্রিয়েশন থেকে অপ্ট-আউট করবেন না। অ্যাক্টিভিটি রিক্রিয়েশন থেকে অপ্ট-আউট করলে আপনাকে পরিবর্তনটি হ্যান্ডেল করার প্রতিশ্রুতি পূরণ করতে হবে, এবং তারপরেও অন্যান্য কনফিগারেশন পরিবর্তন, প্রসেস ডেথ বা অ্যাপ বন্ধ করার কারণে Activity রিক্রিয়েশনের ফলে আপনি স্টেট হারাতে পারেন। Activity রিক্রিয়েশন সম্পূর্ণরূপে নিষ্ক্রিয় করা অসম্ভব। 'সেভ UI স্টেটস' অংশে বর্ণিত পদ্ধতি অনুযায়ী স্টেট সংরক্ষণ করুন।
  • কনফিগারেশন পরিবর্তন এড়িয়ে চলবেন না: কনফিগারেশন পরিবর্তন এবং Activity পুনরায় তৈরি করা এড়ানোর জন্য ওরিয়েন্টেশন, অ্যাসপেক্ট রেশিও বা রিসাইজেবিলিটির উপর বিধিনিষেধ আরোপ করবেন না। এটি সেইসব ব্যবহারকারীদের উপর নেতিবাচক প্রভাব ফেলে, যারা আপনার অ্যাপটি তাদের পছন্দের উপায়ে ব্যবহার করতে চান।

আকার-ভিত্তিক কনফিগারেশন পরিবর্তনগুলি পরিচালনা করুন

আকার-ভিত্তিক কনফিগারেশন পরিবর্তন যেকোনো সময় ঘটতে পারে এবং এর সম্ভাবনা বেশি থাকে যখন আপনার অ্যাপটি বড় স্ক্রিনের ডিভাইসে চলে, যেখানে ব্যবহারকারীরা মাল্টি-উইন্ডো মোডে প্রবেশ করতে পারেন। তারা আশা করেন যে আপনার অ্যাপটি সেই পরিবেশে ভালোভাবে কাজ করবে।

আকারের পরিবর্তন সাধারণত দুই প্রকারের হয়: তাৎপর্যপূর্ণ এবং তাৎপর্যহীন। তাৎপর্যপূর্ণ আকারের পরিবর্তন হলো এমন একটি পরিবর্তন, যেখানে স্ক্রিনের আকারের (যেমন প্রস্থ, উচ্চতা বা সর্বনিম্ন প্রস্থ) ভিন্নতার কারণে নতুন কনফিগারেশনে এক ভিন্ন সেট বিকল্প রিসোর্স প্রযোজ্য হয়। এই রিসোর্সগুলোর মধ্যে অ্যাপটির নিজের সংজ্ঞায়িত রিসোর্স এবং এর যেকোনো লাইব্রেরি থেকে প্রাপ্ত রিসোর্স অন্তর্ভুক্ত থাকে।

আকার-ভিত্তিক কনফিগারেশন পরিবর্তনের জন্য কার্যকলাপের পুনঃসৃষ্টি সীমাবদ্ধ করুন

যখন আপনি আকার-ভিত্তিক কনফিগারেশন পরিবর্তনের জন্য Activity পুনঃসৃষ্টি নিষ্ক্রিয় করেন, তখন সিস্টেম Activity পুনরায় তৈরি করে না। পরিবর্তে, এটি Activity.onConfigurationChanged এ একটি কল গ্রহণ করে। LocalConfiguration.current পাঠকারী যেকোনো কম্পোজেবল নতুন আকার প্রতিফলিত করার জন্য স্বয়ংক্রিয়ভাবে পুনর্গঠিত হয়।

আপনার ম্যানিফেস্ট ফাইলে android:configChanges="screenSize|smallestScreenSize|orientation|screenLayout" থাকলে, সাইজ-ভিত্তিক কনফিগারেশন পরিবর্তনের জন্য Activity পুনরায় তৈরি করা নিষ্ক্রিয় থাকে।

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

কনফিগারেশন পরিবর্তন পরিচালনা সম্পর্কে আরও তথ্যের জন্য, নিম্নলিখিত অতিরিক্ত রিসোর্সগুলো দেখুন:

ডকুমেন্টেশন

বিষয়বস্তু দেখুন