ব্যাকগ্রাউন্ড থেকে ফোরগ্রাউন্ড পরিষেবা চালু করার উপর বিধিনিষেধ

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

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

ব্যাকগ্রাউন্ডে চালু করার বিধিনিষেধ থেকে ছাড়

নিম্নলিখিত পরিস্থিতিতে, আপনার অ্যাপ ব্যাকগ্রাউন্ডে চলাকালীনও ফোরগ্রাউন্ড পরিষেবা শুরু করতে পারে:

  • আপনার অ্যাপ ব্যবহারকারীর কাছে দৃশ্যমান অবস্থা থেকে ট্রানজিশন করে, যেমন একটি অ্যাক্টিভিটি।
  • আপনার অ্যাপ ব্যাকগ্রাউন্ড থেকে কোনও অ্যাক্টিভিটি শুরু করতে পারে, তবে অ্যাপের কোনও অ্যাক্টিভিটি আগে থেকে থাকা টাস্কের ব্যাক স্ট্যাকে থাকলে তা করা যাবে না।
  • Firebase Cloud Messaging ব্যবহার করে আপনার অ্যাপ অত্যন্ত গুরুত্বপূর্ণ মেসেজ পায়।

  • ব্যবহারকারী আপনার অ্যাপের সাথে সম্পর্কিত কোনও UI এলিমেন্টে অ্যাকশন পারফর্ম করেন। যেমন, তিনি কোনও বাবল, বিজ্ঞপ্তি, উইজেট বা অ্যাক্টিভিটির সাথে ইন্টার‍্যাক্ট করতে পারেন।

  • ব্যবহারকারীর অনুরোধ করা কোনও অ্যাকশন সম্পূর্ণ করতে আপনার অ্যাপ এক্স্যাক্ট অ্যালার্ম ইনভোক করে।

  • আপনার অ্যাপ হল ডিভাইসের বর্তমান ইনপুট পদ্ধতি।

  • আপনার অ্যাপ এমন একটি ইভেন্ট পায় যা জিওফেন্সিং বা অ্যাক্টিভিটি শনাক্তকরণ ট্রানজিশন-এর সাথে সম্পর্কিত।

  • ডিভাইস রিবুট হওয়ার পরে এবং ACTION_BOOT_COMPLETED, ACTION_LOCKED_BOOT_COMPLETED, অথবা ACTION_MY_PACKAGE_REPLACED ইনটেন্ট অ্যাকশন সম্প্রচার রিসিভারে রিসিভ করার পরে।

  • আপনার অ্যাপ ব্রডকাস্ট রিসিভারে ACTION_TIMEZONE_CHANGED, ACTION_TIME_CHANGED অথবা ACTION_LOCALE_CHANGED ইনটেন্ট অ্যাকশন পায়।

  • আপনার অ্যাপ NfcService থেকে ACTION_TRANSACTION_DETECTED ইভেন্ট পায়।

  • নির্দিষ্ট সিস্টেম রোল বা অনুমতি সহ অ্যাপ, যেমন ডিভাইসের মালিক এবং প্রোফাইলের মালিক।

  • আপনার অ্যাপ কম্প্যানিয়ন ডিভাইস ম্যানেজার ব্যবহার করে এবং REQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND অনুমতি বা REQUEST_COMPANION_RUN_IN_BACKGROUND অনুমতি ঘোষণা করে। যতদূর সম্ভব, REQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND ব্যবহার করুন।

  • ব্যবহারকারী আপনার অ্যাপের জন্য ব্যাটারি অপ্টিমাইজেশন বন্ধ করে দেন।

  • আপনার অ্যাপের কাছে SYSTEM_ALERT_WINDOW অনুমতি আছে। মনে রাখবেন: আপনার অ্যাপ Android 15 বা তার পরবর্তী যেকোনও ভার্সনকে টার্গেট করলে, এতে অবশ্যই SYSTEM_ALERT_WINDOW অনুমতি থাকতে হবে এবং অ্যাপে বর্তমানে একটি দৃশ্যমান ওভারলে উইন্ডো থাকতে হবে।

ব্যবহার করার সময় অনুমতি প্রয়োজন এমন ফোরগ্রাউন্ড পরিষেবা শুরু করার ক্ষেত্রে বিধিনিষেধ

Android 14 (API লেভেল 34) বা তার পরবর্তী ভার্সনে, আপনি যদি এমন কোনও ফোরগ্রাউন্ড সার্ভিস শুরু করেন যার জন্য 'ব্যবহার করার সময়' অনুমতি প্রয়োজন, তাহলে আপনাকে বিশেষ কিছু পরিস্থিতি সম্পর্কে সচেতন থাকতে হবে।

