ফোরগ্রাউন্ড সার্ভিস সংক্রান্ত সমস্যার সমাধান করা

এই পৃষ্ঠায় ফোরগ্রাউন্ড সার্ভিস কাজ না করার কিছু সাধারণ কারণ নিয়ে আলোচনা করা হয়েছে এবং সমস্যার কারণ শনাক্ত করতে আপনাকে সাহায্য করে।

এই ডকুমেন্টে নিম্নলিখিত সমস্যাগুলি নিয়ে আলোচনা করা হয়েছে:

সমস্যার সমাধান করার আগে

ফোরগ্রাউন্ড সার্ভিসে সাম্প্রতিক পরিবর্তন চেক করুন

ফোরগ্রাউন্ড সার্ভিস সঠিকভাবে ব্যবহার না করা হলে, ডিভাইসের পারফর্ম্যান্স ও ব্যাটারির আয়ুর উপর নেতিবাচক প্রভাব পড়তে পারে। এই কারণে, Android প্ল্যাটফর্ম রিলিজ প্রায়ই ফোরগ্রাউন্ড সার্ভিসের আচরণে পরিবর্তন করে যাতে এই খারাপ প্রভাবগুলি সীমিত করা যায়।

ফোরগ্রাউন্ড সার্ভিস নিয়ে আপনার সমস্যা হলে, ফোরগ্রাউন্ড সার্ভিসে পরিবর্তন ডকুমেন্টেশন চেক করে দেখুন এবং সম্প্রতি কোনও পরিবর্তন করা হয়েছে কিনা তা দেখুন যা আপনার সমস্যার কারণ হতে পারে। এইসব পরিস্থিতিতে পরিবর্তন হয়েছে কিনা তা চেক করা বিশেষভাবে গুরুত্বপূর্ণ:

  • ফোরগ্রাউন্ড সার্ভিস কোড যা আগে কাজ করত তা এখন কাজ করছে না
  • আপনি নতুন প্ল্যাটফর্ম রিলিজে টেস্টিং শুরু করেছেন অথবা আপনার অ্যাপের টার্গেট করা 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() কল করে তা নিশ্চিত করুন।

WorkManager:

এছাড়াও, আপনি WorkManager ওয়ার্কারের সাথে এই ব্যতিক্রম দেখতে পেতে পারেন যা ফোরগ্রাউন্ড সার্ভিস এক্সিকিউট করে (setForegound বা setForegroundAsync কল করুন)। যখন দুটি ফোরগ্রাউন্ড ওয়ার্কারের লাইফসাইকেল ওভারল্যাপ করে, কারণ একটি ওয়ার্কার ফোরগ্রাউন্ড সার্ভিস শুরু করার চেষ্টা করে, যখন আগে থেকে চলা ফোরগ্রাউন্ড সার্ভিস বন্ধ করার চেষ্টা করে, তখন এই ক্র্যাশের সাথে নিম্নলিখিত লগ থাকবে:

Re-initializing SystemForegroundService after a request to shut-down

এই ক্র্যাশ সংক্রান্ত সমস্যার সমাধান WorkManager ভার্সন 2.10.5-এ করা হয়েছে।

আপনার অ্যাপে এই ব্যতিক্রম দেখা দিলে, WorkManager-এর সবচেয়ে সাম্প্রতিক ভার্সনে আপডেট করুন এবং কোনও সমস্যা থেকে গেলে WorkManager ইস্যু ট্র্যাকারে জানান।

ForegroundServiceStartNotAllowedException

সমস্যা:

সিস্টেম ForegroundServiceStartNotAllowedException থ্রো করে।

কারণ:

সাধারণত, কোনও বৈধ ছাড় না থাকলে, ব্যাকগ্রাউন্ড থেকে ফোরগ্রাউন্ড পরিষেবা চালু করার কারণে এই সমস্যা হয়।

Android 12 (API লেভেল ৩১) থেকে শুরু করে, অ্যাপ ব্যাকগ্রাউন্ডে চলাকালীন ফোরগ্রাউন্ড সার্ভিস শুরু করার অনুমতি দেওয়া হয় না, তবে কিছু নির্দিষ্ট ছাড় আছে। আপনি ব্যাকগ্রাউন্ড থেকে ফোরগ্রাউন্ড পরিষেবা চালু করার চেষ্টা করলে এবং আপনি ছাড়ের প্রয়োজনীয়তা পূরণ না করলে, সিস্টেম ForegroundServiceStartNotAllowedException দেখায়। এছাড়াও, আপনি ছাড়ের প্রয়োজনীয়তা পূরণ না করলে সিস্টেম এটি করে।

যেমন, কোনও অ্যাপে এমন একটি বোতাম থাকতে পারে যাতে ব্যবহারকারী ক্লিক করলে অ্যাপটি কিছু প্রসেসিং করে এবং তারপরে একটি ফোরগ্রাউন্ড সার্ভিস চালু করে। এই ক্ষেত্রে, ব্যবহারকারী বোতামে ক্লিক করে সাথে সাথে অ্যাপটি ব্যাকগ্রাউন্ডে পাঠিয়ে দিতে পারেন। অ্যাপটি তখন ব্যাকগ্রাউন্ড থেকে পরিষেবা চালু করার চেষ্টা করবে। অ্যাপটি যদি নির্দিষ্ট করা ছাড়ের কোনও একটি পূরণ না করে, তাহলে সিস্টেম ForegroundServiceStartNotAllowedException দেখায়।

