মাল্টি-জীবনবৃত্তান্ত

অ্যান্ড্রয়েড 9 (এবং নিম্নতর), অ্যাপগুলিকে PAUSED অবস্থায় প্রবেশ করানো হয়েছিল যখন:

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

এই পরিস্থিতিতে একটি অ্যাপকে বিরতি দেওয়ার পরিমাণের মধ্যে পার্থক্য রয়েছে কিন্তু অ্যাপ স্তরে আলাদা করা যাবে না।

অ্যান্ড্রয়েড 10-এ, দৃশ্যমান স্ট্যাকের সমস্ত টপ-ফোকাসেবল অ্যাক্টিভিটি RESUMED অবস্থায় থাকে। এটি মাল্টি-উইন্ডো এবং MD মোডগুলির সাথে সামঞ্জস্য উন্নত করে যেগুলি UI রিফ্রেশ করা এবং ব্যবহারকারীর সাথে ইন্টারঅ্যাক্ট করা বন্ধ করতে onStop() এর পরিবর্তে onPause() ব্যবহার করে৷ এর অর্থ:

  • স্প্লিট-স্ক্রীনে উভয় ক্রিয়াকলাপ পুনরায় শুরু করা হয়েছে।
  • ফ্রি-ফর্ম উইন্ডোজিং মোডে সমস্ত শীর্ষ-দৃশ্যমান ক্রিয়াকলাপ পুনরায় শুরু করা হয়েছে।
  • একাধিক স্ক্রিনে ক্রিয়াকলাপ একই সময়ে পুনরায় শুরু করা যেতে পারে।

চিত্র 1. একটি ভাঁজযোগ্য ডিভাইসে মাল্টি-রিজুম

চিত্র 2. ডেস্কটপ মোডে মাল্টি-রিজুম

ক্রিয়াকলাপগুলি PAUSED অবস্থায় থাকতে পারে যখন সেগুলিকে ফোকাস করা যায় না বা আংশিকভাবে বন্ধ করা হয়, যেমন:

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

এই পদ্ধতিটি অ্যাপগুলিকে নির্দেশ করে যে একটি কার্যকলাপ শুধুমাত্র RESUMED অবস্থায় একজন ব্যবহারকারীর কাছ থেকে ইনপুট পেতে পারে। অ্যান্ড্রয়েড 10-এর আগে, ক্রিয়াকলাপগুলিও PAUSED অবস্থায় ইনপুট গ্রহণ করতে পারে (উদাহরণস্বরূপ, অ্যান্ড্রয়েড 9 চালিত ডিভাইসে একই সাথে স্প্লিট-স্ক্রীনে উভয় ক্রিয়াকলাপ স্পর্শ করার চেষ্টা করুন)।

পূর্ববর্তী অ্যান্ড্রয়েড রিলিজগুলি থেকে পুনরায় শুরু হওয়া সংকেত সংরক্ষণ করতে (এবং যখন অ্যাপগুলিকে এক্সক্লুসিভ-অ্যাক্সেস বা সিঙ্গলটন সংস্থানগুলিতে অ্যাক্সেস পাওয়া উচিত তখন যোগাযোগ করতে), Android 10-এ একটি নতুন কলব্যাক অন্তর্ভুক্ত রয়েছে:

Activity#onTopResumedActivityChanged(boolean onTop)

যখন আহ্বান করা হয়, এই কলব্যাকটিকে Activity#onResume() এবং Activity#onPause() এর মধ্যে ডাকা হয়। এই কলব্যাকটি ঐচ্ছিক এবং এড়িয়ে যাওয়া যেতে পারে, তাই একটি ক্রিয়াকলাপ সিস্টেমে শীর্ষস্থানীয় না হয়ে RESUMED থেকে বিরতি PAUSED অবস্থায় যেতে পারে৷ উদাহরণস্বরূপ, মাল্টি-উইন্ডো মোডে। যেহেতু এই কলব্যাক ঐচ্ছিক, এটি কার্যকলাপ জীবনচক্রের অংশ নয় এবং খুব কমই ব্যবহার করা উচিত৷

পূর্ববর্তী শীর্ষ-পুনঃসূচনা কার্যকলাপ onTopResumedActivity(false) গ্রহণ করে এবং শেষ করে পরবর্তী শীর্ষ-পুনঃসূচিত কার্যকলাপ onTopResumedActivity(true) প্রাপ্ত হওয়ার আগে যদি পূর্ববর্তী কার্যকলাপটি মেথড কলটি পরিচালনা করতে খুব বেশি সময় নেয় এবং 500 ms টাইমআউট হিট করে।