আপনার অ্যাপ Android 14 বা তার পরবর্তী ভার্সনকে টার্গেট করলে, আপনি ফোরগ্রাউন্ড সার্ভিস তৈরি করার সময় অপারেটিং সিস্টেম চেক করে দেখে যে সেই ধরনের সার্ভিসের জন্য আপনার অ্যাপের কাছে সব প্রয়োজনীয় অনুমতি আছে কিনা। যেমন, আপনি যখন মাইক্রোফোন ধরনের ফোরগ্রাউন্ড পরিষেবা তৈরি করেন, তখন অপারেটিং সিস্টেম যাচাই করে যে আপনার অ্যাপের বর্তমানে RECORD_AUDIO অনুমতি আছে কিনা। আপনার কাছে সেই অনুমতি না থাকলে, সিস্টেম একটি SecurityException দেখায়।

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

একইভাবে, আপনার অ্যাপ ব্যাকগ্রাউন্ডে থাকলে এবং এটি এমন একটি স্বাস্থ্য পরিষেবা তৈরি করলে যার জন্য BODY_SENSORS অনুমতি প্রয়োজন, অ্যাপটির বর্তমানে সেই অনুমতি নেই এবং সিস্টেম একটি ব্যতিক্রম দেখায়। (এটি স্বাস্থ্য পরিষেবার ক্ষেত্রে প্রযোজ্য নয়, কারণ সেটির জন্য আলাদা অনুমতির প্রয়োজন হয়, যেমন ACTIVITY_RECOGNITION।) PermissionChecker.checkSelfPermission() কল করলে এই সমস্যার সমাধান হয় না। আপনার অ্যাপের কাছে 'ব্যবহার করার সময়' সংক্রান্ত অনুমতি থাকলে এবং সেই অনুমতি আছে কিনা তা চেক করার জন্য checkSelfPermission() কল করলে, অ্যাপটি ব্যাকগ্রাউন্ডে থাকলেও মেথডটি PERMISSION_GRANTED রিটার্ন করে। যখন মেথড PERMISSION_GRANTED রিটার্ন করে, তখন এটি বলে যে "আপনার অ্যাপের কাছে এই অনুমতি আছে যখন অ্যাপটি ব্যবহার করা হচ্ছে।"

এই কারণে, আপনার ফোরগ্রাউন্ড পরিষেবার জন্য 'ব্যবহার করার সময়' সংক্রান্ত অনুমতির প্রয়োজন হলে, আপনার অ্যাপে কোনও অ্যাক্টিভিটি দেখা গেলে আপনাকে অবশ্যই Context.startForegroundService() বা Context.bindService() কল করতে হবে, যদি না পরিষেবাটি নির্দিষ্ট ছাড়-এর মধ্যে পড়ে।

ব্যবহার করার সময় অনুমতি সংক্রান্ত বিধিনিষেধ থেকে অব্যাহতি

কিছু পরিস্থিতিতে, অ্যাপ ব্যাকগ্রাউন্ডে রান করার সময় ফোরগ্রাউন্ড পরিষেবা শুরু হলেও, অ্যাপ ফোরগ্রাউন্ডে রান করার সময় ("ব্যবহার করার সময়") এটি লোকেশন, ক্যামেরা ও মাইক্রোফোন সংক্রান্ত তথ্য অ্যাক্সেস করতে পারে।

একই পরিস্থিতিতে, পরিষেবাটি যদি location-এর ফোরগ্রাউন্ড পরিষেবার ধরন ঘোষণা করে এবং ACCESS_BACKGROUND_LOCATION অনুমতি আছে এমন কোনও অ্যাপের মাধ্যমে শুরু হয়, তাহলে এই পরিষেবা সব সময় লোকেশন তথ্য অ্যাক্সেস করতে পারে, এমনকি অ্যাপটি ব্যাকগ্রাউন্ডে চললেও।

নিচের তালিকায় এই পরিস্থিতিগুলি রয়েছে:

  • সিস্টেম কম্পোনেন্ট পরিষেবা শুরু করে।
  • অ্যাপ উইজেট-এর সাথে ইন্টার‍্যাক্ট করার মাধ্যমে পরিষেবা শুরু হয়।
  • কোনও বিজ্ঞপ্তির সাথে ইন্টার‍্যাক্ট করার মাধ্যমে পরিষেবা শুরু হয়।
  • পরিষেবাটি একটি PendingIntent হিসেবে শুরু হয় যা একটি অন্য, দৃশ্যমান অ্যাপ থেকে পাঠানো হয়।
  • পরিষেবাটি এমন একটি অ্যাপের মাধ্যমে শুরু হয় যা একটি ডিভাইস নীতি কন্ট্রোলার যা ডিভাইস মালিক মোডে চলে।
  • VoiceInteractionService প্রদান করে এমন একটি অ্যাপের মাধ্যমে পরিষেবাটি শুরু হয়।
  • START_ACTIVITIES_FROM_BACKGROUND বিশেষ অনুমতি আছে এমন অ্যাপের মাধ্যমে পরিষেবাটি শুরু হয়।

আপনার অ্যাপে কোন কোন পরিষেবা প্রভাবিত হয়েছে তা নির্ধারণ করুন

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

Foreground service started from background can not have \
location/camera/microphone access: service SERVICE_NAME