জেটপ্যাক কম্পোজ-এর জীবনচক্র অ্যান্ড্রয়েড জেটপ্যাক- এর একটি অংশ।
লাইফসাইকেল-সচেতন কম্পোনেন্টগুলো হোস্ট অ্যাক্টিভিটির লাইফসাইকেল স্ট্যাটাসের পরিবর্তনের প্রতিক্রিয়ায় বিভিন্ন কাজ সম্পাদন করে। androidx.lifecycle.compose আর্টিফ্যাক্টটি বিশেষ এপিআই সরবরাহ করে, যা রিসোর্সগুলো স্ক্রিন থেকে অদৃশ্য হয়ে গেলে বা অ্যাপ্লিকেশনটি ব্যাকগ্রাউন্ডে চলে গেলে স্বয়ংক্রিয়ভাবে সেগুলোকে পরিষ্কার করে দেয়।
প্রধান এপিআইগুলো হলো নিম্নরূপ:
- বর্তমান
Lifecycle.Stateজন্য প্রবাহসমূহ । -
LifecycleEffects, যা আপনাকে একটি নির্দিষ্টLifecycle.Eventউপর ভিত্তি করে কোনো ব্লক চালানোর সুযোগ দেয়।
এই ইন্টিগ্রেশনগুলো কম্পোজ হায়ারার্কির মধ্যে লাইফসাইকেল পরিচালনা করার জন্য সুবিধাজনক হুক প্রদান করে। এই ডকুমেন্টটিতে বর্ণনা করা হয়েছে যে আপনি আপনার অ্যাপে কীভাবে এগুলো ব্যবহার করতে পারেন।
ফ্লো ব্যবহার করে লাইফসাইকেল স্টেট সংগ্রহ করুন
লাইফসাইকেল একটি currentStateFlow প্রপার্টি প্রকাশ করে, যা বর্তমান Lifecycle.State -কে একটি কোটলিন স্টেটফ্লো (Kotlin StateFlow হিসেবে প্রদান করে। আপনি এই Flow টিকে State হিসেবে সংগ্রহ করতে পারেন। এর ফলে আপনার অ্যাপ কম্পোজিশনের (composition) সময় লাইফসাইকেলের পরিবর্তনগুলো পড়তে পারে।
val lifecycleOwner = LocalLifecycleOwner.current
val stateFlow = lifecycleOwner.lifecycle.currentStateFlow
…
val currentLifecycleState by stateFlow.collectAsState()
পূর্ববর্তী উদাহরণটি lifecycle-common মডিউল ব্যবহার করে পাওয়া যায়। currentStateAsState() মেথডটি lifecycle-runtime-compose মডিউলে রয়েছে, যা আপনাকে এক লাইনেই বর্তমান লাইফসাইকেল স্টেট সুবিধাজনকভাবে পড়তে দেয়। নিম্নলিখিত উদাহরণটি এটি প্রদর্শন করে:
val lifecycleOwner = LocalLifecycleOwner.current
val currentLifecycleState = lifecycleOwner.lifecycle.currentStateAsState()
লাইফসাইকেল ইভেন্টগুলিতে কোড চালান
DefaultLifecycleObserver ইমপ্লিমেন্ট করে একটি আলাদা ক্লাস তৈরি করে এবং সেটিকে ম্যানুয়ালি লাইফসাইকেলে যুক্ত করার পরিবর্তে, আপনি নির্দিষ্ট এফেক্ট ব্যবহার করে ইনলাইনে লাইফসাইকেল লজিক ডিক্লেয়ার করতে পারেন। LifecycleEffects আপনাকে কম্পোজিশনের মধ্যেই সরাসরি একটি নির্দিষ্ট Lifecycle.Event ঘটলে একটি ব্লক রান করার সুযোগ দেয়।
জীবনচক্র ঘটনা প্রভাব
কোনো নির্দিষ্ট ঘটনা ঘটলে কোডের একটি অংশ চালানোর জন্য LifecycleEventEffect ব্যবহার করুন। লগিং বা অ্যানালিটিক্সের মতো এককালীন ইভেন্টগুলোর জন্য এটি সবচেয়ে ভালো, যেখানে কোনো সাফল্য বা তাৎক্ষণিক ফলাফলের প্রয়োজন হয় না।
@Composable
fun AnalyticsTracker(screenName: String) {
// Log an event when the app receives ON_RESUME (e.g. comes to foreground)
LifecycleEventEffect(Lifecycle.Event.ON_RESUME) {
Analytics.logView(screenName)
}
}
জীবনচক্র প্রারম্ভিক প্রভাব
জোড়া স্টার্ট/স্টপ অপারেশনের জন্য, যা অ্যাপ চালু হওয়ার সময় (দৃশ্যমান) চলতে হবে এবং অ্যাপ বন্ধ হওয়ার সময় (ব্যাকগ্রাউন্ডে) পরিষ্করণ করতে হবে, LifecycleStartEffect ব্যবহার করুন।
অন্যান্য কম্পোজ এফেক্টের (যেমন LaunchedEffect ) মতোই, LifecycleStartEffect কী গ্রহণ করে। যখন কী পরিবর্তিত হয়, তখন এটি ব্লকটিকে পুনরায় চালানোর জন্য ট্রিগার করে।
যখন একটি Lifecycle.Event.ON_STOP ইভেন্ট ঘটে বা ইফেক্টটি কম্পোজিশন থেকে বেরিয়ে যায়, তখন এটি স্টার্টিং ব্লকের অংশ থাকা যেকোনো কাজ গুছিয়ে নেওয়ার জন্য onStopOrDispose ব্লকটি এক্সিকিউট করে।
@Composable
fun LocationMonitor(locationManager: LocationManager) {
// Starts monitoring when ON_START is dispatched
// Stops monitoring when ON_STOP is dispatched
// (or the composable leaves the screen)
LifecycleStartEffect(locationManager) {
val listener = LocationListener { location ->
/* update UI */
}
locationManager.requestLocationUpdates(listener)
// The cleanup block automatically runs on ON_STOP or on disposal
onStopOrDispose {
locationManager.removeUpdates(listener)
}
}
}
অন্যান্য ধরনের পার্শ্বপ্রতিক্রিয়া সম্পর্কে তথ্যের জন্য, Compose-এর পার্শ্বপ্রতিক্রিয়া (Side-effects) দেখুন।
জীবনচক্রপুনরায় প্রভাব
LifecycleResumeEffect টি LifecycleStartEffect মতোই কাজ করে, কিন্তু এটি Lifecycle.Event.ON_RESUME ইভেন্টের সাথে যুক্ত থাকে। এটি একটি onPauseOrDispose ব্লকও প্রদান করে, যা ON_PAUSE ডিসপ্যাচ হলে বা কম্পোজেবলটি স্ক্রিন থেকে বেরিয়ে গেলে পরিষ্করণ সম্পন্ন করে।
এই API-টি এমন রিসোর্সগুলোর জন্য উপযোগী, যেগুলো শুধুমাত্র ব্যবহারকারী অ্যাপটির সাথে ইন্টারঅ্যাক্ট করার সময় সক্রিয় থাকা প্রয়োজন—যেমন, ক্যামেরা বা অ্যানিমেশন।
@Composable
fun CameraPreview(cameraController: CameraController) {
LifecycleResumeEffect(cameraController) {
cameraController.startPreview()
onPauseOrDispose {
cameraController.stopPreview()
}
}
}
লাইফসাইকেলওনার অ্যাক্সেস করুন
Compose-এ, LocalLifecycleOwner নামের CompositionLocal এর মাধ্যমে LifecycleOwner অন্তর্নিহিতভাবে উপলব্ধ থাকে। ডিফল্টরূপে, আপনার কম্পোজিশন হায়ারার্কির রুট হোস্ট এই ওনারটি সরবরাহ করে।
val lifecycleOwner = LocalLifecycleOwner.current
অনেক অ্যাপের জন্য, এই ডিফল্ট ওনারকে ইনসপেক্ট করা অথবা এটিকে লাইফসাইকেল-অ্যাওয়ার এফেক্টসে পাস করাই যথেষ্ট। তবে, কাস্টম নেভিগেশন বা জটিল লেআউটের জন্য, UI-এর নির্দিষ্ট অংশগুলিতে লাইফসাইকেল স্টেটগুলিকে সীমাবদ্ধ করতে আপনি আপনার নিজস্ব LifecycleOwner তৈরি করতে চাইতে পারেন। উদাহরণস্বরূপ, নেভিগেশন লাইব্রেরিগুলি (যেমন Navigation 3 ) প্রতিটি স্বতন্ত্র স্ক্রিনকে তার নিজস্ব লাইফসাইকেল দেওয়ার জন্য এটি স্বয়ংক্রিয়ভাবে করে থাকে।
একটি কাস্টম লাইফসাইকেলওনার তৈরি করুন
rememberLifecycleOwner() API আপনাকে একটি কাস্টম LifecycleOwner তৈরি করতে এবং মনে রাখতে দেয়। এটি বিশেষত HorizontalPager মতো কম্পোনেন্টগুলির জন্য উপযোগী, যেখানে আপনি চান শুধুমাত্র দৃশ্যমান, স্থির পৃষ্ঠাটি RESUMED হোক, এবং একই সাথে সংলগ্ন, স্ক্রিনের বাইরের পৃষ্ঠাগুলির জন্য maxState STARTED সেট করুন।
val pagerState = rememberPagerState(pageCount = { 10 })
HorizontalPager(state = pagerState) { pageNum ->
val pageLifecycleOwner = rememberLifecycleOwner(
maxState = if (pagerState.settledPage == pageNum) {
Lifecycle.State.RESUMED
} else {
Lifecycle.State.STARTED
}
)
CompositionLocalProvider(LocalLifecycleOwner provides pageLifecycleOwner) {
// Your pages here. Their lifecycle-aware components respect the
// custom maxState defined above.
}
}
CompositionLocal সম্পর্কে আরও তথ্যের জন্য, “Locally scoped data with CompositionLocal” দেখুন।
লাইফসাইকেল-সচেতন উপাদানগুলির জন্য সর্বোত্তম অনুশীলন
- আপনার UI কন্ট্রোলারগুলোকে যথাসম্ভব সংক্ষিপ্ত রাখুন। এগুলোর নিজেরা ডেটা সংগ্রহ করার চেষ্টা করা উচিত নয়; এর পরিবর্তে, এই কাজের জন্য একটি
ViewModelব্যবহার করুন এবং UI-তে পরিবর্তনগুলো প্রতিফলিত করার জন্য একটিStateFlowঅবজেক্ট পর্যবেক্ষণ করুন। - ডেটা-চালিত UI লেখার চেষ্টা করুন, যেখানে আপনার UI কন্ট্রোলারের দায়িত্ব হলো ডেটা পরিবর্তনের সাথে সাথে UI আপডেট করা, অথবা ব্যবহারকারীর কার্যকলাপ সম্পর্কে
ViewModelকে অবহিত করা। - আপনার ডেটা লজিক
ViewModelক্লাসে রাখুন।ViewModelআপনার UI কন্ট্রোলার এবং অ্যাপের বাকি অংশের মধ্যে সংযোগকারী হিসেবে কাজ করবে। তবে সতর্ক থাকবেন, ডেটা আনা (যেমন, নেটওয়ার্ক থেকে)ViewModelএর দায়িত্ব নয়। এর পরিবর্তে,ViewModelডেটা আনার জন্য উপযুক্ত কম্পোনেন্টকে কল করবে এবং তারপর ফলাফলটি UI কন্ট্রোলারে ফেরত পাঠাবে। - দীর্ঘ সময় ধরে চলা কাজ এবং অন্যান্য অ্যাসিঙ্ক্রোনাসভাবে চলতে পারে এমন অপারেশনগুলো পরিচালনা করতে কোটলিন কো-রুটিন ব্যবহার করুন।
- স্টার্ট/স্টপ লজিকটি সেই কম্পোজেবলের ভিতরে রাখুন যার আসলে এটি প্রয়োজন। এইভাবে, যদি সেই নির্দিষ্ট UI এলিমেন্টটি স্ক্রিন থেকে সরিয়ে ফেলা হয় (উদাহরণস্বরূপ, একটি নেভিগেশন গ্রাফের ভিতরে বা যখন ভিজিবিলিটি শর্তসাপেক্ষ হয়), তাহলে লজিকটি স্বয়ংক্রিয়ভাবে মুছে যাবে।
- ডেটার জন্য
collectAsStateWithLifecycleব্যবহার করুন। লাইফসাইকেল ইভেন্টের উপর ভিত্তি করে ম্যানুয়ালিFlowকালেকশন শুরু বা বন্ধ করবেন না। এর পরিবর্তে, স্ট্রিমগুলিকে দক্ষতার সাথে UI স্টেটে রূপান্তর করতেcollectAsStateWithLifecycleব্যবহার করুন। এতে ব্যাটারি এবং রিসোর্স সাশ্রয় হয়, কারণ অ্যাপটি ব্যাকগ্রাউন্ডে থাকলেFlowপজ হয়ে থাকে।
Flow সম্পর্কে আরও তথ্যের জন্য, ‘অন্যান্য সমর্থিত অবস্থার প্রকারভেদ’ দেখুন।
জীবনচক্র-সচেতন উপাদানগুলির ব্যবহারের ক্ষেত্র
লাইফসাইকেল-সচেতন কম্পোনেন্টগুলো বিভিন্ন ক্ষেত্রে আপনার জন্য লাইফসাইকেল পরিচালনা করা অনেক সহজ করে তুলতে পারে। এর কয়েকটি উদাহরণ হলো:
- স্থূল এবং সূক্ষ্ম অবস্থান আপডেটের মধ্যে পরিবর্তন করা। আপনার অ্যাপ দৃশ্যমান থাকা অবস্থায় (
ON_START) সূক্ষ্ম অবস্থান আপডেট চালু করতে এবং অ্যাপটি ব্যাকগ্রাউন্ডে গেলে (ON_STOP) স্বয়ংক্রিয়ভাবে লিসেনারটি পরিষ্কার করতে বা স্থূল আপডেটে পরিবর্তন করতেLifecycleStartEffectব্যবহার করুন। - ভিডিও বাফারিং বন্ধ করা এবং চালু করা। অ্যাপটি সম্পূর্ণরূপে ফোরগ্রাউন্ডে এসে ইন্টারেক্টিভ না হওয়া পর্যন্ত প্রকৃত ভিডিও প্লেব্যাক স্থগিত রাখতে (
ON_RESUME), এবং অ্যাপটি ব্যাকগ্রাউন্ডে গেলে প্লেব্যাক যাতে থেমে যায় ও রিসোর্স মুক্ত হয় তা নিশ্চিত করতে (ON_PAUSE)LifecycleResumeEffectব্যবহার করুন। - নেটওয়ার্ক স্ট্রিমিং শুরু এবং বন্ধ করা। ডেটার অবিচ্ছিন্ন প্রবাহ (যেমন নেটওয়ার্ক সকেট থেকে আসা কোটলিন ফ্লো) পর্যবেক্ষণ করতে
collectAsStateWithLifecycleব্যবহার করুন। এটি অ্যাপটি ফোরগ্রাউন্ডে থাকা অবস্থায় আপনাকে লাইভ আপডেট দেয় এবং অ্যাপটি ব্যাকগ্রাউন্ডে গেলে স্বয়ংক্রিয়ভাবে ডেটা সংগ্রহ বন্ধ করে দেয়। - ভারী কাজ থামানো এবং পুনরায় চালু করা। অ্যাপটি ব্যাকগ্রাউন্ডে থাকাকালীন ভারী ভিজ্যুয়াল আপডেটগুলি থামাতে এবং অ্যাপটি ফোরগ্রাউন্ডে আসার পরে সেগুলি পুনরায় চালু করতে
LifecycleResumeEffectব্যবহার করুন।
ON_STOP ইভেন্টগুলি নিরাপদে পরিচালনা করা
Compose-কে ON_STOP ইভেন্টগুলো নিরাপদে পরিচালনা করার জন্য ডিজাইন করা হয়েছে।
- স্টেট নিরাপদ: আপনি যেকোনো সময়
MutableStateআপডেট করতে পারেন (উদাহরণস্বরূপ,uiState.value = ...ব্যবহার করে), এমনকি অ্যাপটি ব্যাকগ্রাউন্ডে থাকলেও। পরিবর্তনগুলো রেন্ডার করার জন্য Compose অ্যাপটি দৃশ্যমান হওয়া পর্যন্ত অপেক্ষা করে। - স্বয়ংক্রিয় পরিষ্করণ:
LifecycleStartEffectমতো ইফেক্ট ব্যবহার করলে, আপনার পরিষ্করণ ব্লক (onStopOrDispose) ঠিক তখনই চলে যখন লাইফসাইকেলটিSTOPPEDঅবস্থায় পৌঁছায়। এর ফলে অ্যাপটি ব্যাকগ্রাউন্ডে থাকাকালীন ক্যামেরা বা লোকেশনের মতো ভারী রিসোর্সগুলো আটকে থাকে না।
MutableState সম্পর্কে আরও তথ্যের জন্য, State এবং Jetpack Compose দেখুন।
অতিরিক্ত সম্পদ
লাইফসাইকেল-অ্যাওয়ার কম্পোনেন্ট ব্যবহার করে লাইফসাইকেল পরিচালনা সম্পর্কে আরও জানতে, নিম্নলিখিত অতিরিক্ত রিসোর্সগুলো দেখুন।
বিষয়বস্তু দেখুন
{% হুবহু %}আপনার জন্য প্রস্তাবিত
- দ্রষ্টব্য: জাভাস্ক্রিপ্ট বন্ধ থাকলেও লিঙ্কের লেখা প্রদর্শিত হয়।
- লাইভডেটা ওভারভিউ
- লাইফসাইকেল-অ্যাওয়্যার কম্পোনেন্টের সাথে কোটলিন কোরাউটিন ব্যবহার করুন
- ViewModel-এর জন্য সংরক্ষিত অবস্থা মডিউল