এই পৃষ্ঠাটি ফোরগ্রাউন্ড পরিষেবাগুলি ব্যর্থ হওয়ার কিছু সাধারণ কারণ নিয়ে আলোচনা করে এবং সমস্যার কারণ কী তা সনাক্ত করতে আপনাকে সহায়তা করে।
এই নথিতে নিম্নলিখিত বিষয়গুলি নিয়ে আলোচনা করা হয়েছে:
সমস্যা সমাধানের আগে
ফোরগ্রাউন্ড পরিষেবাগুলিতে সাম্প্রতিক পরিবর্তনগুলি পরীক্ষা করুন
যদি ফোরগ্রাউন্ড পরিষেবাগুলি ভুলভাবে ব্যবহার করা হয়, তাহলে ডিভাইসের কর্মক্ষমতা এবং ব্যাটারি লাইফের উপর নেতিবাচক প্রভাব ফেলতে পারে। এই কারণে, অ্যান্ড্রয়েড প্ল্যাটফর্ম রিলিজগুলি প্রায়শই এই খারাপ প্রভাবগুলি সীমিত করার জন্য ফোরগ্রাউন্ড পরিষেবা আচরণে পরিবর্তন আনে।
যদি আপনার ফোরগ্রাউন্ড পরিষেবা নিয়ে সমস্যা হয়, তাহলে আপনার ফোরগ্রাউন্ড পরিষেবার ডকুমেন্টেশনের পরিবর্তনগুলি পরীক্ষা করা উচিত এবং দেখা উচিত যে সাম্প্রতিক কোনও পরিবর্তন আছে কিনা যা আপনার সমস্যার ব্যাখ্যা দিতে পারে। এই পরিস্থিতিতে পরিবর্তনগুলি পরীক্ষা করা বিশেষভাবে গুরুত্বপূর্ণ:
- পূর্বে কাজ করা ফোরগ্রাউন্ড পরিষেবা কোড এখন ব্যর্থ হচ্ছে
- আপনি সবেমাত্র একটি নতুন প্ল্যাটফর্ম রিলিজের পরীক্ষা শুরু করেছেন, অথবা আপনার অ্যাপ দ্বারা লক্ষ্য করা API স্তর পরিবর্তন করেছেন।
এছাড়াও, যদি আপনি প্ল্যাটফর্মের ডেভেলপার প্রিভিউতে আপনার ডিভাইসটি পরীক্ষা করে থাকেন, তাহলে ডেভেলপার প্রিভিউ ডকুমেন্টেশনের সাম্প্রতিকতম সংস্করণটি পরীক্ষা করে দেখুন।
অ্যাপ্লিকেশন সাড়া দিচ্ছে না (ANR) ত্রুটি
নির্দিষ্ট পরিস্থিতিতে, একটি অ্যাপ তার ফোরগ্রাউন্ড পরিষেবা বন্ধ করে দেবে বলে আশা করা হচ্ছে। যদি অ্যাপটি পরিষেবাটি বন্ধ না করে, তাহলে সিস্টেমটি পরিষেবাটি বন্ধ করে দেয় এবং একটি অ্যাপ্লিকেশন নট রেসপন্ডিং (ANR) ত্রুটি ট্রিগার করে।
স্বল্প পরিষেবার কারণে ANR দীর্ঘ হচ্ছে, যার ফলে
সংক্ষিপ্ত পরিষেবা টাইপ ব্যবহারকারী ফোরগ্রাউন্ড পরিষেবাগুলিকে দ্রুত, প্রায় তিন মিনিটের মধ্যে সম্পন্ন করতে হবে। সময় শেষ হয়ে গেলে, সিস্টেমটি পরিষেবার Service.onTimeout(int,int) পদ্ধতিতে কল করে। পরিষেবাটির stopSelf() কল করার জন্য কয়েক সেকেন্ড সময় আছে। যদি পরিষেবাটি নিজে থেকে বন্ধ না হয়, তাহলে সিস্টেমটি একটি অ্যাপ্লিকেশন নট রেসপন্ডিং ত্রুটি ট্রিগার করে।
রোগ নির্ণয় :
যদি কোনও ফোরগ্রাউন্ড পরিষেবা বন্ধ করতে ব্যর্থ হওয়ার কারণে 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() কল করেছেন।
ফোরগ্রাউন্ড পরিষেবা ব্যতিক্রম
এই বিভাগে বেশ কিছু ফোরগ্রাউন্ড সার্ভিস সমস্যা বর্ণনা করা হয়েছে যার কারণে সিস্টেমটি একটি ব্যতিক্রম দেখাতে পারে। যদি অ্যাপটি ব্যতিক্রমটি ধরতে না পারে, তাহলে ব্যবহারকারী একটি ডায়ালগ দেখতে পাবেন যা তাদের জানাবে যে অ্যাপটি বন্ধ হয়ে গেছে।
কিছু ক্ষেত্রে, সিস্টেম একটি অভ্যন্তরীণ ব্যতিক্রম ব্যবহার করে। এই ক্ষেত্রে আপনি স্ট্যাক ট্রেস দেখে ব্যতিক্রমটি কী ছিল তা জানতে পারবেন এবং আরও বিস্তারিত ত্রুটি তথ্যের জন্য Logcat পরীক্ষা করতে পারেন।
অভ্যন্তরীণ ব্যতিক্রম: সময়সীমা অতিক্রম করেছে
অ্যাপটি ব্যাকগ্রাউন্ডে থাকাকালীন ডেটা সিঙ্ক এবং মিডিয়া প্রসেসিং ফোরগ্রাউন্ড পরিষেবাগুলি কতক্ষণ চলতে পারে তার উপর সিস্টেমটি একটি সীমা আরোপ করে । যদি পরিষেবাটি সেই সীমা অতিক্রম করে, তাহলে সিস্টেমটি পরিষেবার Service.onTimeout(int,int) পদ্ধতিটি কল করে। পরিষেবাটির stopSelf() কল করার জন্য কয়েক সেকেন্ড সময় আছে। যদি পরিষেবাটি নিজে থেকে বন্ধ না হয়, তাহলে সিস্টেম একটি অভ্যন্তরীণ RemoteServiceException তৈরি করে যার ফলে অ্যাপটি ক্র্যাশ হয়ে যায়।
রোগ নির্ণয় :
স্ট্যাক ট্রেস দেখে আপনি ব্যতিক্রমটি কী ছিল তা জানতে পারবেন, এবং আরও বিস্তারিত ত্রুটির তথ্যের জন্য আপনি Logcat পরীক্ষা করতে পারেন। এই ক্ষেত্রে, 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 পরীক্ষা করতে পারেন। এই ক্ষেত্রে, Logcat-এ নিম্নলিখিত ত্রুটি বার্তা রয়েছে:
android.app.RemoteServiceException$ForegroundServiceDidNotStartInTimeException:
Context.startForegroundService() did not then call Service.startForeground()
ঠিক করুন :
নিশ্চিত করুন যে সমস্ত নতুন তৈরি ফোরগ্রাউন্ড পরিষেবা কয়েক সেকেন্ডের মধ্যে ServiceCompat.startForeground() কল করে।
ForegroundServiceStartNotAllowedException
ত্রুটি :
সিস্টেমটি ForegroundServiceStartNotAllowedException থ্রো করে।
কারণ :
এটি সাধারণত কোনও বৈধ ছাড় না থাকাকালীন অ্যাপটি ব্যাকগ্রাউন্ড থেকে একটি ফোরগ্রাউন্ড পরিষেবা চালু করার কারণে ঘটে।
অ্যান্ড্রয়েড ১২ (এপিআই লেভেল ৩১) থেকে শুরু করে, অ্যাপটি ব্যাকগ্রাউন্ডে চলাকালীন ফোরগ্রাউন্ড পরিষেবা শুরু করার অনুমতি নেই , কিছু নির্দিষ্ট ছাড় সহ। যদি আপনি ব্যাকগ্রাউন্ড থেকে ফোরগ্রাউন্ড পরিষেবা শুরু করার চেষ্টা করেন এবং আপনি কোনও একটি ছাড়ের প্রয়োজনীয়তা পূরণ না করেন, তাহলে সিস্টেমটি ForegroundServiceStartNotAllowedException ব্যবহার করে। আপনি যদি ছাড়ের প্রয়োজনীয়তা পূরণ না করেন তবে সিস্টেমটিও এটি করে।
উদাহরণস্বরূপ, একটি অ্যাপে একটি বোতাম থাকতে পারে যা ব্যবহারকারী ক্লিক করতে পারেন, যার ফলে অ্যাপটি কিছু প্রক্রিয়াকরণ করে এবং তারপর একটি ফোরগ্রাউন্ড পরিষেবা চালু করে। এই ক্ষেত্রে, ব্যবহারকারী বোতামটি ক্লিক করে তাৎক্ষণিকভাবে অ্যাপটিকে ব্যাকগ্রাউন্ডে রাখার ঝুঁকি থাকে। অ্যাপটি তখন ব্যাকগ্রাউন্ড থেকে পরিষেবাটি চালু করার চেষ্টা করবে। যদি অ্যাপটি নির্দিষ্ট ছাড়গুলির একটি পূরণ না করে, তাহলে সিস্টেমটি একটি ForegroundServiceStartNotAllowedException নিক্ষেপ করে।
এছাড়াও, কিছু ছাড়ের সময়সীমা কম থাকে। উদাহরণস্বরূপ, যদি আপনার অ্যাপটি উচ্চ-অগ্রাধিকার FCM বার্তার প্রতিক্রিয়ায় একটি ফোরগ্রাউন্ড পরিষেবা চালু করে তবে একটি সংক্ষিপ্ত ছাড় রয়েছে। যদি আপনি পরিষেবাটি যথেষ্ট দ্রুত চালু না করেন, তাহলে আপনি একটি ForegroundServiceStartNotAllowedException পাবেন।
নতুন অ্যান্ড্রয়েড রিলিজের সাথে সাথে নির্দিষ্ট ছাড়গুলি কখনও কখনও আরও সীমাবদ্ধ হয়ে পড়ে। যদি আপনি আপনার অ্যাপের টার্গেট করা অ্যান্ড্রয়েডের কোন সংস্করণটি পরিবর্তন করে থাকেন, তাহলে ফোরগ্রাউন্ড পরিষেবা ডকুমেন্টেশনে পরিবর্তনগুলি পরীক্ষা করুন এবং নিশ্চিত করুন যে আপনার অ্যাপটি এখনও অনুমোদিত ছাড়গুলির একটি পূরণ করে।
ঠিক করুন :
আপনার অ্যাপের ওয়ার্কফ্লো পরিবর্তন করুন যাতে অ্যাপটি ব্যাকগ্রাউন্ডে থাকাকালীন ফোরগ্রাউন্ড পরিষেবা চালু করার প্রয়োজন না হয়, অথবা নিশ্চিত করুন যে আপনার অ্যাপটি কোনও একটি ছাড় পূরণ করে।
আপনার অ্যাপের জীবনচক্র পরিচালনা করার জন্য আপনি জীবনচক্র-সচেতন উপাদান ব্যবহার করতে পারেন যাতে আপনি অসাবধানতাবশত ব্যাকগ্রাউন্ড থেকে কোনও ফোরগ্রাউন্ড পরিষেবা চালু করার চেষ্টা না করেন।
নিরাপত্তা ব্যতিক্রম
ত্রুটি :
সিস্টেম SecurityException থ্রো করে।
কারণ :
আপনার অ্যাপটি প্রয়োজনীয় অনুমতি ছাড়াই একটি ফোরগ্রাউন্ড পরিষেবা চালু করার চেষ্টা করেছে।
- যদি কোনও অ্যাপ অ্যান্ড্রয়েড ৯ (এপিআই লেভেল ২৮) বা তার উচ্চতর ভার্সনের জন্য তৈরি হয়, তাহলে ফোরগ্রাউন্ড পরিষেবা চালু করার জন্য অবশ্যই
FOREGROUND_SERVICEঅনুমতি থাকতে হবে। - যদি কোনও অ্যাপ অ্যান্ড্রয়েড ১৪ (এপিআই লেভেল ৩৪) বা তার উচ্চতর ভার্সনের জন্য তৈরি হয়, তাহলে এটিকে অবশ্যই তার ফোরগ্রাউন্ড পরিষেবার ধরণের জন্য সমস্ত পূর্বশর্ত পূরণ করতে হবে। এই পূর্বশর্তগুলি ফোরগ্রাউন্ড পরিষেবার ধরণের ডকুমেন্টেশনে বিস্তারিতভাবে বর্ণনা করা হয়েছে। বিশেষ করে, নিম্নলিখিত প্রয়োজনীয়তাগুলি সম্পর্কে সচেতন থাকুন:
- বেশ কিছু ফোরগ্রাউন্ড পরিষেবার জন্য নির্দিষ্ট রানটাইম অনুমতি প্রয়োজন। উদাহরণস্বরূপ, একটি রিমোট মেসেজিং ফোরগ্রাউন্ড পরিষেবার
FOREGROUND_SERVICE_REMOTE_MESSAGINGঅনুমতি থাকতে হবে।
- বেশ কিছু ফোরগ্রাউন্ড পরিষেবার জন্য নির্দিষ্ট রানটাইম অনুমতি প্রয়োজন। উদাহরণস্বরূপ, একটি রিমোট মেসেজিং ফোরগ্রাউন্ড পরিষেবার
- বেশ কিছু ক্ষেত্রে, কিছু ফোরগ্রাউন্ড পরিষেবার ধরণের জন্য প্রয়োজনীয় অনুমতিগুলির উপর অতিরিক্ত while-in-use বিধিনিষেধ রয়েছে। এই অনুমতিগুলি শুধুমাত্র অ্যাপটি ফোরগ্রাউন্ডে থাকাকালীন অ্যাপটিকে দেওয়া হয় ( কয়েকটি নির্দিষ্ট ব্যতিক্রম ছাড়া )। এর অর্থ হল, এমনকি যদি আপনার অ্যাপটি এই অনুমতিগুলির মধ্যে একটির জন্য অনুরোধ করে এবং মঞ্জুর করা হয়, তবে যদি অ্যাপটি ব্যাকগ্রাউন্ডে থাকাকালীন ফোরগ্রাউন্ড পরিষেবা চালু করার চেষ্টা করে, তবে সিস্টেমটি একটি
SecurityExceptionনিক্ষেপ করবে, এমনকি যদি অ্যাপটির ব্যাকগ্রাউন্ড থেকে একটি ফোরগ্রাউন্ড পরিষেবা শুরু করার ছাড় থাকে। আরও তথ্যের জন্য, while-in-use অনুমতিগুলির প্রয়োজন এমন ফোরগ্রাউন্ড পরিষেবাগুলি শুরু করার উপর বিধিনিষেধ দেখুন।- আপনি যদি প্রয়োজনীয় অনুমতির অনুরোধ করেন তবে আপনি একটি
SecurityExceptionপেতে পারেন কিন্তু প্রয়োজনীয় অনুমতিগুলি মঞ্জুর করা হয়েছে কিনা তা নিশ্চিত করার আগে আপনি ফোরগ্রাউন্ড পরিষেবা শুরু করেন।
- আপনি যদি প্রয়োজনীয় অনুমতির অনুরোধ করেন তবে আপনি একটি
ঠিক করুন :
ফোরগ্রাউন্ড পরিষেবা চালু করার আগে, সমস্ত উপযুক্ত ফোরগ্রাউন্ড পরিষেবার অনুমতির জন্য অনুরোধ করুন এবং নিশ্চিত করুন যে আপনি অন্যান্য সমস্ত রানটাইম পূর্বশর্ত পূরণ করেছেন।