সামঞ্জস্য

মাল্টি-রিজুমে প্রয়োগ করার সময় সামঞ্জস্য বজায় রাখতে, এই সমাধানগুলি বিবেচনা করুন।

একটি অ্যাপ প্রক্রিয়ায় একাধিক পুনরায় শুরু করা কার্যক্রম

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

একযোগে ক্যামেরা অ্যাক্সেস

  • সমস্যা এই সমস্যাগুলি অ্যান্ড্রয়েড 9 এবং তার নীচের সংস্করণগুলিতেও উপস্থিত রয়েছে৷ উদাহরণ স্বরূপ, একটি পূর্ণস্ক্রীন এবং পুনরায় শুরু করা কার্যকলাপ পিকচার-ইন-পিকচার মোডে উপরে থাকা একটি পজড অ্যাক্টিভিটি থেকে ক্যামেরার ফোকাস হারাতে পারে কিন্তু মাল্টি-উইন্ডো এবং মাল্টি-ডিসপ্লে মোডের ব্যাপক গ্রহণের মাধ্যমে আরও বেশি উন্মুক্ত হয়ে যায়।
    • RESUME স্টেটে করা পরিবর্তনের কারণে, অ্যাপগুলি আবার চালু করার সময়ও ক্যামেরা থেকে সংযোগ বিচ্ছিন্ন হয়ে যেতে পারে। এটি মোকাবেলা করার জন্য, অ্যাপগুলিকে ক্র্যাশ না করে একটি ক্যামেরা সংযোগ বিচ্ছিন্ন পরিচালনা করতে হবে। সংযোগ বিচ্ছিন্ন হয়ে গেলে, অ্যাপগুলি একটি সংযোগ বিচ্ছিন্ন কলব্যাক পায় এবং API-এর সমস্ত কল CameraAccessException নিক্ষেপ করা শুরু করে৷
    • resizeableActivity=false এক্সক্লুসিভ ক্যামেরা অ্যাক্সেসের গ্যারান্টি নয়, কারণ ক্যামেরা ব্যবহার করে অন্যান্য অ্যাপ অন্যান্য ডিসপ্লেতে খোলা যেতে পারে।
  • সমাধান। যখন একটি অ্যাপ ক্যামেরা থেকে সংযোগ বিচ্ছিন্ন হয় তখন বিকাশকারীদের যুক্তি অন্তর্ভুক্ত করা উচিত। যদি একটি অ্যাপ ক্যামেরা থেকে সংযোগ বিচ্ছিন্ন করা হয়, তাহলে এটি পুনরায় সংযোগ করার চেষ্টা করতে এবং ক্যামেরা ব্যবহার চালিয়ে যেতে ক্যামেরা উপলব্ধতা কলব্যাকগুলি দেখতে হবে। বিদ্যমান CameraManager#AvailabilityCallback#onCameraAvailable() কলব্যাক ছাড়াও, Android 10 যোগ করেছে CameraManager#AvailabilityCallback#onCameraAccessPrioritiesChanged() , যা ফোকাস (এবং ক্যামেরার অগ্রাধিকার) বেশ কয়েকটি পুনঃসূচিত ক্রিয়াকলাপের মধ্যে স্যুইচ করলে কেসটি কভার করে। অ্যাপ বিকাশকারীদের ক্যামেরা অ্যাক্সেস করার চেষ্টা করার জন্য একটি ভাল সময় নির্ধারণ করতে এই দুটি কলব্যাক ব্যবহার করা উচিত।

মাল্টি-জীবনবৃত্তান্ত

অ্যান্ড্রয়েড 10-এ, কার্যকলাপের জীবনচক্রের অবস্থা দৃশ্যমানতা এবং জেড-অর্ডার দ্বারা নির্ধারিত হয়। একটি কার্যকলাপে দৃশ্যমানতা আপডেট করার পরে সঠিক অবস্থা নিশ্চিত করতে এবং কোন জীবনচক্র অবস্থা প্রযোজ্য তা মূল্যায়ন করতে, বিভিন্ন অবস্থান থেকে ActivityRecord#makeActiveIfNeeded() পদ্ধতি ব্যবহার করুন৷ অ্যান্ড্রয়েড 10-এ, সক্রিয় মানে হয় আবার RESUMED বা PAUSED এবং শুধুমাত্র এই দুটি ক্ষেত্রে কাজ করে।