এছাড়াও, কিছু ছাড়ের ক্ষেত্রে অল্প সময়সীমা থাকে। যেমন, আপনার অ্যাপ যদি উচ্চ-অগ্রাধিকার FCM মেসেজের উত্তরে ফোরগ্রাউন্ড সার্ভিস চালু করে, তাহলে সংক্ষিপ্ত ছাড় দেওয়া হয়। আপনি যথেষ্ট দ্রুত পরিষেবা চালু না করলে, আপনাকে ForegroundServiceStartNotAllowedException দেওয়া হবে।

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

সমাধান:

আপনার অ্যাপের ওয়ার্কফ্লো পরিবর্তন করুন যাতে অ্যাপ ব্যাকগ্রাউন্ডে থাকাকালীন ফোরগ্রাউন্ড সার্ভিস চালু করার প্রয়োজন না হয় অথবা আপনার অ্যাপ ছাড়ের শর্ত পূরণ করছে কিনা তা কনফার্ম করুন।

আপনার অ্যাপের লাইফসাইকেল ম্যানেজ করতে আপনি লাইফসাইকেল-অ্যাওয়ার কম্পোনেন্ট ব্যবহার করতে পারেন, যাতে আপনি ব্যাকগ্রাউন্ড থেকে ফোরগ্রাউন্ড পরিষেবা চালু করার চেষ্টা না করেন।

SecurityException

সমস্যা:

সিস্টেম থ্রোSecurityException।

কারণ:

প্রয়োজনীয় অনুমতি ছাড়াই আপনার অ্যাপ ফোরগ্রাউন্ড পরিষেবা চালু করার চেষ্টা করেছে।

  • কোনও অ্যাপ Android 9 (API লেভেল ২৮) বা তার পরবর্তী ভার্সনকে টার্গেট করলে, ফোরগ্রাউন্ড সার্ভিস চালু করার জন্য সেটির কাছে অবশ্যই FOREGROUND_SERVICE অনুমতি থাকতে হবে।
  • কোনও অ্যাপ Android 14 (API লেভেল 34) বা তার পরবর্তী যেকোনও ভার্সনকে টার্গেট করলে, সেটিকে ফোরগ্রাউন্ড সার্ভিস টাইপের জন্য প্রয়োজনীয় সব শর্ত পূরণ করতে হবে। এইসব পূর্বশর্ত ফোরগ্রাউন্ড সার্ভিস প্রকার ডকুমেন্টেশনে বিস্তারিতভাবে উল্লেখ করা আছে। বিশেষ করে, নিম্নলিখিত প্রয়োজনীয়তাগুলি সম্পর্কে সচেতন থাকুন:
    • বিভিন্ন ফোরগ্রাউন্ড পরিষেবার ধরনের জন্য নির্দিষ্ট রানটাইম অনুমতি প্রয়োজন। যেমন, রিমোট মেসেজিং ফোরগ্রাউন্ড পরিষেবার ক্ষেত্রে FOREGROUND_SERVICE_REMOTE_MESSAGING অনুমতি থাকতেই হবে।
  • বেশ কিছু ক্ষেত্রে, কিছু ফোরগ্রাউন্ড সার্ভিসের ধরনের জন্য প্রয়োজনীয় অনুমতির উপর অতিরিক্ত 'ব্যবহার করার সময়' সংক্রান্ত বিধিনিষেধ থাকে। অ্যাপটি ফোরগ্রাউন্ডে থাকাকালীনই শুধুমাত্র এই অনুমতিগুলি অ্যাপটিকে দেওয়া হয় (কিছু নির্দিষ্ট ব্যতিক্রম সহ)। এর অর্থ হল, আপনার অ্যাপ এইসব অনুমতির মধ্যে কোনও একটির জন্য অনুরোধ করে থাকলে এবং সেটি মঞ্জুর করা হলেও, অ্যাপটি ব্যাকগ্রাউন্ডে থাকাকালীন ফোরগ্রাউন্ড পরিষেবা চালু করার চেষ্টা করলে, সিস্টেম SecurityException থ্রো করবে, এমনকি ব্যাকগ্রাউন্ড থেকে ফোরগ্রাউন্ড পরিষেবা চালু করার জন্য অ্যাপটির ছাড় থাকলেও। আরও তথ্যের জন্য, ব্যবহার করার সময় অনুমতি প্রয়োজন এমন ফোরগ্রাউন্ড সার্ভিস শুরু করার ক্ষেত্রে বিধিনিষেধ দেখুন।
    • আপনি প্রয়োজনীয় অনুমতির জন্য অনুরোধ করলে, SecurityException পেতে পারেন তবে প্রয়োজনীয় অনুমতি মঞ্জুর করা হয়েছে কিনা তা কনফার্ম করার আগে ফোরগ্রাউন্ড সার্ভিস শুরু করতে হবে।

সমাধান:

ফোরগ্রাউন্ড সার্ভিস চালু করার আগে, সব উপযুক্ত ফোরগ্রাউন্ড সার্ভিস সংক্রান্ত অনুমতির জন্য অনুরোধ করুন এবং কনফার্ম করুন যে আপনি অন্যান্য সব রানটাইম পূর্বশর্ত পূরণ করেছেন।