ফোরগ্রাউন্ড সার্ভিস টাইমআউট

যদি কোনো অ্যাপ অ্যান্ড্রয়েড ১৫ বা তার উচ্চতর সংস্করণকে টার্গেট করে, তাহলে আপনার অ্যাপটি ব্যাকগ্রাউন্ডে থাকাকালীন নির্দিষ্ট কিছু ফোরগ্রাউন্ড সার্ভিস কতক্ষণ চলতে পারবে, তার উপর সিস্টেম সীমাবদ্ধতা আরোপ করে। বর্তমানে, এই সীমাবদ্ধতা শুধুমাত্র dataSync এবং mediaProcessing ফোরগ্রাউন্ড সার্ভিস টাইপের ক্ষেত্রে প্রযোজ্য। shortService ফোরগ্রাউন্ড সার্ভিস টাইপের উপর আরও কঠোর সীমাবদ্ধতা রয়েছে, যা সেই সার্ভিস টাইপের ডকুমেন্টেশনে আলোচনা করা হয়েছে।

টাইমআউট আচরণ

সিস্টেমটি dataSync এবং mediaProcessing ফোরগ্রাউন্ড সার্ভিসগুলোকে একটি ২৪-ঘণ্টার মধ্যে মোট ৬ ঘণ্টা চলার অনুমতি দেয়, যার পরে সিস্টেমটি চলমান সার্ভিসটির Service.onTimeout(int, int) মেথডটি কল করে (যা অ্যান্ড্রয়েড ১৫-এ চালু করা হয়েছিল)। ( mediaProcessing ফোরগ্রাউন্ড সার্ভিস টাইপটি অ্যান্ড্রয়েড ১৫-এ যোগ করা হয়েছিল।) এই ছয়-ঘণ্টার সময়সীমা dataSync এবং mediaProcessing সার্ভিসগুলোর জন্য আলাদাভাবে ট্র্যাক করা হয়। উদাহরণস্বরূপ, যদি একটি dataSync সার্ভিস মাত্র এক ঘণ্টা চলে, তাহলে অ্যাপটিতে dataSync ফোরগ্রাউন্ড সার্ভিসগুলোর জন্য মাত্র পাঁচ ঘণ্টা সময় উপলব্ধ থাকবে, কিন্তু mediaProcessing সার্ভিসগুলোর জন্য পুরো ছয় ঘণ্টাই উপলব্ধ থাকবে।

যখন একটি ফোরগ্রাউন্ড সার্ভিস ছয়-ঘণ্টার সীমায় পৌঁছায়, তখন সার্ভিসটি Service.stopSelf() কল করার জন্য কয়েক সেকেন্ড সময় পায়। যখন সিস্টেম Service.onTimeout() কল করে, তখন সার্ভিসটিকে আর ফোরগ্রাউন্ড সার্ভিস হিসেবে গণ্য করা হয় না। যদি সার্ভিসটি Service.stopSelf() কল না করে, তাহলে সিস্টেম একটি ইন্টারনাল এক্সেপশন থ্রো করে। এক্সেপশনটি Logcat- এ নিম্নলিখিত মেসেজ সহ লগ করা হয়:

Fatal Exception: android.app.RemoteServiceException: "A foreground service of
type [service type] did not stop within its timeout: [component name]"

এই আচরণগত পরিবর্তনজনিত সমস্যা এড়াতে, আপনি নিম্নলিখিত এক বা একাধিক কাজ করতে পারেন:

  1. আপনার সার্ভিসে নতুন Service.onTimeout(int, int) মেথডটি ইমপ্লিমেন্ট করুন। আপনার অ্যাপ যখন কলব্যাকটি পাবে, তখন কয়েক সেকেন্ডের মধ্যেই stopSelf() কল করতে ভুলবেন না। (যদি আপনি সাথে সাথে অ্যাপটি বন্ধ না করেন, তাহলে সিস্টেম একটি ফেইলর (failed) দেখাবে।)
  2. নিশ্চিত করুন যে আপনার অ্যাপের dataSync এবং mediaProcessing সার্ভিসগুলো যেকোনো ২৪-ঘণ্টার মধ্যে মোট ৬ ঘণ্টার বেশি না চলে (যদি না ব্যবহারকারী অ্যাপটি ব্যবহার করে টাইমারটি রিসেট করে)।
  3. শুধুমাত্র সরাসরি ব্যবহারকারীর ইন্টারঅ্যাকশনের ফলেই dataSync বা mediaProcessing ফোরগ্রাউন্ড সার্ভিসগুলো চালু করুন; যেহেতু সার্ভিসটি চালু হওয়ার সময় আপনার অ্যাপটি ফোরগ্রাউন্ডে থাকে, তাই অ্যাপটি ব্যাকগ্রাউন্ডে চলে যাওয়ার পরেও সার্ভিসটি পুরো ছয় ঘণ্টা চালু থাকে।
  4. এই ফোরগ্রাউন্ড সার্ভিসগুলো ব্যবহার করার পরিবর্তে, WorkManager-এর মতো একটি বিকল্প API ব্যবহার করুন। বিশেষ করে, dataSync ফোরগ্রাউন্ড সার্ভিস ব্যবহার করার পরিবর্তে একটি বিকল্প API ব্যবহার করার কথা বিবেচনা করুন।

যদি আপনার অ্যাপের dataSync ফোরগ্রাউন্ড সার্ভিসগুলো গত ২৪ ঘণ্টায় ৬ ঘণ্টা ধরে চলে থাকে, তাহলে ব্যবহারকারী আপনার অ্যাপটিকে ফোরগ্রাউন্ডে না আনা পর্যন্ত (যা টাইমার রিসেট করে) আপনি অন্য কোনো dataSync ফোরগ্রাউন্ড সার্ভিস চালু করতে পারবেন না। আপনি যদি অন্য কোনো dataSync ফোরগ্রাউন্ড সার্ভিস চালু করার চেষ্টা করেন, তাহলে সিস্টেমটি "Time limit already exhausted for foreground service type dataSync"-এর মতো একটি এরর মেসেজসহ ForegroundServiceStartNotAllowedException থ্রো করবে।

পরীক্ষা

আপনার অ্যাপের আচরণ পরীক্ষা করার জন্য, আপনি ডেটা সিঙ্ক টাইমআউট চালু করতে পারেন, এমনকি যদি আপনার অ্যাপটি অ্যান্ড্রয়েড ১৫ টার্গেট না-ও করে থাকে (যতক্ষণ পর্যন্ত অ্যাপটি একটি অ্যান্ড্রয়েড ১৫ ডিভাইসে চলছে)। টাইমআউট চালু করতে, নিম্নলিখিত adb কমান্ডটি চালান:

adb shell am compat enable FGS_INTRODUCE_TIME_LIMITS your-package-name

আপনি টাইমআউট পিরিয়ডও অ্যাডজাস্ট করতে পারেন, যাতে লিমিটে পৌঁছালে আপনার অ্যাপ কীভাবে আচরণ করে তা পরীক্ষা করা সহজ হয়। dataSync ফোরগ্রাউন্ড সার্ভিসগুলোর জন্য একটি নতুন টাইমআউট পিরিয়ড সেট করতে, নিম্নলিখিত adb কমান্ডটি চালান:

adb shell device_config put activity_manager data_sync_fgs_timeout_duration duration-in-milliseconds

mediaProcessing ফোরগ্রাউন্ড সার্ভিসগুলোর জন্য একটি নতুন টাইমআউট সময়কাল সেট করতে, এই কমান্ডটি চালান:

adb shell device_config put activity_manager media_processing_fgs_timeout_duration duration-in-milliseconds