অ্যান্ড্রয়েড 10-এ, সিস্টেমের একক অবস্থানের পরিবর্তে প্রতিটি স্ট্যাকের মধ্যে একটি কার্যকলাপ পুনরায় শুরু করা আলাদাভাবে ট্র্যাক করা হয়। এর কারণ হল মাল্টি-উইন্ডো মোডে একাধিক অ্যাক্টিভিটি ট্রানজিশন একসাথে করা যেতে পারে। বিস্তারিত জানার জন্য, ActivityStack#mInResumeTopActivity দেখুন।

শীর্ষ-পুনরায় শুরু হওয়া কার্যকলাপ কলব্যাক

একটি শীর্ষ কার্যকলাপ পরিবর্তনের ফলে (যেমন কার্যকলাপ লঞ্চ, পুনরায় শুরু, বা Z-অর্ডার পরিবর্তন) হতে পারে এমন ক্রিয়াগুলির পরে, ActivityStackSupervisor#updateTopResumedActivityIfNeeded() চালু করা হয়। এই পদ্ধতিটি শীর্ষস্থানীয় পুনরায় শুরু হওয়া কার্যকলাপ পরিবর্তিত হয়েছে কিনা তা পরীক্ষা করে এবং প্রয়োজনে আপডেটটি সম্পাদন করে। যদি পূর্ববর্তী শীর্ষ-পুনরায় শুরু করা ক্রিয়াকলাপটি শীর্ষ-পুনরায় শুরু হওয়া অবস্থাটি প্রকাশ না করে, তবে এটিতে একটি শীর্ষ-পুনরায় শুরু হওয়া-রাষ্ট্র-ক্ষতির বার্তা পাঠানো হয় এবং সার্ভারের দিকে একটি সময়সীমা নির্ধারিত হয় ( ActivityStackSupervisor#scheduleTopResumedStateLossTimeout() )। শীর্ষ-পুনরায় শুরু হওয়া অবস্থার একটি প্রতিবেদন পূর্ববর্তীটি রাজ্যটি প্রকাশ করার পরে পরবর্তী কার্যকলাপে পাঠানো হয়, বা যখন একটি টাইমআউট হিট হয় (এর ব্যবহারগুলি দেখুন:

ActivityStackSupervisor#scheduleTopResumedActivityStateIfNeeded()

একটি নতুন TopResumedActivityChangeItem লেনদেন আইটেম যোগ করা হয়েছে ক্লায়েন্টদের কাছে শীর্ষ-পুনরায় শুরু হওয়া অবস্থার পরিবর্তনগুলি রিপোর্ট করতে এবং Android 9 থেকে ActivityLifecycler আর্কিটেকচারের সুবিধা দেয়৷

টপ-রিজুমেড স্টেটটি ক্লায়েন্ট সাইডে সংরক্ষিত থাকে এবং প্রতিবার অ্যাক্টিভিটি RESUMED বা PAUSED এ ট্রানজিশন করা হলে তা onTopResumedActivityChanged() কলব্যাক চালু করা উচিত কিনা তাও চেক করে। এটি সার্ভার এবং ক্লায়েন্ট পক্ষের মধ্যে লাইফসাইকেল স্টেট এবং টপ-রিজুমেড স্টেটের যোগাযোগে কিছু ডিকপলিং সক্ষম করে।

,

অ্যান্ড্রয়েড 9 (এবং নিম্নতর), অ্যাপগুলিকে PAUSED অবস্থায় প্রবেশ করানো হয়েছিল যখন:

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

এই পরিস্থিতিতে একটি অ্যাপকে বিরতি দেওয়ার পরিমাণের মধ্যে পার্থক্য রয়েছে কিন্তু অ্যাপ স্তরে আলাদা করা যাবে না।

অ্যান্ড্রয়েড 10-এ, দৃশ্যমান স্ট্যাকের সমস্ত টপ-ফোকাসেবল অ্যাক্টিভিটি RESUMED অবস্থায় থাকে। এটি মাল্টি-উইন্ডো এবং MD মোডগুলির সাথে সামঞ্জস্য উন্নত করে যেগুলি UI রিফ্রেশ করা এবং ব্যবহারকারীর সাথে ইন্টারঅ্যাক্ট করা বন্ধ করতে onStop() এর পরিবর্তে onPause() ব্যবহার করে৷ এর অর্থ:

  • স্প্লিট-স্ক্রীনে উভয় ক্রিয়াকলাপ পুনরায় শুরু করা হয়েছে।
  • ফ্রি-ফর্ম উইন্ডোজিং মোডে সমস্ত শীর্ষ-দৃশ্যমান ক্রিয়াকলাপ পুনরায় শুরু করা হয়েছে।
  • একাধিক স্ক্রিনে ক্রিয়াকলাপ একই সময়ে পুনরায় শুরু করা যেতে পারে।

