যখনই একটি অ্যাপ ব্যাকগ্রাউন্ডে চলে, তখন এটি ডিভাইসের কিছু সীমিত সম্পদ যেমন RAM ব্যবহার করে। এর ফলে ব্যবহারকারীর অভিজ্ঞতা খারাপ হতে পারে, বিশেষ করে যদি ব্যবহারকারী একটি রিসোর্স-ইনটেনসিভ অ্যাপ ব্যবহার করেন, যেমন একটি গেম খেলা বা ভিডিও দেখা। ব্যবহারকারীর অভিজ্ঞতা উন্নত করতে, Android 8.0 (API স্তর 26) ব্যাকগ্রাউন্ডে চলাকালীন অ্যাপগুলি কী করতে পারে তার উপর সীমাবদ্ধতা আরোপ করে। এই দস্তাবেজটি অপারেটিং সিস্টেমের পরিবর্তনগুলি বর্ণনা করে এবং কীভাবে আপনি নতুন সীমাবদ্ধতার অধীনে ভালভাবে কাজ করার জন্য আপনার অ্যাপ আপডেট করতে পারেন৷
ওভারভিউ
অনেক অ্যান্ড্রয়েড অ্যাপ এবং পরিষেবা একই সাথে চলতে পারে। উদাহরণস্বরূপ, একজন ব্যবহারকারী অন্য উইন্ডোতে ওয়েব ব্রাউজ করার সময় একটি উইন্ডোতে একটি গেম খেলতে পারে এবং সঙ্গীত চালানোর জন্য একটি তৃতীয় অ্যাপ ব্যবহার করতে পারে। একবারে যত বেশি অ্যাপ চলছে, সিস্টেমে তত বেশি লোড হবে। ব্যাকগ্রাউন্ডে অতিরিক্ত অ্যাপ বা পরিষেবা চলমান থাকলে, এটি সিস্টেমে অতিরিক্ত লোড রাখে, যার ফলে ব্যবহারকারীর অভিজ্ঞতা খারাপ হতে পারে; উদাহরণস্বরূপ, সঙ্গীত অ্যাপটি হঠাৎ বন্ধ হয়ে যেতে পারে।
এই সমস্যাগুলির সম্ভাবনা কমাতে, Android 8.0 ব্যবহারকারীরা সরাসরি তাদের সাথে ইন্টারঅ্যাক্ট না করার সময় অ্যাপগুলি কী করতে পারে তার উপর সীমাবদ্ধতা রাখে। অ্যাপ দুটি উপায়ে সীমাবদ্ধ:
ব্যাকগ্রাউন্ড পরিষেবার সীমাবদ্ধতা : একটি অ্যাপ নিষ্ক্রিয় থাকাকালীন, ব্যাকগ্রাউন্ড পরিষেবাগুলির ব্যবহারের সীমাবদ্ধতা রয়েছে৷ এটি ফোরগ্রাউন্ড পরিষেবাগুলিতে প্রযোজ্য নয়, যা ব্যবহারকারীর কাছে আরও লক্ষণীয়৷
সম্প্রচারের সীমাবদ্ধতা : সীমিত ব্যতিক্রমগুলির সাথে, অ্যাপগুলি অন্তর্নিহিত সম্প্রচারের জন্য নিবন্ধন করতে তাদের ম্যানিফেস্ট ব্যবহার করতে পারে না। তারা এখনও রানটাইমে এই সম্প্রচারের জন্য নিবন্ধন করতে পারে, এবং তারা স্পষ্ট সম্প্রচার এবং তাদের অ্যাপে বিশেষভাবে লক্ষ্য করা সম্প্রচারের জন্য নিবন্ধন করতে ম্যানিফেস্ট ব্যবহার করতে পারে।
বেশিরভাগ ক্ষেত্রে, অ্যাপ্লিকেশনগুলি JobScheduler
কাজগুলি ব্যবহার করে এই সীমাবদ্ধতাগুলিকে ঘিরে কাজ করতে পারে৷ এই পদ্ধতিটি একটি অ্যাপকে কাজ সম্পাদনের ব্যবস্থা করতে দেয় যখন অ্যাপটি সক্রিয়ভাবে চলছে না, কিন্তু তবুও সিস্টেমটিকে এই কাজগুলিকে এমনভাবে শিডিউল করার সুযোগ দেয় যা ব্যবহারকারীর অভিজ্ঞতাকে প্রভাবিত করে না। Android 8.0 JobScheduler
এ বেশ কিছু উন্নতির প্রস্তাব দেয় যা পরিষেবাগুলিকে প্রতিস্থাপন করা এবং রিসিভারগুলিকে নির্ধারিত কাজের সাথে সম্প্রচার করা সহজ করে তোলে; আরও তথ্যের জন্য, JobScheduler উন্নতি দেখুন।
পটভূমি পরিষেবা সীমাবদ্ধতা
ব্যাকগ্রাউন্ডে চলমান পরিষেবাগুলি ডিভাইস সংস্থানগুলিকে গ্রাস করতে পারে, যার ফলে ব্যবহারকারীর অভিজ্ঞতা আরও খারাপ হতে পারে৷ এই সমস্যাটি প্রশমিত করার জন্য, সিস্টেমটি পরিষেবাগুলিতে বেশ কয়েকটি সীমাবদ্ধতা প্রয়োগ করে৷
সিস্টেমটি ফোরগ্রাউন্ড এবং ব্যাকগ্রাউন্ড অ্যাপের মধ্যে পার্থক্য করে। (পরিষেবার সীমাবদ্ধতার উদ্দেশ্যে ব্যাকগ্রাউন্ডের সংজ্ঞা মেমরি ম্যানেজমেন্টের দ্বারা ব্যবহৃত সংজ্ঞা থেকে আলাদা; একটি অ্যাপ মেমরি ম্যানেজমেন্টের সাথে সম্পর্কিত ব্যাকগ্রাউন্ডে থাকতে পারে, তবে অগ্রভাগে পরিষেবা চালু করার ক্ষমতার সাথে সম্পর্কিত।) একটি অ্যাপ হল নিচের কোনটি সত্য হলে অগ্রভাগে বিবেচিত হবে:
- এটি একটি দৃশ্যমান কার্যকলাপ আছে, কার্যকলাপ শুরু বা বিরতি কিনা.
- এটি একটি অগ্রভাগ সেবা আছে.
- অন্য একটি ফোরগ্রাউন্ড অ্যাপ অ্যাপটির সাথে সংযুক্ত থাকে, হয় এর একটি পরিষেবার সাথে আবদ্ধ হয়ে বা এর সামগ্রী প্রদানকারীর একটি ব্যবহার করে৷ উদাহরণস্বরূপ, অ্যাপটি অগ্রভাগে থাকে যদি অন্য একটি অ্যাপ এর সাথে আবদ্ধ হয়:
- আইএমই
- ওয়ালপেপার পরিষেবা
- বিজ্ঞপ্তি শ্রোতা
- ভয়েস বা টেক্সট পরিষেবা
যদি এই শর্তগুলির কোনওটিই সত্য না হয় তবে অ্যাপটিকে পটভূমিতে বলে মনে করা হয়৷
একটি অ্যাপ ফোরগ্রাউন্ডে থাকাকালীন, এটি ফোরগ্রাউন্ড এবং ব্যাকগ্রাউন্ড উভয় পরিষেবাই অবাধে তৈরি এবং চালাতে পারে। যখন একটি অ্যাপ ব্যাকগ্রাউন্ডে যায়, তখন এটির কয়েক মিনিটের একটি উইন্ডো থাকে যেখানে এটি এখনও পরিষেবাগুলি তৈরি এবং ব্যবহার করার অনুমতি দেয়৷ সেই উইন্ডোর শেষে, অ্যাপটিকে নিষ্ক্রিয় বলে মনে করা হয়। এই সময়ে, সিস্টেমটি অ্যাপের ব্যাকগ্রাউন্ড পরিষেবাগুলি বন্ধ করে দেয়, ঠিক যেমন অ্যাপটি পরিষেবাগুলিকে ' Service.stopSelf()
পদ্ধতি বলেছিল৷
নির্দিষ্ট পরিস্থিতিতে, একটি ব্যাকগ্রাউন্ড অ্যাপকে কয়েক মিনিটের জন্য একটি অস্থায়ী অনুমতি তালিকায় রাখা হয়। একটি অ্যাপ অনুমোদিত তালিকায় থাকাকালীন, এটি সীমাবদ্ধতা ছাড়াই পরিষেবাগুলি চালু করতে পারে এবং এর ব্যাকগ্রাউন্ড পরিষেবাগুলি চালানোর অনুমতি দেওয়া হয়। কোনও অ্যাপ ব্যবহারকারীর কাছে দৃশ্যমান এমন কোনও কাজ পরিচালনা করলে অনুমোদনের তালিকায় রাখা হয়, যেমন:
- একটি উচ্চ-প্রধান ফায়ারবেস ক্লাউড মেসেজিং (FCM) বার্তা পরিচালনা করা।
- একটি সম্প্রচার গ্রহণ করা, যেমন একটি SMS/MMS বার্তা৷
- একটি বিজ্ঞপ্তি থেকে একটি
PendingIntent
কার্যকর করা। - VPN অ্যাপ নিজেকে অগ্রভাগে প্রচার করার আগে একটি
VpnService
শুরু করা।
অনেক ক্ষেত্রে, আপনার অ্যাপ পটভূমি পরিষেবাগুলিকে JobScheduler
চাকরির সাথে প্রতিস্থাপন করতে পারে। উদাহরণস্বরূপ, CoolPhotoApp কে ব্যবহারকারী বন্ধুদের কাছ থেকে শেয়ার করা ছবি পেয়েছেন কিনা তা পরীক্ষা করতে হবে, এমনকি অ্যাপটি অগ্রভাগে না চললেও। পূর্বে, অ্যাপটি একটি ব্যাকগ্রাউন্ড পরিষেবা ব্যবহার করত যা অ্যাপের ক্লাউড স্টোরেজ দিয়ে চেক করত। অ্যান্ড্রয়েড 8.0 (এপিআই লেভেল 26) এ স্থানান্তর করতে, বিকাশকারী একটি নির্ধারিত কাজের সাথে ব্যাকগ্রাউন্ড পরিষেবা প্রতিস্থাপন করে, যা পর্যায়ক্রমে চালু হয়, সার্ভারকে জিজ্ঞাসা করে, তারপর ছেড়ে দেয়।
Android 8.0-এর আগে, একটি ফোরগ্রাউন্ড পরিষেবা তৈরি করার স্বাভাবিক উপায় ছিল একটি ব্যাকগ্রাউন্ড পরিষেবা তৈরি করা, তারপর সেই পরিষেবাটিকে অগ্রভাগে প্রচার করা। অ্যান্ড্রয়েড 8.0 এর সাথে একটি জটিলতা রয়েছে; সিস্টেমটি একটি ব্যাকগ্রাউন্ড অ্যাপকে একটি ব্যাকগ্রাউন্ড পরিষেবা তৈরি করার অনুমতি দেয় না। এই কারণে, Android 8.0 অগ্রভাগে একটি নতুন পরিষেবা শুরু করার জন্য নতুন পদ্ধতি startForegroundService()
চালু করেছে। সিস্টেমটি পরিষেবাটি তৈরি করার পরে, অ্যাপটির কাছে পরিষেবাটির [ startForeground()
](/reference/android/app/Service#startForeground(int, android.app.Notification) পদ্ধতিতে কল করার জন্য পাঁচ সেকেন্ড সময় আছে নতুন পরিষেবার ব্যবহারকারীকে দেখানোর জন্য- দৃশ্যমান বিজ্ঞপ্তি যদি সময়সীমার মধ্যে startForeground()
কল না করে, তাহলে সিস্টেম পরিষেবাটি বন্ধ করে দেয় এবং অ্যাপটিকে ANR বলে ঘোষণা করে।
সম্প্রচারের সীমাবদ্ধতা
যদি কোনো অ্যাপ সম্প্রচার গ্রহণের জন্য নিবন্ধন করে, তাহলে প্রতিবার সম্প্রচার পাঠানোর সময় অ্যাপের রিসিভার সম্পদ গ্রহণ করে। সিস্টেম ইভেন্টের উপর ভিত্তি করে সম্প্রচার গ্রহণের জন্য অনেক অ্যাপ নিবন্ধন করলে এটি সমস্যা সৃষ্টি করতে পারে; একটি সিস্টেম ইভেন্ট যা একটি সম্প্রচারকে ট্রিগার করে সেই সমস্ত অ্যাপগুলিকে দ্রুত উত্তরাধিকার সূত্রে ব্যবহার করতে পারে, ব্যবহারকারীর অভিজ্ঞতা নষ্ট করে। এই সমস্যাটি প্রশমিত করার জন্য, Android 7.0 (API স্তর 24) সম্প্রচারের উপর সীমাবদ্ধতা রেখেছে, যেমন ব্যাকগ্রাউন্ড অপ্টিমাইজেশানে বর্ণিত হয়েছে। Android 8.0 (API স্তর 26) এই সীমাবদ্ধতাগুলিকে আরও কঠোর করে তোলে।
- অ্যাপ্লিকেশানগুলি যেগুলি Android 8.0 বা উচ্চতরকে লক্ষ্য করে তারা আর তাদের ম্যানিফেস্টে অন্তর্নিহিত সম্প্রচারের জন্য সম্প্রচার রিসিভারগুলিকে নিবন্ধন করতে পারে না যদি না সম্প্রচারটি বিশেষভাবে সেই অ্যাপে সীমাবদ্ধ থাকে৷ একটি অন্তর্নিহিত সম্প্রচার হল একটি সম্প্রচার যা একটি অ্যাপের মধ্যে একটি নির্দিষ্ট উপাদানকে লক্ষ্য করে না। উদাহরণস্বরূপ,
ACTION_PACKAGE_REPLACED
সমস্ত অ্যাপ জুড়ে সমস্ত নিবন্ধিত শ্রোতাদের কাছে পাঠানো হয়, তাদের জানাতে যে ডিভাইসে কিছু প্যাকেজ প্রতিস্থাপিত হয়েছে৷ যেহেতু সম্প্রচারটি অন্তর্নিহিত, তাই এটিকে Android 8.0 বা উচ্চতরকে লক্ষ্য করে এমন অ্যাপগুলিতে ম্যানিফেস্ট-নিবন্ধিত রিসিভারগুলিতে বিতরণ করা হবে না৷ACTION_MY_PACKAGE_REPLACED
ও একটি অন্তর্নিহিত সম্প্রচার, কিন্তু যেহেতু এটি শুধুমাত্র সেই অ্যাপে পাঠানো হয় যার প্যাকেজ প্রতিস্থাপিত হয়েছে এটি ম্যানিফেস্ট-নিবন্ধিত রিসিভারদের কাছে বিতরণ করা হবে। - অ্যাপগুলি তাদের ম্যানিফেস্টে স্পষ্ট সম্প্রচারের জন্য নিবন্ধন করা চালিয়ে যেতে পারে৷
- অ্যাপ্লিকেশানগুলি রানটাইমে
Context.registerReceiver()
ব্যবহার করতে পারে যে কোনও সম্প্রচারের জন্য একটি রিসিভার নিবন্ধন করতে, তা অন্তর্নিহিত বা স্পষ্ট হোক। - যে সম্প্রচারগুলির জন্য একটি স্বাক্ষর অনুমতির প্রয়োজন হয় সেগুলিকে এই বিধিনিষেধ থেকে অব্যাহতি দেওয়া হয়েছে, যেহেতু এই সম্প্রচারগুলি শুধুমাত্র একই শংসাপত্রে স্বাক্ষর করা অ্যাপগুলিতে পাঠানো হয়, ডিভাইসের সমস্ত অ্যাপগুলিতে নয়৷
অনেক ক্ষেত্রে, যে অ্যাপগুলি পূর্বে একটি অন্তর্নিহিত সম্প্রচারের জন্য নিবন্ধিত ছিল সেগুলি একটি JobScheduler
কাজ ব্যবহার করে অনুরূপ কার্যকারিতা পেতে পারে। উদাহরণস্বরূপ, একটি সামাজিক ফটো অ্যাপকে সময়ে সময়ে তার ডেটা পরিষ্কার করার প্রয়োজন হতে পারে এবং ডিভাইসটি যখন চার্জারের সাথে সংযুক্ত থাকে তখন এটি করতে পছন্দ করে। পূর্বে, অ্যাপটি তার ম্যানিফেস্টে ACTION_POWER_CONNECTED
এর জন্য একটি রিসিভার নিবন্ধিত করেছিল; যখন অ্যাপটি সেই সম্প্রচারটি পেয়েছে, তখন এটি পরিস্কার করা প্রয়োজন কিনা তা পরীক্ষা করবে। Android 8.0 বা উচ্চতর সংস্করণে স্থানান্তর করতে, অ্যাপটি সেই রিসিভারটিকে তার ম্যানিফেস্ট থেকে সরিয়ে দেয়। পরিবর্তে, অ্যাপটি একটি ক্লিনআপ কাজের সময়সূচী নির্ধারণ করে যা ডিভাইসটি নিষ্ক্রিয় এবং চার্জ হওয়ার সময় চলে।
মাইগ্রেশন গাইড
ডিফল্টরূপে, এই পরিবর্তনগুলি শুধুমাত্র Android 8.0 (API স্তর 26) বা উচ্চতরকে লক্ষ্য করে এমন অ্যাপগুলিকে প্রভাবিত করে৷ যাইহোক, ব্যবহারকারীরা সেটিংস স্ক্রীন থেকে যেকোন অ্যাপের জন্য এই বিধিনিষেধগুলি সক্ষম করতে পারেন, এমনকি যদি অ্যাপটি 26-এর চেয়ে কম API স্তরকে লক্ষ্য করে। নতুন সীমাবদ্ধতাগুলি মেনে চলার জন্য আপনাকে আপনার অ্যাপ আপডেট করতে হতে পারে।
আপনার অ্যাপ কীভাবে পরিষেবাগুলি ব্যবহার করে তা দেখতে পরীক্ষা করুন। যদি আপনার অ্যাপটি আপনার অ্যাপ নিষ্ক্রিয় থাকাকালীন ব্যাকগ্রাউন্ডে চলা পরিষেবাগুলির উপর নির্ভর করে, তাহলে আপনাকে সেগুলি প্রতিস্থাপন করতে হবে। সম্ভাব্য সমাধান অন্তর্ভুক্ত:
- অ্যাপটি ব্যাকগ্রাউন্ডে থাকাকালীন আপনার অ্যাপটিকে একটি ফোরগ্রাউন্ড পরিষেবা তৈরি করতে হলে,
startService()
এর পরিবর্তেstartForegroundService()
পদ্ধতি ব্যবহার করুন। - পরিষেবাটি ব্যবহারকারীর দ্বারা লক্ষণীয় হলে, এটি একটি অগ্রভাগের পরিষেবা তৈরি করুন৷ উদাহরণস্বরূপ, একটি পরিষেবা যা অডিও চালায় সর্বদা একটি অগ্রভাগের পরিষেবা হওয়া উচিত৷
startService()
এর পরিবর্তেstartForegroundService()
পদ্ধতি ব্যবহার করে পরিষেবাটি তৈরি করুন। - একটি নির্ধারিত কাজের সাথে পরিষেবার কার্যকারিতা নকল করার একটি উপায় খুঁজুন। যদি পরিষেবাটি ব্যবহারকারীর কাছে অবিলম্বে লক্ষণীয় কিছু না করে, তবে আপনি সাধারণত এর পরিবর্তে একটি নির্ধারিত কাজ ব্যবহার করতে সক্ষম হবেন।
- পটভূমিতে ভোট দেওয়ার পরিবর্তে নেটওয়ার্ক ইভেন্টগুলি ঘটলে আপনার অ্যাপ্লিকেশনটিকে বেছে নেওয়ার জন্য FCM ব্যবহার করুন৷
- পটভূমির কাজ স্থগিত করুন যতক্ষণ না অ্যাপ্লিকেশনটি স্বাভাবিকভাবে অগ্রভাগে থাকে।
আপনার অ্যাপের ম্যানিফেস্টে সংজ্ঞায়িত ব্রডকাস্ট রিসিভারগুলি পর্যালোচনা করুন। যদি আপনার ম্যানিফেস্ট একটি প্রভাবিত অন্তর্নিহিত সম্প্রচারের জন্য একটি রিসিভার ঘোষণা করে, তাহলে আপনাকে অবশ্যই এটি প্রতিস্থাপন করতে হবে। সম্ভাব্য সমাধান অন্তর্ভুক্ত:
- ম্যানিফেস্টে রিসিভার ঘোষণা করার পরিবর্তে,
Context.registerReceiver()
কল করে রানটাইমে রিসিভার তৈরি করুন। - যে শর্তটি অন্তর্নিহিত সম্প্রচারকে ট্রিগার করেছে তা পরীক্ষা করতে একটি নির্ধারিত কাজ ব্যবহার করুন৷