অ্যান্ড্রয়েড ১২ (এপিআই লেভেল ৩১) বা তার উচ্চতর সংস্করণকে লক্ষ্য করে তৈরি অ্যাপগুলো, কয়েকটি বিশেষ ক্ষেত্র ছাড়া, ব্যাকগ্রাউন্ডে চলার সময় ফোরগ্রাউন্ড সার্ভিস চালু করতে পারে না। যদি কোনো অ্যাপ ব্যাকগ্রাউন্ডে চলার সময় একটি ফোরগ্রাউন্ড সার্ভিস চালু করার চেষ্টা করে এবং সেই সার্ভিসটি উল্লিখিত ব্যতিক্রমী ক্ষেত্রগুলোর কোনো একটির আওতায় না পড়ে, তবে সিস্টেম একটি ForegroundServiceStartNotAllowedException থ্রো করে।
এছাড়াও, যদি কোনো অ্যাপ এমন কোনো ফোরগ্রাউন্ড সার্ভিস চালু করতে চায় যার জন্য ব্যবহারের সময়কার অনুমতির প্রয়োজন হয় (উদাহরণস্বরূপ, বডি সেন্সর, ক্যামেরা, মাইক্রোফোন বা লোকেশনের অনুমতি), তবে অ্যাপটি ব্যাকগ্রাউন্ডে থাকা অবস্থায় সেই সার্ভিসটি তৈরি করতে পারবে না, এমনকি যদি অ্যাপটি ব্যাকগ্রাউন্ডে চালু হওয়ার সীমাবদ্ধতা থেকে অব্যাহতিপ্রাপ্তদের মধ্যে পড়েও। এর কারণটি "ব্যবহারের সময়কার অনুমতির প্রয়োজন এমন ফোরগ্রাউন্ড সার্ভিস চালু করার উপর সীমাবদ্ধতা" শীর্ষক অংশে ব্যাখ্যা করা হয়েছে।
ব্যাকগ্রাউন্ড স্টার্টের সীমাবদ্ধতা থেকে অব্যাহতি
নিম্নলিখিত পরিস্থিতিগুলিতে, আপনার অ্যাপ ব্যাকগ্রাউন্ডে চলার সময়েও ফোরগ্রাউন্ড সার্ভিস চালু করতে পারে:
- আপনার অ্যাপ একটি ব্যবহারকারী-দৃশ্যমান অবস্থা, যেমন একটি অ্যাক্টিভিটি , থেকে পরিবর্তিত হয়।
- আপনার অ্যাপ ব্যাকগ্রাউন্ড থেকে একটি অ্যাক্টিভিটি শুরু করতে পারে, তবে সেই ক্ষেত্রটি বাদে যেখানে অ্যাপটির কোনো চলমান টাস্কের ব্যাক স্ট্যাকে একটি অ্যাক্টিভিটি থাকে।
আপনার অ্যাপ ফায়ারবেস ক্লাউড মেসেজিং ব্যবহার করে একটি উচ্চ অগ্রাধিকারের বার্তা পেয়েছে।
ব্যবহারকারী আপনার অ্যাপ-সম্পর্কিত কোনো 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পারমিশনটি আছে। দ্রষ্টব্য: যদি আপনার অ্যাপটি অ্যান্ড্রয়েড ১৫ বা তার উচ্চতর সংস্করণকে টার্গেট করে, তবে এটির অবশ্যইSYSTEM_ALERT_WINDOWপারমিশন থাকতে হবে এবং অ্যাপটির বর্তমানে একটি দৃশ্যমান ওভারলে উইন্ডো থাকতে হবে।
ফোরগ্রাউন্ড সার্ভিস চালু করার উপর বিধিনিষেধ, যেগুলোর ব্যবহারের সময়কার অনুমতির প্রয়োজন হয়
অ্যান্ড্রয়েড ১৪ (এপিআই লেভেল ৩৪) বা তার উচ্চতর সংস্করণে, যদি আপনি এমন কোনো ফোরগ্রাউন্ড সার্ভিস চালু করেন যার ব্যবহারের সময়কার অনুমতির প্রয়োজন হয়, তবে কিছু বিশেষ পরিস্থিতি সম্পর্কে সচেতন থাকতে হবে।
আপনার অ্যাপটি যদি অ্যান্ড্রয়েড ১৪ বা তার উচ্চতর সংস্করণকে টার্গেট করে, তাহলে আপনি যখন কোনো ফোরগ্রাউন্ড সার্ভিস তৈরি করেন, তখন অপারেটিং সিস্টেম যাচাই করে দেখে যে সেই নির্দিষ্ট সার্ভিস টাইপের জন্য আপনার অ্যাপের সমস্ত উপযুক্ত পারমিশন আছে কি না। উদাহরণস্বরূপ, আপনি যখন মাইক্রোফোন টাইপের একটি ফোরগ্রাউন্ড সার্ভিস তৈরি করেন, তখন অপারেটিং সিস্টেম যাচাই করে দেখে যে আপনার অ্যাপের বর্তমানে RECORD_AUDIO পারমিশনটি আছে কি না। যদি আপনার সেই পারমিশনটি না থাকে, তাহলে সিস্টেম একটি SecurityException থ্রো করে।
ব্যবহারের সময়কার পারমিশনের ক্ষেত্রে, এটি একটি সম্ভাব্য সমস্যা তৈরি করে। যদি আপনার অ্যাপে ব্যবহারের সময়কার পারমিশন থাকে, তবে অ্যাপটি শুধুমাত্র ফোরগ্রাউন্ডে থাকাকালীনই সেই পারমিশনটি পায়। এর মানে হলো, যদি আপনার অ্যাপ ব্যাকগ্রাউন্ডে থাকে এবং এটি ক্যামেরা, লোকেশন বা মাইক্রোফোন ধরনের কোনো ফোরগ্রাউন্ড সার্ভিস তৈরি করার চেষ্টা করে, তাহলে সিস্টেম দেখতে পায় যে আপনার অ্যাপের কাছে বর্তমানে প্রয়োজনীয় পারমিশন নেই এবং এটি একটি SecurityException থ্রো করে।
একইভাবে, যদি আপনার অ্যাপটি ব্যাকগ্রাউন্ডে থাকে এবং এটি এমন একটি হেলথ সার্ভিস তৈরি করে যার জন্য BODY_SENSORS পারমিশন প্রয়োজন, তাহলে অ্যাপটির কাছে সেই মুহূর্তে সেই পারমিশনটি থাকে না এবং সিস্টেম একটি এক্সেপশন থ্রো করে। (এটি এমন হেলথ সার্ভিসের ক্ষেত্রে প্রযোজ্য নয় যার জন্য ACTIVITY_RECOGNITION মতো ভিন্ন পারমিশন প্রয়োজন।) PermissionChecker.checkSelfPermission() কল করলেও এই সমস্যাটি প্রতিরোধ করা যায় না । যদি আপনার অ্যাপের কোনো while-in-use পারমিশন থাকে এবং সেই পারমিশনটি আছে কিনা তা পরীক্ষা করার জন্য এটি 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