চিত্র 1. একটি ভাঁজযোগ্য ডিভাইসে মাল্টি-রিজুম

চিত্র 2. ডেস্কটপ মোডে মাল্টি-রিজুম

ক্রিয়াকলাপগুলি PAUSED অবস্থায় থাকতে পারে যখন সেগুলিকে ফোকাস করা যায় না বা আংশিকভাবে বন্ধ করা হয়, যেমন:

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

এই পদ্ধতিটি অ্যাপগুলিকে নির্দেশ করে যে একটি কার্যকলাপ শুধুমাত্র RESUMED অবস্থায় একজন ব্যবহারকারীর কাছ থেকে ইনপুট পেতে পারে। অ্যান্ড্রয়েড 10-এর আগে, ক্রিয়াকলাপগুলিও PAUSED অবস্থায় ইনপুট গ্রহণ করতে পারে (উদাহরণস্বরূপ, অ্যান্ড্রয়েড 9 চালিত ডিভাইসে একই সাথে স্প্লিট-স্ক্রীনে উভয় ক্রিয়াকলাপ স্পর্শ করার চেষ্টা করুন)।

পূর্ববর্তী অ্যান্ড্রয়েড রিলিজগুলি থেকে পুনরায় শুরু হওয়া সংকেত সংরক্ষণ করতে (এবং যখন অ্যাপগুলিকে এক্সক্লুসিভ-অ্যাক্সেস বা সিঙ্গলটন সংস্থানগুলিতে অ্যাক্সেস পাওয়া উচিত তখন যোগাযোগ করতে), Android 10-এ একটি নতুন কলব্যাক অন্তর্ভুক্ত রয়েছে:

Activity#onTopResumedActivityChanged(boolean onTop)

যখন আহ্বান করা হয়, তখন এই কলব্যাকটিকে Activity#onResume() এবং Activity#onPause() এর মধ্যে ডাকা হয়। এই কলব্যাকটি ঐচ্ছিক এবং এড়িয়ে যাওয়া যেতে পারে, তাই একটি ক্রিয়াকলাপ সিস্টেমে শীর্ষস্থানীয় না হয়ে RESUMED থেকে বিরতি PAUSED অবস্থায় যেতে পারে৷ উদাহরণস্বরূপ, মাল্টি-উইন্ডো মোডে। যেহেতু এই কলব্যাক ঐচ্ছিক, এটি কার্যকলাপ জীবনচক্রের অংশ নয় এবং খুব কমই ব্যবহার করা উচিত৷

পূর্ববর্তী শীর্ষ-পুনঃসূচনা কার্যকলাপ onTopResumedActivity(false) গ্রহণ করে এবং শেষ করে পরবর্তী শীর্ষ-পুনঃসূচিত কার্যকলাপ onTopResumedActivity(true) প্রাপ্ত হওয়ার আগে যদি পূর্ববর্তী কার্যকলাপটি মেথড কলটি পরিচালনা করতে খুব বেশি সময় নেয় এবং 500 ms টাইমআউট হিট করে।

সামঞ্জস্য

মাল্টি-রিজুমে প্রয়োগ করার সময় সামঞ্জস্য বজায় রাখতে, এই সমাধানগুলি বিবেচনা করুন।

একটি অ্যাপ প্রক্রিয়ায় একাধিক পুনরায় শুরু করা কার্যক্রম

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

