যদি কোনও অ্যাপ অ্যান্ড্রয়েড ১৫ বা তার উচ্চতর ভার্সনের জন্য কাজ করে, তাহলে আপনার অ্যাপটি ব্যাকগ্রাউন্ডে থাকাকালীন নির্দিষ্ট কিছু ফোরগ্রাউন্ড পরিষেবা কতক্ষণ চালানো যাবে তার উপর সিস্টেম বিধিনিষেধ আরোপ করে। বর্তমানে, এই বিধিনিষেধ শুধুমাত্র dataSync এবং mediaProcessing ফোরগ্রাউন্ড পরিষেবা ধরণের ফোরগ্রাউন্ড পরিষেবাগুলির ক্ষেত্রে প্রযোজ্য। shortService ফোরগ্রাউন্ড পরিষেবা ধরণের উপর আরও সীমাবদ্ধ সীমা রয়েছে যা সেই পরিষেবা ধরণের ডকুমেন্টেশনে আলোচনা করা হয়েছে।
টাইমআউট আচরণ
এই সিস্টেমটি dataSync এবং mediaProcessing foreground পরিষেবাগুলিকে 24 ঘন্টার মধ্যে মোট 6 ঘন্টা চালানোর অনুমতি দেয়, তারপরে সিস্টেমটি চলমান পরিষেবার Service.onTimeout(int, int) পদ্ধতিটি কল করে (Android 15 এ প্রবর্তিত)। ( mediaProcessing foreground পরিষেবার ধরণটি Android 15 এ যুক্ত করা হয়েছিল।) dataSync এবং mediaProcessing পরিষেবাগুলির জন্য ছয় ঘন্টার সময়সীমা আলাদাভাবে ট্র্যাক করা হয়। উদাহরণস্বরূপ, যদি একটি dataSync পরিষেবা মাত্র এক ঘন্টার জন্য চলে, তাহলে অ্যাপটিতে dataSync foreground পরিষেবাগুলির জন্য মাত্র পাঁচ ঘন্টা উপলব্ধ থাকবে, তবে 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]"
এই আচরণ পরিবর্তনের সমস্যা এড়াতে, আপনি নিম্নলিখিতগুলির মধ্যে একটি বা একাধিক করতে পারেন:
- আপনার পরিষেবাকে নতুন
Service.onTimeout(int, int)পদ্ধতিটি প্রয়োগ করতে বলুন। যখন আপনার অ্যাপটি কলব্যাক পাবে, তখন কয়েক সেকেন্ডের মধ্যেstopSelf()কল করতে ভুলবেন না। (যদি আপনি এখনই অ্যাপটি বন্ধ না করেন, তাহলে সিস্টেমটি একটি ব্যর্থতা তৈরি করবে।) - নিশ্চিত করুন যে আপনার অ্যাপের
dataSyncএবংmediaProcessingপরিষেবাগুলি 24 ঘন্টার মধ্যে মোট 6 ঘন্টার বেশি চলবে না (যদি না ব্যবহারকারী অ্যাপটির সাথে ইন্টারঅ্যাক্ট করে, টাইমার রিসেট করে)। - শুধুমাত্র ব্যবহারকারীর সরাসরি মিথস্ক্রিয়ার ফলে
dataSyncবাmediaProcessingফোরগ্রাউন্ড পরিষেবা শুরু করুন; যেহেতু পরিষেবা শুরু হওয়ার সময় আপনার অ্যাপটি ফোরগ্রাউন্ডে থাকে, তাই অ্যাপটি ব্যাকগ্রাউন্ডে যাওয়ার পরে আপনার পরিষেবাটি পুরো ছয় ঘন্টা সময় পাবে। - এই ফোরগ্রাউন্ড পরিষেবাগুলি ব্যবহার করার পরিবর্তে, WorkManager এর মতো একটি বিকল্প API ব্যবহার করুন। বিশেষ করে,
dataSyncফোরগ্রাউন্ড পরিষেবা ব্যবহার করার পরিবর্তে, একটি বিকল্প API ব্যবহার করার কথা বিবেচনা করুন।
যদি আপনার অ্যাপের dataSync ফোরগ্রাউন্ড পরিষেবাগুলি গত ২৪ ঘন্টা ধরে ৬ ঘন্টা ধরে চলে, তাহলে আপনি অন্য dataSync ফোরগ্রাউন্ড পরিষেবা শুরু করতে পারবেন না যদি না ব্যবহারকারী আপনার অ্যাপটিকে ফোরগ্রাউন্ডে না নিয়ে আসে (যা টাইমার রিসেট করে)। যদি আপনি অন্য dataSync ফোরগ্রাউন্ড পরিষেবা শুরু করার চেষ্টা করেন, তাহলে সিস্টেমটি "Time limit already exhausted for forground service type dataSync" এর মতো একটি ত্রুটি বার্তা সহ ForegroundServiceStartNotAllowedException পাঠায়।
পরীক্ষামূলক
আপনার অ্যাপের আচরণ পরীক্ষা করার জন্য, আপনি ডেটা সিঙ্ক টাইমআউট সক্ষম করতে পারেন, এমনকি যদি আপনার অ্যাপটি Android 15-কে লক্ষ্য না করে (যতক্ষণ না অ্যাপটি Android 15 ডিভাইসে চলছে)। টাইমআউট সক্ষম করতে, নিম্নলিখিত 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