অ্যান্ড্রয়েড ৯ (এবং এর পূর্ববর্তী সংস্করণ)-এ, অ্যাপগুলো PAUSED অবস্থায় চলে যেত যখন:
- অ্যাপটির উপরে একটি নতুন, স্বচ্ছ অ্যাক্টিভিটি চালু হলো, যখন অ্যাপটি তখনও দৃশ্যমান ছিল (এবং, তাই, বন্ধ হয়নি)।
- অ্যাক্টিভিটিটি ফোকাস হারিয়েছিল, কিন্তু তা অনাবৃত ছিল এবং ব্যবহারকারী সেটির সাথে ইন্টারঅ্যাক্ট করতে পারতেন। উদাহরণস্বরূপ, মাল্টি-উইন্ডো মোডে, একাধিক অ্যাক্টিভিটি একই সাথে দেখা যেতে পারে এবং টাচ ইনপুট গ্রহণ করতে পারে।
এই পরিস্থিতিগুলোতে একটি অ্যাপকে কতটা বিরতি নিতে হয়, তার পরিমাণে পার্থক্য থাকে, কিন্তু অ্যাপ পর্যায়ে এদের মধ্যে পার্থক্য করা যায় না।
অ্যান্ড্রয়েড ১০-এ, দৃশ্যমান স্ট্যাকের মধ্যে থাকা টপ-ফোকাসযোগ্য সমস্ত অ্যাক্টিভিটি RESUMED অবস্থায় থাকে। এটি সেইসব অ্যাপের জন্য মাল্টি-উইন্ডো এবং এমডি মোডের সাথে সামঞ্জস্য উন্নত করে, যারা UI রিফ্রেশ করা এবং ব্যবহারকারীর সাথে ইন্টারঅ্যাকশন বন্ধ করতে onStop() onPause() () ব্যবহার করে। এর মানে হলো:
- স্প্লিট-স্ক্রিনের উভয় কার্যক্রম পুনরায় শুরু হয়।
- ফ্রি-ফর্ম উইন্ডোয়িং মোডে উপরে দৃশ্যমান সমস্ত কার্যকলাপ পুনরায় শুরু হয়।
- একাধিক স্ক্রিনের কাজ একই সময়ে পুনরায় শুরু করা যেতে পারে।

চিত্র ১. একটি ফোল্ডেবল ডিভাইসে মাল্টি-রিজিউম