একযোগে ক্যামেরা অ্যাক্সেস

  • সমস্যা এই সমস্যাগুলি অ্যান্ড্রয়েড 9 এবং তার নীচের সংস্করণগুলিতেও উপস্থিত রয়েছে৷ উদাহরণ স্বরূপ, একটি পূর্ণস্ক্রীন এবং পুনরায় শুরু করা কার্যকলাপ পিকচার-ইন-পিকচার মোডে উপরে থাকা একটি পজড অ্যাক্টিভিটি থেকে ক্যামেরার ফোকাস হারাতে পারে কিন্তু মাল্টি-উইন্ডো এবং মাল্টি-ডিসপ্লে মোডের ব্যাপক গ্রহণের মাধ্যমে আরও বেশি উন্মুক্ত হয়ে যায়।
    • RESUME স্টেটে করা পরিবর্তনের কারণে, অ্যাপগুলি আবার চালু করার সময়ও ক্যামেরা থেকে সংযোগ বিচ্ছিন্ন হয়ে যেতে পারে। এটি মোকাবেলা করার জন্য, অ্যাপগুলিকে ক্র্যাশ না করে একটি ক্যামেরা সংযোগ বিচ্ছিন্ন পরিচালনা করতে হবে। সংযোগ বিচ্ছিন্ন হয়ে গেলে, অ্যাপগুলি একটি সংযোগ বিচ্ছিন্ন কলব্যাক পায় এবং API-এর সমস্ত কল CameraAccessException নিক্ষেপ করা শুরু করে৷
    • resizeableActivity=false এক্সক্লুসিভ ক্যামেরা অ্যাক্সেসের গ্যারান্টি নয়, কারণ ক্যামেরা ব্যবহার করে অন্যান্য অ্যাপ অন্যান্য ডিসপ্লেতে খোলা যেতে পারে।
  • সমাধান। যখন একটি অ্যাপ ক্যামেরা থেকে সংযোগ বিচ্ছিন্ন হয় তখন বিকাশকারীদের যুক্তি অন্তর্ভুক্ত করা উচিত। যদি একটি অ্যাপ ক্যামেরা থেকে সংযোগ বিচ্ছিন্ন করা হয়, তাহলে এটি পুনরায় সংযোগ করার চেষ্টা করতে এবং ক্যামেরা ব্যবহার চালিয়ে যেতে ক্যামেরা উপলব্ধতা কলব্যাকগুলি দেখতে হবে। বিদ্যমান CameraManager#AvailabilityCallback#onCameraAvailable() কলব্যাক ছাড়াও, Android 10 যোগ করেছে CameraManager#AvailabilityCallback#onCameraAccessPrioritiesChanged() , যা ফোকাস (এবং ক্যামেরার অগ্রাধিকার) বেশ কয়েকটি পুনঃসূচিত ক্রিয়াকলাপের মধ্যে স্যুইচ করলে কেসটি কভার করে। অ্যাপ বিকাশকারীদের ক্যামেরা অ্যাক্সেস করার চেষ্টা করার জন্য একটি ভাল সময় নির্ধারণ করতে এই দুটি কলব্যাক ব্যবহার করা উচিত।

মাল্টি-জীবনবৃত্তান্ত

অ্যান্ড্রয়েড 10-এ, কার্যকলাপের জীবনচক্রের অবস্থা দৃশ্যমানতা এবং জেড-অর্ডার দ্বারা নির্ধারিত হয়। একটি কার্যকলাপে দৃশ্যমানতা আপডেট করার পরে সঠিক অবস্থা নিশ্চিত করতে এবং কোন জীবনচক্র অবস্থা প্রযোজ্য তা মূল্যায়ন করতে, বিভিন্ন অবস্থান থেকে ActivityRecord#makeActiveIfNeeded() পদ্ধতি ব্যবহার করুন৷ অ্যান্ড্রয়েড 10-এ, সক্রিয় মানে হয় আবার RESUMED বা PAUSED এবং শুধুমাত্র এই দুটি ক্ষেত্রে কাজ করে।

অ্যান্ড্রয়েড 10-এ, সিস্টেমের একক অবস্থানের পরিবর্তে প্রতিটি স্ট্যাকের মধ্যে একটি কার্যকলাপ পুনরায় শুরু করা আলাদাভাবে ট্র্যাক করা হয়। এর কারণ হল মাল্টি-উইন্ডো মোডে একাধিক অ্যাক্টিভিটি ট্রানজিশন একসাথে করা যেতে পারে। বিস্তারিত জানার জন্য, ActivityStack#mInResumeTopActivity দেখুন।

শীর্ষ-পুনরায় শুরু হওয়া কার্যকলাপ কলব্যাক

একটি শীর্ষ কার্যকলাপ পরিবর্তনের ফলে (যেমন কার্যকলাপ লঞ্চ, পুনরায় শুরু, বা Z-অর্ডার পরিবর্তন) হতে পারে এমন ক্রিয়াগুলির পরে, ActivityStackSupervisor#updateTopResumedActivityIfNeeded() চালু করা হয়। এই পদ্ধতিটি শীর্ষস্থানীয় পুনরায় শুরু হওয়া কার্যকলাপ পরিবর্তিত হয়েছে কিনা তা পরীক্ষা করে এবং প্রয়োজনে আপডেটটি সম্পাদন করে। যদি পূর্ববর্তী শীর্ষ-পুনরায় শুরু করা ক্রিয়াকলাপটি শীর্ষ-পুনরায় শুরু হওয়া অবস্থাটি প্রকাশ না করে, তবে এটিতে একটি শীর্ষ-পুনরায় শুরু হওয়া-রাষ্ট্র-ক্ষতির বার্তা পাঠানো হয় এবং সার্ভারের দিকে একটি সময়সীমা নির্ধারিত হয় ( ActivityStackSupervisor#scheduleTopResumedStateLossTimeout() )। শীর্ষ-পুনরায় শুরু হওয়া অবস্থার একটি প্রতিবেদন পূর্ববর্তীটি রাজ্যটি প্রকাশ করার পরে পরবর্তী কার্যকলাপে পাঠানো হয়, বা যখন একটি টাইমআউট হিট হয় (এর ব্যবহারগুলি দেখুন:

