এই পৃষ্ঠায় ফোরগ্রাউন্ড সার্ভিস ব্যর্থ হওয়ার কিছু সাধারণ কারণ আলোচনা করা হয়েছে এবং সমস্যাটির মূল কারণ শনাক্ত করতে সাহায্য করা হয়েছে।
এই নথিতে নিম্নলিখিত বিষয়গুলো আলোচনা করা হয়েছে:
সমস্যা সমাধানের আগে
ফোরগ্রাউন্ড পরিষেবাগুলিতে সাম্প্রতিক পরিবর্তনগুলি পরীক্ষা করুন
ফোরগ্রাউন্ড সার্ভিসগুলো ভুলভাবে ব্যবহার করা হলে, তা ডিভাইসের পারফরম্যান্স এবং ব্যাটারি লাইফের ওপর নেতিবাচক প্রভাব ফেলতে পারে। এই কারণে, এই খারাপ প্রভাবগুলো সীমিত করার জন্য অ্যান্ড্রয়েড প্ল্যাটফর্মের রিলিজগুলোতে প্রায়শই ফোরগ্রাউন্ড সার্ভিসের আচরণে পরিবর্তন আনা হয়।
যদি আপনি ফোরগ্রাউন্ড সার্ভিস নিয়ে সমস্যায় পড়েন, তবে আপনার ফোরগ্রাউন্ড সার্ভিস ডকুমেন্টেশনের পরিবর্তনগুলো পরীক্ষা করে দেখা উচিত এবং এমন কোনো সাম্প্রতিক পরিবর্তন আছে কিনা তা খতিয়ে দেখা উচিত যা আপনার সমস্যার কারণ ব্যাখ্যা করতে পারে। নিম্নলিখিত পরিস্থিতিতে পরিবর্তনগুলো পরীক্ষা করা বিশেষভাবে গুরুত্বপূর্ণ:
- যে ফোরগ্রাউন্ড সার্ভিস কোডটি আগে কাজ করত, সেটি এখন ব্যর্থ হচ্ছে।
- আপনি এইমাত্র একটি নতুন প্ল্যাটফর্ম রিলিজে টেস্টিং শুরু করেছেন, অথবা আপনি আপনার অ্যাপের টার্গেট করা এপিআই লেভেল পরিবর্তন করেছেন।
এছাড়াও, আপনি যদি প্ল্যাটফর্মটির ডেভেলপার প্রিভিউতে আপনার ডিভাইসটি পরীক্ষা করেন, তাহলে ডেভেলপার প্রিভিউ ডকুমেন্টেশনের সর্বশেষ সংস্করণটি দেখে নিতে ভুলবেন না।
অ্যাপ্লিকেশন সাড়া দিচ্ছে না (ANR) ত্রুটি
কিছু নির্দিষ্ট পরিস্থিতিতে, একটি অ্যাপের তার ফোরগ্রাউন্ড সার্ভিসটি বন্ধ করে দেওয়ার কথা। যদি অ্যাপটি সার্ভিসটি বন্ধ না করে, তবে সিস্টেম সার্ভিসটি বন্ধ করে দেয় এবং একটি 'অ্যাপ্লিকেশন নট রেসপন্ডিং' (ANR) ত্রুটি দেখায়।
শর্ট সার্ভিস দীর্ঘ সময় ধরে চলার কারণে ANR হচ্ছে।
যেসব ফোরগ্রাউন্ড সার্ভিস শর্ট সার্ভিস টাইপ ব্যবহার করে, সেগুলোকে অবশ্যই দ্রুত, প্রায় তিন মিনিটের মধ্যে সম্পন্ন হতে হবে। সময় শেষ হয়ে গেলে, সিস্টেম সার্ভিসটির Service.onTimeout(int,int) মেথডকে কল করে। সার্ভিসটি stopSelf() কল করার জন্য কয়েক সেকেন্ড সময় পায়। যদি সার্ভিসটি নিজে থেকে বন্ধ না হয়, তবে সিস্টেম একটি Application Not Responding এরর দেখায়।
নির্ণয় করুন :
যদি কোনো ফোরগ্রাউন্ড সার্ভিস নিজে থেকে বন্ধ হতে ব্যর্থ হওয়ার কারণে ANR ঘটে থাকে, তাহলে সিস্টেম একটি ইন্টারনাল এক্সেপশন থ্রো করে। ANR রিপোর্টগুলো পরীক্ষা করে আপনি যাচাই করতে পারেন যে এটাই সমস্যা ছিল কি না। যদি এটাই সমস্যা হয়, তাহলে রিপোর্টে নিম্নলিখিত বার্তাটি অন্তর্ভুক্ত থাকবে:
Fatal Exception: android.app.RemoteServiceException: "A foreground service of
type FOREGROUND_SERVICE_TYPE_SHORT_SERVICE did not stop within its timeout:
[component name]"
সমাধান :
নিশ্চিত করুন যে সমস্ত সময়-সীমিত ফোরগ্রাউন্ড সার্ভিস সিস্টেমের নির্ধারিত সময়সীমার মধ্যে তাদের কাজ শেষ করে stopForeground(int) কল করে।
আপনার ফোরগ্রাউন্ড সার্ভিসগুলোকে Service.onTimeout(int,int) ইমপ্লিমেন্ট করান। নিশ্চিত করুন যে ঐ মেথডের ইমপ্লিমেন্টেশনটি সাথে সাথেই stopSelf() কল করে।
ফোরগ্রাউন্ড পরিষেবা ব্যতিক্রম
এই অংশে ফোরগ্রাউন্ড সার্ভিস সংক্রান্ত এমন কয়েকটি সমস্যা বর্ণনা করা হয়েছে, যার কারণে সিস্টেমে এক্সেপশন থ্রো হতে পারে। যদি অ্যাপটি এক্সেপশনটি ক্যাচ না করে, তবে ব্যবহারকারী একটি ডায়ালগ বক্স দেখতে পান, যেখানে জানানো হয় যে অ্যাপটি বন্ধ হয়ে গেছে।
কিছু ক্ষেত্রে, সিস্টেম একটি অভ্যন্তরীণ ব্যতিক্রম (internal exception) দেখায়। সেক্ষেত্রে, আপনি স্ট্যাক ট্রেস (stack trace) দেখে ব্যতিক্রমটি কী ছিল তা জানতে পারবেন এবং আরও বিস্তারিত ত্রুটির তথ্যের জন্য লগক্যাট (Logcat) দেখতে পারেন।
অভ্যন্তরীণ ব্যতিক্রম: সময়সীমা অতিক্রম করেছে
অ্যাপটি ব্যাকগ্রাউন্ডে থাকা অবস্থায় ডেটা সিঙ্ক এবং মিডিয়া প্রসেসিং ফোরগ্রাউন্ড সার্ভিসগুলো কতক্ষণ চলতে পারবে, তার উপর সিস্টেম একটি সীমা নির্ধারণ করে দেয় । যদি সার্ভিসটি সেই সীমা অতিক্রম করে, তবে সিস্টেম সার্ভিসটির Service.onTimeout(int,int) মেথডটি কল করে। সার্ভিসটি stopSelf() কল করার জন্য কয়েক সেকেন্ড সময় পায়। যদি সার্ভিসটি নিজে থেকে বন্ধ না হয়, তবে সিস্টেম একটি অভ্যন্তরীণ RemoteServiceException তৈরি করে, যার ফলে অ্যাপটি ক্র্যাশ করে।
নির্ণয় করুন :
স্ট্যাক ট্রেস দেখে আপনি ব্যতিক্রমটি কী ছিল তা জানতে পারবেন, এবং আরও বিস্তারিত ত্রুটির তথ্যের জন্য লগক্যাট (Logcat) দেখতে পারেন। এই ক্ষেত্রে, লগক্যাটে নিম্নলিখিত ত্রুটির বার্তাটি রয়েছে:
Fatal Exception: android.app.RemoteServiceException: "A foreground service of
type [service type] did not stop within its timeout: [component name]"
সমাধান :
নিশ্চিত করুন যে সমস্ত সময়-সীমিত ফোরগ্রাউন্ড সার্ভিস সিস্টেমের নির্ধারিত সময়সীমার মধ্যে তাদের কাজ শেষ করে stopForeground(int) কল করে।
আপনার ফোরগ্রাউন্ড সার্ভিসগুলোকে Service.onTimeout(int,int) ইমপ্লিমেন্ট করান। নিশ্চিত করুন যে ঐ মেথডের ইমপ্লিমেন্টেশনটি সাথে সাথেই stopSelf() কল করে।
অভ্যন্তরীণ ব্যতিক্রম: ForegroundServiceDidNotStartInTimeException
যখন আপনি context.startForegroundService() কল করে কোনো সার্ভিস চালু করেন, তখন সেই সার্ভিসটি ServiceCompat.startForeground() কল করে নিজেকে ফোরগ্রাউন্ড সার্ভিসে উন্নীত করার জন্য কয়েক সেকেন্ড সময় পায়। যদি সার্ভিসটি তা না করে, তবে এটি একটি অভ্যন্তরীণ ForegroundServiceDidNotStartInTimeException থ্রো করে।
নির্ণয় করুন :
স্ট্যাক ট্রেস দেখে আপনি ব্যতিক্রমটি কী ছিল তা জানতে পারবেন, এবং আরও বিস্তারিত ত্রুটির তথ্যের জন্য লগক্যাট (Logcat) দেখতে পারেন। এই ক্ষেত্রে, লগক্যাটে নিম্নলিখিত ত্রুটির বার্তাটি রয়েছে:
android.app.RemoteServiceException$ForegroundServiceDidNotStartInTimeException:
Context.startForegroundService() did not then call Service.startForeground()
সমাধান :
নিশ্চিত করুন যে সমস্ত নতুন তৈরি করা ফোরগ্রাউন্ড সার্ভিস কয়েক সেকেন্ডের মধ্যে ServiceCompat.startForeground() কল করে।
কর্ম ব্যবস্থাপক :
আপনি WorkManager ওয়ার্কারদের ক্ষেত্রেও এই ব্যতিক্রমটি দেখতে পারেন যারা একটি ফোরগ্রাউন্ড সার্ভিস চালায় ( setForegound বা setForegroundAsync কল করে)। যখন দুটি ফোরগ্রাউন্ড ওয়ার্কারের লাইফসাইকেল ওভারল্যাপ করে, যেমন—একটি ওয়ার্কার একটি ফোরগ্রাউন্ড সার্ভিস শুরু করার চেষ্টা করে এবং একই সময়ে আগে থেকে চলমান একটি ফোরগ্রাউন্ড সার্ভিস বন্ধ হওয়ার চেষ্টা করে—তখন এই ক্র্যাশের সাথে নিম্নলিখিত লগটি দেখা যাবে:
Re-initializing SystemForegroundService after a request to shut-down
WorkManager সংস্করণ 2.10.5- এ এই ক্র্যাশটির একটি সমাধান আনা হয়েছে।
আপনার অ্যাপে এই ব্যতিক্রমটি দেখা দিলে, WorkManager-এর সর্বশেষ সংস্করণে আপডেট করুন এবং কোনো সমস্যা থেকে গেলে WorkManager ইস্যু ট্র্যাকারে তা জানান।
ForegroundServiceStartNotAllowedException
ত্রুটি :
সিস্টেম ForegroundServiceStartNotAllowedException থ্রো করে।
কারণ :
সাধারণত কোনো বৈধ ছাড় না থাকা সত্ত্বেও অ্যাপটি ব্যাকগ্রাউন্ড থেকে কোনো ফোরগ্রাউন্ড সার্ভিস চালু করলে এটি ঘটে থাকে।
অ্যান্ড্রয়েড ১২ (এপিআই লেভেল ৩১) থেকে শুরু করে, কিছু নির্দিষ্ট ব্যতিক্রম ছাড়া, অ্যাপগুলোকে ব্যাকগ্রাউন্ডে চলার সময় ফোরগ্রাউন্ড সার্ভিস চালু করার অনুমতি দেওয়া হয় না । আপনি যদি ব্যাকগ্রাউন্ড থেকে কোনো ফোরগ্রাউন্ড সার্ভিস চালু করার চেষ্টা করেন এবং ব্যতিক্রমগুলোর কোনো একটির শর্ত পূরণ না করেন, তাহলে সিস্টেম ForegroundServiceStartNotAllowedException থ্রো করে। আপনি যদি ব্যতিক্রমটির শর্ত পূরণ না করেন, তাহলেও সিস্টেম একই কাজ করে।
উদাহরণস্বরূপ, একটি অ্যাপে এমন একটি বাটন থাকতে পারে যা ব্যবহারকারী ক্লিক করতে পারেন। এর ফলে অ্যাপটি কিছু প্রসেসিং সম্পন্ন করে এবং তারপর একটি ফোরগ্রাউন্ড সার্ভিস চালু করে। এক্ষেত্রে, এই আশঙ্কা থাকে যে ব্যবহারকারী বাটনটি ক্লিক করার সাথে সাথেই অ্যাপটিকে ব্যাকগ্রাউন্ডে পাঠিয়ে দিতে পারেন। তখন অ্যাপটি ব্যাকগ্রাউন্ড থেকে সার্ভিসটি চালু করার চেষ্টা করবে। যদি অ্যাপটি নির্দিষ্ট ছাড়গুলোর কোনো একটির আওতায় না পড়ে, তাহলে সিস্টেম একটি ForegroundServiceStartNotAllowedException থ্রো করে।
এছাড়াও, কিছু ছাড়ের একটি স্বল্প সময়সীমা থাকে। উদাহরণস্বরূপ, যদি আপনার অ্যাপ একটি উচ্চ-অগ্রাধিকারের FCM বার্তার প্রতিক্রিয়ায় একটি ফোরগ্রাউন্ড পরিষেবা চালু করে, তাহলে একটি সংক্ষিপ্ত ছাড় পাওয়া যায়। যদি আপনি পরিষেবাটি যথেষ্ট দ্রুত চালু না করেন, তাহলে আপনি একটি ForegroundServiceStartNotAllowedException পাবেন।
নতুন অ্যান্ড্রয়েড রিলিজের সাথে নির্দিষ্ট ছাড়গুলো মাঝে মাঝে আরও কঠোর হয়ে যায়। আপনি যদি আপনার অ্যাপের টার্গেট করা অ্যান্ড্রয়েড সংস্করণ পরিবর্তন করে থাকেন, তাহলে ফোরগ্রাউন্ড সার্ভিসেস ডকুমেন্টেশনের পরিবর্তনগুলো পরীক্ষা করুন এবং নিশ্চিত করুন যে আপনার অ্যাপটি এখনও অনুমোদিত ছাড়গুলোর মধ্যে একটির আওতায় পড়ে।
সমাধান :
আপনার অ্যাপের কার্যপ্রবাহ পরিবর্তন করুন যাতে অ্যাপটি ব্যাকগ্রাউন্ডে থাকাকালীন ফোরগ্রাউন্ড পরিষেবা চালু করার প্রয়োজন না হয়, অথবা নিশ্চিত করুন যে আপনার অ্যাপটি ছাড়গুলোর মধ্যে একটির আওতাভুক্ত।
আপনি আপনার অ্যাপের লাইফসাইকেল পরিচালনা করতে লাইফসাইকেল-অ্যাওয়ার কম্পোনেন্ট ব্যবহার করতে পারেন, যাতে আপনি অনিচ্ছাকৃতভাবে ব্যাকগ্রাউন্ড থেকে কোনো ফোরগ্রাউন্ড সার্ভিস চালু করার চেষ্টা না করেন।
নিরাপত্তা ব্যতিক্রম
ত্রুটি :
সিস্টেম SecurityException থ্রো করে।
কারণ :
আপনার অ্যাপটি প্রয়োজনীয় অনুমতি ছাড়াই একটি ফোরগ্রাউন্ড সার্ভিস চালু করার চেষ্টা করেছে।
- কোনো অ্যাপ যদি অ্যান্ড্রয়েড ৯ (এপিআই লেভেল ২৮) বা তার উচ্চতর সংস্করণকে টার্গেট করে, তবে ফোরগ্রাউন্ড সার্ভিস চালু করার জন্য সেটির অবশ্যই
FOREGROUND_SERVICEপারমিশন থাকতে হবে। - যদি কোনো অ্যাপ অ্যান্ড্রয়েড ১৪ (এপিআই লেভেল ৩৪) বা তার উচ্চতর সংস্করণকে টার্গেট করে, তবে এটিকে অবশ্যই এর ফোরগ্রাউন্ড সার্ভিস টাইপের জন্য সমস্ত পূর্বশর্ত পূরণ করতে হবে। এই পূর্বশর্তগুলো ফোরগ্রাউন্ড সার্ভিস টাইপস ডকুমেন্টেশনে বিস্তারিতভাবে বর্ণনা করা আছে। বিশেষ করে, নিম্নলিখিত প্রয়োজনীয়তাগুলো সম্পর্কে সচেতন থাকুন:
- বেশ কিছু ফোরগ্রাউন্ড সার্ভিস টাইপের জন্য নির্দিষ্ট রানটাইম পারমিশনের প্রয়োজন হয়। উদাহরণস্বরূপ, একটি রিমোট মেসেজিং ফোরগ্রাউন্ড সার্ভিসের অবশ্যই
FOREGROUND_SERVICE_REMOTE_MESSAGINGপারমিশনটি থাকতে হবে।
- বেশ কিছু ফোরগ্রাউন্ড সার্ভিস টাইপের জন্য নির্দিষ্ট রানটাইম পারমিশনের প্রয়োজন হয়। উদাহরণস্বরূপ, একটি রিমোট মেসেজিং ফোরগ্রাউন্ড সার্ভিসের অবশ্যই
- বেশ কিছু ক্ষেত্রে, কিছু ফোরগ্রাউন্ড সার্ভিস টাইপের জন্য প্রয়োজনীয় পারমিশনের উপর ব্যবহারের সময়কার অতিরিক্ত বিধিনিষেধ থাকে। এই পারমিশনগুলো শুধুমাত্র অ্যাপটি ফোরগ্রাউন্ডে থাকাকালীনই দেওয়া হয় ( কিছু নির্দিষ্ট ব্যতিক্রম ছাড়া )। এর মানে হলো, আপনার অ্যাপ এই পারমিশনগুলোর কোনো একটির জন্য অনুরোধ করে তা পেয়ে গেলেও, যদি অ্যাপটি ব্যাকগ্রাউন্ডে থাকা অবস্থায় ফোরগ্রাউন্ড সার্ভিসটি চালু করার চেষ্টা করে, তাহলে সিস্টেম একটি
SecurityExceptionথ্রো করবে, এমনকি যদি ব্যাকগ্রাউন্ড থেকে ফোরগ্রাউন্ড সার্ভিস শুরু করার জন্য অ্যাপটির ছাড়পত্রও থাকে। আরও তথ্যের জন্য, ব্যবহারের সময়কার পারমিশন প্রয়োজন এমন ফোরগ্রাউন্ড সার্ভিস শুরু করার উপর বিধিনিষেধ দেখুন।- আপনি যদি প্রয়োজনীয় অনুমতির জন্য অনুরোধ করার পরেও, সেই অনুমতিগুলো দেওয়া হয়েছে কিনা তা নিশ্চিত না করেই ফোরগ্রাউন্ড সার্ভিসটি চালু করেন, তাহলে আপনি একটি
SecurityExceptionপেতে পারেন।
- আপনি যদি প্রয়োজনীয় অনুমতির জন্য অনুরোধ করার পরেও, সেই অনুমতিগুলো দেওয়া হয়েছে কিনা তা নিশ্চিত না করেই ফোরগ্রাউন্ড সার্ভিসটি চালু করেন, তাহলে আপনি একটি
সমাধান :
ফোরগ্রাউন্ড সার্ভিসটি চালু করার আগে, এর জন্য প্রয়োজনীয় সকল অনুমতি চেয়ে নিন এবং নিশ্চিত করুন যে আপনি রানটাইমের অন্যান্য সকল পূর্বশর্ত পূরণ করেছেন।