চিত্র ২. ডেস্কটপ মোডে একাধিকবার চালু করার সুবিধা
যখন কোনো কার্যকলাপের উপর মনোযোগ দেওয়া যায় না বা তা আংশিকভাবে আড়াল থাকে, তখন সেটি PAUSED অবস্থায় থাকতে পারে, যেমন:
- মিনিমাইজ করা স্প্লিট-স্ক্রিনে (যেখানে লঞ্চারটি পাশে থাকে), উপরের অ্যাক্টিভিটিটি পুনরায় চালু হয় না, কারণ সেটিতে ফোকাস করা যায় না।
- পিকচার-ইন-পিকচার মোডে, কাজটি পুনরায় শুরু হয় না কারণ এটি ফোকাসযোগ্য থাকে না।
- যখন একই স্ট্যাকে থাকা অন্যান্য স্বচ্ছ অ্যাক্টিভিটি দ্বারা অ্যাক্টিভিটিগুলো আবৃত থাকে
এই পদ্ধতি অ্যাপগুলোকে নির্দেশ করে যে, একটি অ্যাক্টিভিটি শুধুমাত্র RESUMED অবস্থায় থাকলেই ব্যবহারকারীর কাছ থেকে ইনপুট গ্রহণ করতে পারে। অ্যান্ড্রয়েড ১০-এর আগে, অ্যাক্টিভিটিগুলো PAUSED অবস্থাতেও ইনপুট গ্রহণ করতে পারত (উদাহরণস্বরূপ, অ্যান্ড্রয়েড ৯ চালিত কোনো ডিভাইসে স্প্লিট-স্ক্রিনে থাকা দুটি অ্যাক্টিভিটিতেই একই সাথে স্পর্শ করে দেখুন)।
পূর্ববর্তী অ্যান্ড্রয়েড রিলিজগুলোর ‘রিজিউমড’ সিগন্যালটি বজায় রাখতে (এবং অ্যাপগুলোকে কখন এক্সক্লুসিভ-অ্যাক্সেস বা সিঙ্গেলটন রিসোর্সের অ্যাক্সেস দেওয়া উচিত তা জানানোর জন্য), অ্যান্ড্রয়েড ১০-এ একটি নতুন কলব্যাক অন্তর্ভুক্ত করা হয়েছে:
Activity#onTopResumedActivityChanged(boolean onTop)
যখন কল করা হয়, এই কলব্যাকটি Activity#onResume() এবং Activity#onPause() এর মাঝে কল করা হয়। এই কলব্যাকটি ঐচ্ছিক এবং এটি এড়িয়ে যাওয়া যায়, ফলে একটি অ্যাক্টিভিটি সিস্টেমের সর্বোচ্চ অবস্থানে না এসেই RESUMED অবস্থা থেকে PAUSED অবস্থায় যেতে পারে। উদাহরণস্বরূপ, মাল্টি-উইন্ডো মোডে। যেহেতু এই কলব্যাকটি ঐচ্ছিক, তাই এটি অ্যাক্টিভিটি লাইফসাইকেলের অংশ নয় এবং খুব কমই ব্যবহার করা উচিত।
পূর্ববর্তী টপ-রিজিউমড অ্যাক্টিভিটি onTopResumedActivity(false) মেথডটি গ্রহণ করে এবং এর এক্সিকিউশন শেষ করে, এরপরই পরবর্তী টপ-রিজিউমড অ্যাক্টিভিটি onTopResumedActivity(true) মেথডটি গ্রহণ করে, যদি না পূর্ববর্তী অ্যাক্টিভিটি মেথড কলটি হ্যান্ডেল করতে অতিরিক্ত সময় নেয় এবং ৫০০ মিলিসেকেন্ডের টাইমআউটে পৌঁছে যায়।
সামঞ্জস্যতা
একাধিক রেজিউম বাস্তবায়নের সময় সামঞ্জস্যতা বজায় রাখতে এই সমাধানগুলো বিবেচনা করুন।
একটি অ্যাপ প্রক্রিয়ায় একাধিক কার্যক্রম পুনরায় শুরু করা হয়েছে।
- সমস্যা। অ্যান্ড্রয়েড ৯ এবং এর নিচের সংস্করণগুলোতে, সিস্টেমে একবারে কেবল একটি অ্যাক্টিভিটিই পুনরায় চালু হয়। অ্যাক্টিভিটিগুলোর মধ্যে সমস্ত ট্রানজিশনের ক্ষেত্রে, একটি অ্যাক্টিভিটি পুনরায় চালু করার আগে অন্যটিকে পজ করা হয়। কিছু অ্যাপ এবং ফ্রেমওয়ার্ক (যেমন ফ্লাটার, বা অ্যান্ড্রয়েডের LocalActivityManager) এই বিষয়টি ব্যবহার করে এবং পুনরায় চালু হওয়া অ্যাক্টিভিটির স্টেট সিঙ্গেলটনে সংরক্ষণ করে।
- সমাধান। অ্যান্ড্রয়েড ৯ এবং এর পূর্ববর্তী সংস্করণগুলোতে, যদি একই প্রসেসের দুটি অ্যাক্টিভিটি একসাথে পুনরায় চালু করা হয়, তবে সিস্টেম কেবল Z-অর্ডারে উপরের অ্যাক্টিভিটিটিকেই পুনরায় চালু করে। অ্যান্ড্রয়েড ১০-কে লক্ষ্য করে তৈরি অ্যাপগুলো একই সময়ে একাধিক অ্যাক্টিভিটি পুনরায় চালু করা সমর্থন করে।
একই সাথে ক্যামেরা অ্যাক্সেস
- সমস্যাসমূহ । এই সমস্যাগুলো অ্যান্ড্রয়েড ৯ এবং এর পূর্ববর্তী সংস্করণগুলোতেও বিদ্যমান। উদাহরণস্বরূপ, পিকচার-ইন-পিকচার মোডে একটি ফুলস্ক্রিন এবং পুনরায় চালু হওয়া অ্যাক্টিভিটি তার উপরে থাকা পজ করা কোনো অ্যাক্টিভিটির কারণে ক্যামেরার ফোকাস হারাতে পারে, কিন্তু মাল্টি-উইন্ডো এবং মাল্টি-ডিসপ্লে মোডের ব্যাপক ব্যবহারের সাথে সাথে এই সমস্যাটি আরও প্রকট হয়ে ওঠে।
-
RESUMEস্টেটে আনা পরিবর্তনের কারণে, অ্যাপগুলো রিজুম করা অবস্থাতেও ক্যামেরা থেকে সংযোগ বিচ্ছিন্ন হয়ে যেতে পারে। এর সমাধান করতে, অ্যাপগুলোকে ক্র্যাশ না করে ক্যামেরা সংযোগ বিচ্ছিন্ন হওয়ার বিষয়টি সামলাতে হবে। সংযোগ বিচ্ছিন্ন হলে, অ্যাপগুলো একটি ডিসকানেক্টেড কলব্যাক পায় এবং API-তে করা সমস্ত কলCameraAccessExceptionথ্রো করা শুরু করে। -
resizeableActivity=falseথাকলেও ক্যামেরার একচেটিয়া ব্যবহারের কোনো নিশ্চয়তা নেই, কারণ ক্যামেরা ব্যবহারকারী অন্যান্য অ্যাপ অন্য ডিসপ্লেতেও খোলা থাকতে পারে।
-
- সমাধান। ডেভেলপারদের এমন লজিক অন্তর্ভুক্ত করা উচিত যা নির্ধারণ করবে কখন একটি অ্যাপ ক্যামেরা থেকে সংযোগ বিচ্ছিন্ন হয়ে যায়। যদি কোনো অ্যাপ ক্যামেরা থেকে সংযোগ বিচ্ছিন্ন হয়ে যায়, তবে পুনরায় সংযোগ স্থাপন এবং ক্যামেরার ব্যবহার চালিয়ে যাওয়ার চেষ্টা করার জন্য এটির ক্যামেরা অ্যাভেইলেবিলিটি কলব্যাকগুলো পর্যবেক্ষণ করা উচিত। বিদ্যমান
CameraManager#AvailabilityCallback#onCameraAvailable()কলব্যাকের পাশাপাশি, অ্যান্ড্রয়েড ১০-এCameraManager#AvailabilityCallback#onCameraAccessPrioritiesChanged()যুক্ত করা হয়েছে, যা এমন পরিস্থিতি সামাল দেয় যখন একাধিক পুনরায় চালু হওয়া অ্যাক্টিভিটির মধ্যে ফোকাস (এবং ক্যামেরার অগ্রাধিকার) পরিবর্তিত হয়। ক্যামেরা অ্যাক্সেস করার চেষ্টা করার জন্য একটি উপযুক্ত সময় নির্ধারণ করতে অ্যাপ ডেভেলপারদের এই দুটি কলব্যাকই ব্যবহার করা উচিত।
একাধিক জীবনবৃত্তান্ত
অ্যান্ড্রয়েড ১০-এ, অ্যাক্টিভিটির লাইফসাইকেল স্টেট ভিজিবিলিটি এবং জেড-অর্ডার দ্বারা নির্ধারিত হয়। কোনো অ্যাক্টিভিটিতে ভিজিবিলিটি আপডেটের পর সঠিক স্টেট নিশ্চিত করতে এবং কোন লাইফসাইকেল স্টেটটি প্রযোজ্য তা মূল্যায়ন করতে, বিভিন্ন স্থান থেকে ActivityRecord#makeActiveIfNeeded() মেথডটি কল করুন। অ্যান্ড্রয়েড ১০-এ, 'অ্যাক্টিভ' বলতে হয় RESUMED অথবা PAUSED বোঝায় এবং এটি শুধুমাত্র এই দুটি অবস্থাতেই কাজ করে।
অ্যান্ড্রয়েড ১০-এ, কোনো অ্যাক্টিভিটি পুনরায় চালু হওয়াকে সিস্টেমের একটিমাত্র স্থানের পরিবর্তে প্রতিটি স্ট্যাকে আলাদাভাবে ট্র্যাক করা হয়। এর কারণ হলো, মাল্টি-উইন্ডো মোডে একাধিক অ্যাক্টিভিটি ট্রানজিশন একই সাথে সম্পন্ন করা যেতে পারে। বিস্তারিত জানতে, ActivityStack#mInResumeTopActivity দেখুন।
শীর্ষ-পুনরায় শুরু করা কার্যকলাপ কলব্যাক
যেসব কাজের ফলে শীর্ষ অ্যাক্টিভিটি পরিবর্তিত হতে পারে (যেমন অ্যাক্টিভিটি চালু করা, পুনরায় চালু করা, বা Z-অর্ডার পরিবর্তন), সেগুলোর পরে ActivityStackSupervisor#updateTopResumedActivityIfNeeded() মেথডটি কল করা হয়। এই মেথডটি পরীক্ষা করে দেখে যে সবচেয়ে উপরের পুনরায় চালু হওয়া অ্যাক্টিভিটিটি পরিবর্তিত হয়েছে কিনা এবং প্রয়োজনে আপডেট করে। যদি আগের শীর্ষ-পুনরায় চালু হওয়া অ্যাক্টিভিটিটি তার অবস্থাটি মুক্ত না করে, তাহলে সেটিতে একটি 'top-resumed-state-loss' মেসেজ পাঠানো হয় এবং সার্ভার সাইডে একটি টাইমআউট নির্ধারণ করা হয় ( ActivityStackSupervisor#scheduleTopResumedStateLossTimeout() )। পূর্ববর্তী অ্যাক্টিভিটি অবস্থাটি মুক্ত করার পরে, বা টাইমআউট শেষ হলে, শীর্ষ-পুনরায় চালু হওয়া অবস্থার একটি রিপোর্ট পরবর্তী অ্যাক্টিভিটিতে পাঠানো হয় (এর ব্যবহার দেখুন:
ActivityStackSupervisor#scheduleTopResumedActivityStateIfNeeded()
ক্লায়েন্টদের কাছে শীর্ষ-পুনরায় চালু হওয়া অবস্থার পরিবর্তনগুলি রিপোর্ট করার জন্য একটি নতুন TopResumedActivityChangeItem ট্রানজ্যাকশন আইটেম যুক্ত করা হয়েছে এবং এটি অ্যান্ড্রয়েড ৯-এর ActivityLifecycler আর্কিটেকচার ব্যবহার করে।
টপ-রিজিউমড স্টেটটি ক্লায়েন্ট সাইডে সংরক্ষিত থাকে, এবং প্রতিবার যখন অ্যাক্টিভিটি RESUMED বা PAUSED অবস্থায় পরিবর্তিত হয়, তখন এটি onTopResumedActivityChanged() কলব্যাকটি কল করা উচিত কিনা তাও পরীক্ষা করে। এটি সার্ভার এবং ক্লায়েন্ট সাইডের মধ্যে লাইফসাইকেল স্টেট এবং টপ-রিজিউমড স্টেটের যোগাযোগের ক্ষেত্রে এক ধরনের ডিকাপলিং সক্ষম করে।