ActivityStackSupervisor#scheduleTopResumedActivityStateIfNeeded()

একটি নতুন TopResumedActivityChangeItem লেনদেন আইটেম যোগ করা হয়েছে ক্লায়েন্টদের কাছে শীর্ষ-পুনরায় শুরু হওয়া অবস্থার পরিবর্তনগুলি রিপোর্ট করতে এবং Android 9 থেকে ActivityLifecycler আর্কিটেকচারের সুবিধা দেয়৷

টপ-রিজুমেড স্টেটটি ক্লায়েন্ট সাইডে সংরক্ষিত থাকে এবং প্রতিবার অ্যাক্টিভিটি RESUMED বা PAUSED এ ট্রানজিশন করা হলে তা onTopResumedActivityChanged() কলব্যাক চালু করা উচিত কিনা তাও চেক করে। এটি সার্ভার এবং ক্লায়েন্ট পক্ষের মধ্যে লাইফসাইকেল স্টেট এবং টপ-রিজুমেড স্টেটের যোগাযোগে কিছু ডিকপলিং সক্ষম করে।

,

অ্যান্ড্রয়েড 9 (এবং নিম্নতর), অ্যাপগুলিকে PAUSED অবস্থায় প্রবেশ করানো হয়েছিল যখন:

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

এই পরিস্থিতিতে একটি অ্যাপকে বিরতি দেওয়ার পরিমাণের মধ্যে পার্থক্য রয়েছে কিন্তু অ্যাপ স্তরে আলাদা করা যাবে না।

অ্যান্ড্রয়েড 10-এ, দৃশ্যমান স্ট্যাকের সমস্ত টপ-ফোকাসেবল অ্যাক্টিভিটি RESUMED অবস্থায় থাকে। এটি মাল্টি-উইন্ডো এবং MD মোডগুলির সাথে সামঞ্জস্য উন্নত করে যেগুলি UI রিফ্রেশ করা এবং ব্যবহারকারীর সাথে ইন্টারঅ্যাক্ট করা বন্ধ করতে onStop() এর পরিবর্তে onPause() ব্যবহার করে৷ এর অর্থ:

  • স্প্লিট-স্ক্রীনে উভয় ক্রিয়াকলাপ পুনরায় শুরু করা হয়েছে।
  • ফ্রি-ফর্ম উইন্ডোজিং মোডে সমস্ত শীর্ষ-দৃশ্যমান ক্রিয়াকলাপ পুনরায় শুরু করা হয়েছে।
  • একাধিক স্ক্রিনে ক্রিয়াকলাপ একই সময়ে পুনরায় শুরু করা যেতে পারে।

চিত্র 1. একটি ভাঁজযোগ্য ডিভাইসে মাল্টি-রিজুম

চিত্র 2. ডেস্কটপ মোডে মাল্টি-রিজুম

ক্রিয়াকলাপগুলি PAUSED অবস্থায় থাকতে পারে যখন সেগুলিকে ফোকাস করা যায় না বা আংশিকভাবে বন্ধ করা হয়, যেমন:

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

এই পদ্ধতিটি অ্যাপগুলিকে নির্দেশ করে যে একটি কার্যকলাপ শুধুমাত্র RESUMED অবস্থায় একজন ব্যবহারকারীর কাছ থেকে ইনপুট পেতে পারে। অ্যান্ড্রয়েড 10-এর আগে, ক্রিয়াকলাপগুলিও PAUSED অবস্থায় ইনপুট গ্রহণ করতে পারে (উদাহরণস্বরূপ, অ্যান্ড্রয়েড 9 চালিত ডিভাইসে একই সাথে স্প্লিট-স্ক্রীনে উভয় ক্রিয়াকলাপ স্পর্শ করার চেষ্টা করুন)।

পূর্ববর্তী অ্যান্ড্রয়েড রিলিজগুলি থেকে পুনরায় শুরু হওয়া সংকেত সংরক্ষণ করতে (এবং যখন অ্যাপগুলিকে এক্সক্লুসিভ-অ্যাক্সেস বা সিঙ্গলটন সংস্থানগুলিতে অ্যাক্সেস পাওয়া উচিত তখন যোগাযোগ করতে), Android 10-এ একটি নতুন কলব্যাক অন্তর্ভুক্ত রয়েছে:

Activity#onTopResumedActivityChanged(boolean onTop)

যখন আহ্বান করা হয়, তখন এই কলব্যাকটিকে Activity#onResume() এবং Activity#onPause() এর মধ্যে ডাকা হয়। এই কলব্যাকটি ঐচ্ছিক এবং এড়িয়ে যাওয়া যেতে পারে, তাই একটি ক্রিয়াকলাপ সিস্টেমে শীর্ষস্থানীয় না হয়ে RESUMED থেকে বিরতি PAUSED অবস্থায় যেতে পারে৷ উদাহরণস্বরূপ, মাল্টি-উইন্ডো মোডে। যেহেতু এই কলব্যাক ঐচ্ছিক, এটি কার্যকলাপ জীবনচক্রের অংশ নয় এবং খুব কমই ব্যবহার করা উচিত৷

পূর্ববর্তী শীর্ষ-পুনঃসূচনা কার্যকলাপ onTopResumedActivity(false) গ্রহণ করে এবং শেষ করে পরবর্তী শীর্ষ-পুনঃসূচিত কার্যকলাপ onTopResumedActivity(true) প্রাপ্ত হওয়ার আগে যদি পূর্ববর্তী কার্যকলাপটি মেথড কলটি পরিচালনা করতে খুব বেশি সময় নেয় এবং 500 ms টাইমআউট হিট করে।

সামঞ্জস্য

মাল্টি-রিজুমে প্রয়োগ করার সময় সামঞ্জস্য বজায় রাখতে, এই সমাধানগুলি বিবেচনা করুন।

একটি অ্যাপ প্রক্রিয়ায় একাধিক পুনরায় শুরু করা কার্যক্রম

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

একযোগে ক্যামেরা অ্যাক্সেস

  • সমস্যা এই সমস্যাগুলি অ্যান্ড্রয়েড 9 এবং তার নীচের সংস্করণগুলিতেও উপস্থিত রয়েছে৷ উদাহরণ স্বরূপ, একটি পূর্ণস্ক্রীন এবং পুনরায় শুরু করা কার্যকলাপ পিকচার-ইন-পিকচার মোডে উপরে থাকা একটি পজড অ্যাক্টিভিটি থেকে ক্যামেরার ফোকাস হারাতে পারে কিন্তু মাল্টি-উইন্ডো এবং মাল্টি-ডিসপ্লে মোডের ব্যাপক গ্রহণের মাধ্যমে আরও বেশি উন্মুক্ত হয়ে যায়।
    • RESUME স্টেটে করা পরিবর্তনের কারণে, অ্যাপগুলি আবার চালু করার সময়ও ক্যামেরা থেকে সংযোগ বিচ্ছিন্ন হয়ে যেতে পারে। এটি মোকাবেলা করার জন্য, অ্যাপগুলিকে ক্র্যাশ না করে একটি ক্যামেরা সংযোগ বিচ্ছিন্ন পরিচালনা করতে হবে। সংযোগ বিচ্ছিন্ন হয়ে গেলে, অ্যাপগুলি একটি সংযোগ বিচ্ছিন্ন কলব্যাক পায় এবং API-এর সমস্ত কল CameraAccessException নিক্ষেপ করা শুরু করে৷
    • resizeableActivity=false এক্সক্লুসিভ ক্যামেরা অ্যাক্সেসের গ্যারান্টি নয়, কারণ ক্যামেরা ব্যবহার করে অন্যান্য অ্যাপ অন্যান্য ডিসপ্লেতে খোলা যেতে পারে।
  • সমাধান। যখন একটি অ্যাপ ক্যামেরা থেকে সংযোগ বিচ্ছিন্ন হয় তখন বিকাশকারীদের যুক্তি অন্তর্ভুক্ত করা উচিত। যদি একটি অ্যাপ ক্যামেরা থেকে সংযোগ বিচ্ছিন্ন করা হয়, তাহলে এটি পুনরায় সংযোগ করার চেষ্টা করতে এবং ক্যামেরা ব্যবহার চালিয়ে যেতে ক্যামেরা উপলব্ধতা কলব্যাকগুলি দেখতে হবে। বিদ্যমান CameraManager#AvailabilityCallback#onCameraAvailable() কলব্যাক ছাড়াও, Android 10 যোগ করেছে CameraManager#AvailabilityCallback#onCameraAccessPrioritiesChanged() , যা ফোকাস (এবং ক্যামেরার অগ্রাধিকার) বেশ কয়েকটি পুনঃসূচিত ক্রিয়াকলাপের মধ্যে স্যুইচ করলে কেসটি কভার করে। অ্যাপ ডেভেলপারদের ক্যামেরা অ্যাক্সেস করার চেষ্টা করার জন্য একটি ভাল সময় নির্ধারণ করতে এই দুটি কলব্যাক ব্যবহার করা উচিত।

