ফোরগ্রাউন্ড পরিষেবার সমস্যা সমাধান করুন

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

এই নথিতে নিম্নলিখিত বিষয়গুলি আলোচনা করা হয়েছে:

আপনি সমস্যা সমাধানের আগে

ফোরগ্রাউন্ড পরিষেবাগুলিতে সাম্প্রতিক পরিবর্তনগুলি পরীক্ষা করুন৷

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

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

  • ফোরগ্রাউন্ড পরিষেবা কোড যা আগে কাজ করেছিল এখন ব্যর্থ হচ্ছে৷
  • আপনি সবেমাত্র একটি নতুন প্ল্যাটফর্ম রিলিজে পরীক্ষা শুরু করেছেন, অথবা আপনি আপনার অ্যাপ দ্বারা লক্ষ্য করা API স্তর পরিবর্তন করেছেন৷

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

অ্যাপ্লিকেশন নট রেসপন্ডিং (ANR) ত্রুটি৷

নির্দিষ্ট পরিস্থিতিতে, একটি অ্যাপ তার ফোরগ্রাউন্ড পরিষেবা বন্ধ করে দেবে বলে আশা করা হচ্ছে। যদি অ্যাপটি পরিষেবাটি বন্ধ না করে, তবে সিস্টেমটি পরিষেবাটি বন্ধ করে দেয় এবং একটি অ্যাপ্লিকেশন নট রেসপন্ডিং (ANR) ত্রুটি ট্রিগার করে৷

শর্ট সার্ভিস খুব বেশি সময় ধরে চলে যার ফলে ANR হয়

ফোরগ্রাউন্ড পরিষেবাগুলি যেগুলি সংক্ষিপ্ত পরিষেবার ধরণ ব্যবহার করে সেগুলিকে প্রায় তিন মিনিটের মধ্যে দ্রুত সম্পূর্ণ করতে হবে৷ সময় ফুরিয়ে গেলে, সিস্টেম পরিষেবাটির Service.onTimeout(int,int) পদ্ধতিতে কল করে। stopSelf() কল করার জন্য পরিষেবাটিতে কয়েক সেকেন্ড সময় রয়েছে। যদি পরিষেবাটি নিজেই বন্ধ না হয়, সিস্টেমটি একটি অ্যাপ্লিকেশন নট রেসপন্সিং ত্রুটি ট্রিগার করে।

রোগ নির্ণয় :

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

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() কল করে।

ফোরগ্রাউন্ড পরিষেবা ব্যতিক্রম

এই বিভাগটি বেশ কয়েকটি ফোরগ্রাউন্ড পরিষেবা সংক্রান্ত সমস্যা বর্ণনা করে যা সিস্টেমটিকে একটি ব্যতিক্রম ঘটাতে পারে। যদি অ্যাপটি ব্যতিক্রমটি ধরতে না পারে, ব্যবহারকারী একটি ডায়ালগ দেখেন যে অ্যাপটি বন্ধ হয়ে গেছে।

কিছু ক্ষেত্রে, সিস্টেম একটি অভ্যন্তরীণ ব্যতিক্রম নিক্ষেপ করে। আপনি সেই ব্যতিক্রমগুলি ধরতে পারবেন না, তবে কোন ব্যতিক্রমটি নিক্ষেপ করা হয়েছিল তা দেখতে আপনি লগক্যাটে দেখতে পারেন৷

অভ্যন্তরীণ ব্যতিক্রম: সময়সীমা অতিক্রম করেছে৷

অ্যাপটি ব্যাকগ্রাউন্ডে থাকাকালীন কতক্ষণ ডেটা সিঙ্ক এবং মিডিয়া প্রসেসিং ফোরগ্রাউন্ড পরিষেবাগুলি চলতে পারে তার উপর সিস্টেমটি একটি সীমা আরোপ করে ৷ পরিষেবাটি সেই সীমা অতিক্রম করলে, সিস্টেম পরিষেবাটির Service.onTimeout(int,int) পদ্ধতিতে কল করে৷ stopSelf() কল করার জন্য পরিষেবাটিতে কয়েক সেকেন্ড সময় রয়েছে। পরিষেবাটি নিজে থেকে বন্ধ না হলে, সিস্টেমটি একটি অভ্যন্তরীণ ব্যতিক্রম তৈরি করে যার ফলে অ্যাপটি ক্র্যাশ হয়ে যায়।

রোগ নির্ণয় :

যদি সময়সীমা অতিক্রম করা হয় তাহলে, 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() কল করে একটি অগ্রভাগের পরিষেবাতে নিজেকে প্রচার করতে কয়েক সেকেন্ড সময় থাকে৷ যদি পরিষেবাটি তা না করে, সিস্টেমটি একটি ANR ত্রুটি ট্রিগার করে৷

রোগ নির্ণয় :

যদি একটি ফোরগ্রাউন্ড পরিষেবা সময়মতো শুরু না হয়, তাহলে অ্যাপটি ক্র্যাশ হয়ে যাবে, যার ফলে ব্যবহারকারী দেখতে পাবে একটি অ্যাপ ডায়ালগ বন্ধ করে দিয়েছে । এই ক্ষেত্রে, আপনি Logcat এ নিম্নলিখিত বার্তাটি পেতে পারেন:

android.app.RemoteServiceException$ForegroundServiceDidNotStartInTimeException:
Context.startForegroundService() did not then call Service.startForeground()

ঠিক করুন :

নিশ্চিত করুন যে সমস্ত নতুন-তৈরি ফোরগ্রাউন্ড পরিষেবা কয়েক সেকেন্ডের মধ্যে ServiceCompat.startForeground() কল করে৷

ForegroundServiceStartNotAllowedException

ত্রুটি :

সিস্টেম ForegroundServiceStartNotAllowedException নিক্ষেপ করে।

কারণ :

এটি সাধারণত অ্যাপটি ব্যাকগ্রাউন্ড থেকে একটি ফোরগ্রাউন্ড পরিষেবা চালু করার কারণে ঘটে যখন বৈধ ছাড় না থাকে।

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

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

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

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

ঠিক করুন :

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

আপনি আপনার অ্যাপের লাইফসাইকেল পরিচালনা করতে LiveData মতো লাইফসাইকেল উপাদানগুলি ব্যবহার করতে পারেন যাতে আপনি অসাবধানতাবশত ব্যাকগ্রাউন্ড থেকে একটি ফোরগ্রাউন্ড পরিষেবা চালু করার চেষ্টা না করেন।

নিরাপত্তা ব্যতিক্রম

ত্রুটি :

সিস্টেম SecurityException নিক্ষেপ করে।

কারণ :

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

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

ঠিক করুন :

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