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

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

টাইমআউট আচরণ

সিস্টেম dataSync এবং mediaProcessing ফোরগ্রাউন্ড পরিষেবাগুলিকে 24-ঘণ্টার মধ্যে মোট 6 ঘন্টা চালানোর অনুমতি দেয়, তারপরে সিস্টেমটি চলমান পরিষেবাটির Service.onTimeout(int, int) পদ্ধতিতে কল করে (Android 15 এ প্রবর্তিত)। ( mediaProcessing ফোরগ্রাউন্ড পরিষেবার ধরনটি অ্যান্ড্রয়েড 15-এ যোগ করা হয়েছিল।) dataSync এবং mediaProcessing পরিষেবাগুলির জন্য ছয়-ঘণ্টার সময়সীমা আলাদাভাবে ট্র্যাক করা হয়। উদাহরণস্বরূপ, যদি একটি dataSync পরিষেবা শুধুমাত্র এক ঘন্টার জন্য চলে, তবে অ্যাপটিতে mediaProcessing ফোরগ্রাউন্ড পরিষেবাগুলির জন্য মাত্র পাঁচ ঘন্টা উপলব্ধ থাকবে, তবে dataSync পরিষেবাগুলির জন্য এটির জন্য পুরো ছয় ঘন্টা উপলব্ধ থাকবে৷

যখন একটি ফোরগ্রাউন্ড পরিষেবা ছয়-ঘণ্টার সীমায় পৌঁছে যায়, পরিষেবাটিতে 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() কল করতে ভুলবেন না। (যদি আপনি এখনই অ্যাপটি বন্ধ না করেন তবে সিস্টেমটি একটি ব্যর্থতা তৈরি করে।)
  2. নিশ্চিত করুন যে আপনার অ্যাপের dataSync এবং mediaProcessing পরিষেবাগুলি যে কোনও 24-ঘণ্টার সময়ে মোট 6 ঘন্টার বেশি চলবে না (যদি না ব্যবহারকারী অ্যাপটির সাথে ইন্টারঅ্যাক্ট করে, টাইমার রিসেট করে)।
  3. শুধুমাত্র dataSync বা mediaProcessing ফোরগ্রাউন্ড পরিষেবাগুলি সরাসরি ব্যবহারকারীর ইন্টারঅ্যাকশনের ফলে শুরু করুন; যেহেতু পরিষেবাটি শুরু হওয়ার সময় আপনার অ্যাপটি ফোরগ্রাউন্ডে থাকে, তাই অ্যাপটি ব্যাকগ্রাউন্ডে যাওয়ার পরে আপনার পরিষেবার পুরো ছয় ঘন্টা থাকে।
  4. এই ফোরগ্রাউন্ড পরিষেবাগুলি ব্যবহার করার পরিবর্তে, একটি বিকল্প API ব্যবহার করুন, যেমন WorkManager. বিশেষ করে, একটি dataSync ফোরগ্রাউন্ড পরিষেবা ব্যবহার করার পরিবর্তে, একটি বিকল্প API ব্যবহার করার কথা বিবেচনা করুন৷

যদি আপনার অ্যাপের dataSync ফোরগ্রাউন্ড পরিষেবাগুলি গত 24-এর মধ্যে 6 ঘন্টা ধরে চলে থাকে, তবে ব্যবহারকারী আপনার অ্যাপটিকে ফোরগ্রাউন্ডে না আনলে আপনি অন্য dataSync ফোরগ্রাউন্ড পরিষেবা শুরু করতে পারবেন না (যা টাইমার রিসেট করে)। আপনি যদি অন্য একটি dataSync ফোরগ্রাউন্ড পরিষেবা শুরু করার চেষ্টা করেন, তাহলে সিস্টেমটি "ফোরগ্রাউন্ড সার্ভিস টাইপ ডেটাসিঙ্কের জন্য সময়সীমা ইতিমধ্যেই শেষ" এর মতো একটি ত্রুটি বার্তা সহ ForegroundServiceStartNotAllowedException ছুড়ে দেয়৷

টেস্টিং

আপনার অ্যাপের আচরণ পরীক্ষা করার জন্য, আপনি ডেটা সিঙ্ক টাইমআউট সক্ষম করতে পারেন এমনকি যদি আপনার অ্যাপ অ্যান্ড্রয়েড 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
,

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