মাল্টি-জীবনবৃত্তান্ত

অ্যান্ড্রয়েড 10-এ, কার্যকলাপের জীবনচক্রের অবস্থা দৃশ্যমানতা এবং জেড-অর্ডার দ্বারা নির্ধারিত হয়। একটি কার্যকলাপে দৃশ্যমানতা আপডেট করার পরে সঠিক অবস্থা নিশ্চিত করতে এবং কোন জীবনচক্র অবস্থা প্রযোজ্য তা মূল্যায়ন করতে, বিভিন্ন অবস্থান থেকে ActivityRecord#makeActiveIfNeeded() পদ্ধতি ব্যবহার করুন৷ অ্যান্ড্রয়েড 10-এ, সক্রিয় মানে হয় আবার RESUMED বা PAUSED এবং শুধুমাত্র এই দুটি ক্ষেত্রে কাজ করে।

অ্যান্ড্রয়েড 10-এ, সিস্টেমের একক অবস্থানের পরিবর্তে প্রতিটি স্ট্যাকের মধ্যে একটি কার্যকলাপ পুনরায় শুরু করা আলাদাভাবে ট্র্যাক করা হয়। এর কারণ হল মাল্টি-উইন্ডো মোডে একাধিক অ্যাক্টিভিটি ট্রানজিশন একসাথে করা যেতে পারে। বিস্তারিত জানার জন্য, ActivityStack#mInResumeTopActivity দেখুন।

শীর্ষ-পুনরায় শুরু হওয়া কার্যকলাপ কলব্যাক

একটি শীর্ষ কার্যকলাপ পরিবর্তনের ফলে (যেমন কার্যকলাপ লঞ্চ, পুনরায় শুরু, বা Z-অর্ডার পরিবর্তন) হতে পারে এমন ক্রিয়াগুলির পরে, ActivityStackSupervisor#updateTopResumedActivityIfNeeded() চালু করা হয়। এই পদ্ধতিটি শীর্ষস্থানীয় পুনরায় শুরু হওয়া কার্যকলাপ পরিবর্তিত হয়েছে কিনা তা পরীক্ষা করে এবং প্রয়োজনে আপডেটটি সম্পাদন করে। যদি পূর্ববর্তী শীর্ষ-পুনরায় শুরু করা ক্রিয়াকলাপটি শীর্ষ-পুনরায় শুরু হওয়া অবস্থাটি প্রকাশ না করে, তবে এটিতে একটি শীর্ষ-পুনরায় শুরু হওয়া-রাষ্ট্র-ক্ষতির বার্তা পাঠানো হয় এবং সার্ভারের দিকে একটি সময়সীমা নির্ধারিত হয় ( ActivityStackSupervisor#scheduleTopResumedStateLossTimeout() )। শীর্ষ-পুনরায় শুরু হওয়া অবস্থার একটি প্রতিবেদন পূর্ববর্তীটি রাজ্যটি প্রকাশ করার পরে পরবর্তী কার্যকলাপে পাঠানো হয়, বা যখন একটি টাইমআউট হিট হয় (এর ব্যবহারগুলি দেখুন:

ActivityStackSupervisor#scheduleTopResumedActivityStateIfNeeded()

একটি নতুন TopResumedActivityChangeItem লেনদেন আইটেম যোগ করা হয়েছে ক্লায়েন্টদের কাছে শীর্ষ-পুনরায় শুরু হওয়া অবস্থার পরিবর্তনগুলি রিপোর্ট করতে এবং Android 9 থেকে ActivityLifecycler আর্কিটেকচারের সুবিধা দেয়৷

টপ-রিজুমেড স্টেটটি ক্লায়েন্ট সাইডে সংরক্ষিত থাকে এবং প্রতিবার অ্যাক্টিভিটি RESUMED বা PAUSED এ ট্রানজিশন করা হলে তা onTopResumedActivityChanged() কলব্যাক চালু করা উচিত কিনা তাও চেক করে। এটি সার্ভার এবং ক্লায়েন্ট পক্ষের মধ্যে লাইফসাইকেল স্টেট এবং টপ-রিজুমেড স্টেটের যোগাযোগে কিছু ডিকপলিং সক্ষম করে।