টাইমআউট আচরণ

সিস্টেম dataSync এবং mediaProcessing ফোরগ্রাউন্ড পরিষেবাগুলিকে 24-ঘণ্টার মধ্যে মোট 6 ঘন্টা চালানোর অনুমতি দেয়, তারপরে সিস্টেমটি চলমান পরিষেবাটির Service.onTimeout(int, int) পদ্ধতিতে কল করে (Android 15 এ প্রবর্তিত)। ( mediaProcessing ফোরগ্রাউন্ড পরিষেবার ধরনটি অ্যান্ড্রয়েড 15-এ যোগ করা হয়েছিল।) dataSync এবং mediaProcessing পরিষেবাগুলির জন্য ছয়-ঘণ্টার সময়সীমা আলাদাভাবে ট্র্যাক করা হয়। উদাহরণস্বরূপ, যদি একটি dataSync পরিষেবা শুধুমাত্র এক ঘন্টার জন্য চলে, তবে অ্যাপটিতে mediaProcessing ফোরগ্রাউন্ড পরিষেবাগুলির জন্য মাত্র পাঁচ ঘন্টা উপলব্ধ থাকবে, তবে dataSync পরিষেবাগুলির জন্য এটির জন্য পুরো ছয় ঘন্টা উপলব্ধ থাকবে৷

যখন একটি ফোরগ্রাউন্ড পরিষেবা ছয়-ঘণ্টার সীমায় পৌঁছে যায়, পরিষেবাটিতে 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() কল করতে ভুলবেন না। (যদি আপনি এখনই অ্যাপটি বন্ধ না করেন তবে সিস্টেমটি একটি ব্যর্থতা তৈরি করে।)
  2. নিশ্চিত করুন যে আপনার অ্যাপের dataSync এবং mediaProcessing পরিষেবাগুলি যে কোনও 24-ঘণ্টার সময়ে মোট 6 ঘন্টার বেশি চলবে না (যদি না ব্যবহারকারী অ্যাপটির সাথে ইন্টারঅ্যাক্ট করে, টাইমার রিসেট করে)।
  3. শুধুমাত্র dataSync বা mediaProcessing ফোরগ্রাউন্ড পরিষেবাগুলি সরাসরি ব্যবহারকারীর ইন্টারঅ্যাকশনের ফলে শুরু করুন; যেহেতু পরিষেবাটি শুরু হওয়ার সময় আপনার অ্যাপটি ফোরগ্রাউন্ডে থাকে, তাই অ্যাপটি ব্যাকগ্রাউন্ডে যাওয়ার পরে আপনার পরিষেবার পুরো ছয় ঘন্টা থাকে।
  4. এই ফোরগ্রাউন্ড পরিষেবাগুলি ব্যবহার করার পরিবর্তে, একটি বিকল্প API ব্যবহার করুন, যেমন WorkManager. বিশেষ করে, একটি dataSync ফোরগ্রাউন্ড পরিষেবা ব্যবহার করার পরিবর্তে, একটি বিকল্প API ব্যবহার করার কথা বিবেচনা করুন৷

যদি আপনার অ্যাপের dataSync ফোরগ্রাউন্ড পরিষেবাগুলি গত 24-এর মধ্যে 6 ঘন্টা ধরে চলে থাকে, তবে ব্যবহারকারী আপনার অ্যাপটিকে ফোরগ্রাউন্ডে না আনলে আপনি অন্য dataSync ফোরগ্রাউন্ড পরিষেবা শুরু করতে পারবেন না (যা টাইমার রিসেট করে)। আপনি যদি অন্য একটি dataSync ফোরগ্রাউন্ড পরিষেবা শুরু করার চেষ্টা করেন, তাহলে সিস্টেমটি "ফোরগ্রাউন্ড সার্ভিস টাইপ ডেটাসিঙ্কের জন্য সময়সীমা ইতিমধ্যেই শেষ" এর মতো একটি ত্রুটি বার্তা সহ ForegroundServiceStartNotAllowedException ছুড়ে দেয়৷

টেস্টিং

আপনার অ্যাপের আচরণ পরীক্ষা করার জন্য, আপনি ডেটা সিঙ্ক টাইমআউট সক্ষম করতে পারেন এমনকি যদি আপনার অ্যাপ অ্যান্ড্রয়েড 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