টাস্ক হল এমন অ্যাক্টিভিটির সংগ্রহ যার সাথে ব্যবহারকারী আপনার অ্যাপে কিছু করার চেষ্টা করার সময় ইন্টার্যাক্ট করেন। এই অ্যাক্টিভিটিগুলি ব্যাক স্ট্যাক নামক স্ট্যাকে প্রতিটি অ্যাক্টিভিটি খোলার ক্রম অনুযায়ী সাজানো থাকে।
যেমন, কোনও ইমেল অ্যাপে নতুন মেসেজের তালিকা দেখানোর জন্য একটি অ্যাক্টিভিটি থাকতে পারে। ব্যবহারকারী কোনও মেসেজ বেছে নিলে, সেটি দেখার জন্য নতুন অ্যাক্টিভিটি খুলে যায়। এই নতুন অ্যাক্টিভিটি ব্যাক স্ট্যাকে যোগ করা হয়েছে। তারপর, ব্যবহারকারী ট্যাপ করলে বা ফিরে যাওয়ার জেসচার করলে, সেই নতুন অ্যাক্টিভিটি শেষ হয়ে যায় এবং স্ট্যাক থেকে পপ অফ হয়ে যায়।
টাস্কের লাইফসাইকেল ও ব্যাক স্ট্যাক
ডিভাইসের হোম স্ক্রিন হল বেশিরভাগ টাস্কের শুরু করার জায়গা। ব্যবহারকারী যখন অ্যাপ লঞ্চার বা হোম স্ক্রিনে কোনও অ্যাপ বা শর্টকাটের আইকনে ট্যাপ করেন, তখন সেই অ্যাপের টাস্ক ফোরগ্রাউন্ডে চলে আসে। অ্যাপের জন্য কোনও টাস্ক না থাকলে, একটি নতুন টাস্ক তৈরি করা হয় এবং সেই অ্যাপের জন্য প্রধান অ্যাক্টিভিটি স্ট্যাকে রুট অ্যাক্টিভিটি হিসেবে খোলে।
বর্তমান অ্যাক্টিভিটি অন্য একটি অ্যাক্টিভিটি শুরু করলে, নতুন অ্যাক্টিভিটি স্ট্যাকের উপরে পুশ করা হয় এবং ফোকাস নেয়। আগের অ্যাক্টিভিটি স্ট্যাকে থেকে যায়, কিন্তু বন্ধ হয়ে যায়। কোনও অ্যাক্টিভিটি বন্ধ হয়ে গেলে, সিস্টেম তার ইউজার ইন্টারফেসের বর্তমান অবস্থা ধরে রাখে। ব্যবহারকারী ফিরে যাওয়ার অ্যাকশন পারফর্ম করলে, বর্তমান অ্যাক্টিভিটি স্ট্যাকের উপর থেকে পপ করা হয় এবং ধ্বংস করা হয়। আগের অ্যাক্টিভিটি আবার শুরু হয় এবং এর UI-এর আগের অবস্থা ফিরিয়ে আনা হয়।
স্ট্যাকে থাকা অ্যাক্টিভিটি কখনই আবার সাজানো হয় না, শুধুমাত্র শুরু করার সময় পুশ করা হয় এবং 'ফিরে যান' বোতাম বা জেসচার ব্যবহার করে বাতিল করার সময় পপ করা হয়। তাই, ব্যাক স্ট্যাক লাস্ট ইন, ফার্স্ট আউট স্ট্রাকচার হিসেবে কাজ করে, যেমনটি ১ নম্বর ছবিতে দেখানো হয়েছে।
ব্যবহারকারী 'ফিরে যান' বোতামে ট্যাপ বা জেসচার করা চালিয়ে গেলে, স্ট্যাকের প্রতিটি অ্যাক্টিভিটি পপ-অফ হয়ে আগের অ্যাক্টিভিটি দেখায়, যতক্ষণ না ব্যবহারকারী হোম স্ক্রিনে বা টাস্ক শুরু হওয়ার সময় যে অ্যাক্টিভিটি চলছিল সেখানে ফিরে যান। স্ট্যাক থেকে সব অ্যাক্টিভিটি সরিয়ে দেওয়া হলে, টাস্কটি আর থাকে না।
রুট লঞ্চার অ্যাক্টিভিটির জন্য ব্যাক ট্যাপ আচরণ
রুট লঞ্চার অ্যাক্টিভিটি হল এমন অ্যাক্টিভিটি যা ইনটেন্ট ফিল্টার
ACTION_MAIN ও CATEGORY_LAUNCHER, দুটির সাথেই ঘোষণা করে। এইসব অ্যাক্টিভিটি
অনন্য কারণ এগুলি অ্যাপ লঞ্চার থেকে আপনার অ্যাপে এন্ট্রি পয়েন্ট হিসেবে কাজ করে এবং
টাস্ক শুরু করতে ব্যবহার করা হয়।
ব্যবহারকারী রুট লঞ্চার অ্যাক্টিভিটি থেকে ফিরে যাওয়ার জন্য ট্যাপ বা জেসচার করলে, ডিভাইসে Android-এর যে ভার্সন চলছে তার উপর নির্ভর করে সিস্টেম ইভেন্টটি আলাদাভাবে ম্যানেজ করে।
- Android 11 ও তার আগের যেকোনও ভার্সনে সিস্টেমের আচরণ
- সিস্টেম অ্যাক্টিভিটি শেষ করে।
- Android 12 ও তার পরবর্তী যেকোনও ভার্সনে সিস্টেমের আচরণ
সিস্টেম অ্যাক্টিভিটি শেষ করার পরিবর্তে অ্যাক্টিভিটি এবং এর টাস্ক ব্যাকগ্রাউন্ডে সরিয়ে দেয়। হোম বোতাম বা জেসচার ব্যবহার করে কোনও অ্যাপ থেকে বেরিয়ে আসার সময় এই আচরণ ডিফল্ট সিস্টেম আচরণের সাথে মিলে যায়।
বেশিরভাগ ক্ষেত্রে, এই আচরণের অর্থ হল ব্যবহারকারীরা কোল্ড স্টেট থেকে অ্যাপটি সম্পূর্ণভাবে রিস্টার্ট করার পরিবর্তে ওয়ার্ম স্টেট থেকে আরও দ্রুত আপনার অ্যাপ আবার শুরু করতে পারবেন।
আপনাকে যদি কাস্টম ব্যাক নেভিগেশন প্রদান করতে হয়, তাহলে আমরা সাজেস্ট করি যে
onBackPressed()ওভাররাইড করার পরিবর্তে AndroidX অ্যাক্টিভিটি API ব্যবহার করুন। সিস্টেমের 'ফিরে যান' ট্যাপ ইন্টারসেপ্ট করার মতো কোনও কম্পোনেন্ট না থাকলে, AndroidX Activity API অটোমেটিক উপযুক্ত সিস্টেম আচরণে ডিফার করে।তবে, আপনার অ্যাপ যদি ব্যাক নেভিগেশন ম্যানেজ করতে এবং অ্যাক্টিভিটি শেষ করতে
onBackPressed()ওভাররাইড করে, তাহলে আপনার ইমপ্লিমেন্টেশন আপডেট করুন যাতে শেষ করার পরিবর্তেsuper.onBackPressed()-এর মাধ্যমে কল করা যায়।super.onBackPressed()কল করা হলে, প্রয়োজন অনুযায়ী অ্যাক্টিভিটি ও তার টাস্ক ব্যাকগ্রাউন্ডে সরিয়ে দেয় এবং অ্যাপ জুড়ে ব্যবহারকারীদের আরও ধারাবাহিক নেভিগেশন অভিজ্ঞতা প্রদান করে।
ব্যাকগ্রাউন্ড ও ফোরগ্রাউন্ড টাস্ক
টাস্ক হল একটি সমন্বিত ইউনিট যা ব্যবহারকারী নতুন টাস্ক শুরু করলে বা হোম স্ক্রিনে গেলে ব্যাকগ্রাউন্ডে চলে যেতে পারে। ব্যাকগ্রাউন্ডে থাকাকালীন, টাস্কের সব অ্যাক্টিভিটি বন্ধ হয়ে যায়, তবে টাস্কের ব্যাক স্ট্যাক অপরিবর্তিত থাকে—অন্য টাস্ক শুরু হলে টাস্কটি ফোকাস হারায়, যেমনটি ছবি ২-এ দেখানো হয়েছে। তারপর, কোনও টাস্ক ফোরগ্রাউন্ডে ফিরে আসতে পারে যাতে ব্যবহারকারী যেখানে ছেড়েছিলেন সেখান থেকে শুরু করতে পারেন।
বর্তমান টাস্ক A-এর জন্য নিম্নলিখিত টাস্ক ফ্লো বিবেচনা করুন, যার স্ট্যাকে তিনটি অ্যাক্টিভিটি আছে, যার মধ্যে দুটি বর্তমান অ্যাক্টিভিটির অধীনে:
ব্যবহারকারী হোম বোতাম বা জেসচার ব্যবহার করেন, তারপর অ্যাপ লঞ্চার থেকে নতুন অ্যাপ চালু করেন।
হোম স্ক্রিন দেখা গেলে, টাস্ক A ব্যাকগ্রাউন্ডে চলে যায়। নতুন অ্যাপ চালু হলে, সিস্টেম সেই অ্যাপের জন্য একটি টাস্ক (টাস্ক B) শুরু করে, যার নিজস্ব অ্যাক্টিভিটির স্ট্যাক থাকে।
সেই অ্যাপের সাথে ইন্টার্যাক্ট করার পরে, ব্যবহারকারী আবার হোম স্ক্রিনে ফিরে আসেন এবং যে অ্যাপটি মূলত টাস্ক A শুরু করেছিল সেটি বেছে নেন।
এখন, টাস্ক A ফোরগ্রাউন্ডে আসে—এর স্ট্যাকের তিনটি অ্যাক্টিভিটিই অক্ষত থাকে এবং স্ট্যাকের সবচেয়ে উপরের অ্যাক্টিভিটি আবার শুরু হয়। এই মুহূর্তে, ব্যবহারকারী হোম স্ক্রিনে গিয়ে এবং যে অ্যাপ আইকন টাস্ক শুরু করেছিল সেটি বেছে নিয়ে অথবা সাম্প্রতিক স্ক্রিন থেকে অ্যাপের টাস্ক বেছে নিয়ে টাস্ক B-তে ফিরে যেতে পারেন।
একাধিক অ্যাক্টিভিটি ইনস্ট্যান্স
ব্যাক স্ট্যাকের অ্যাক্টিভিটি কখনও নতুন করে সাজানো হয় না, তাই আপনার অ্যাপ ব্যবহারকারীকে একাধিক অ্যাক্টিভিটি থেকে কোনও নির্দিষ্ট অ্যাক্টিভিটি শুরু করার অনুমতি দিলে, সেই অ্যাক্টিভিটির কোনও পুরনো ইনস্ট্যান্সকে উপরে নিয়ে আসার পরিবর্তে, অ্যাক্টিভিটির নতুন ইনস্ট্যান্স তৈরি করে স্ট্যাকে পুশ করা হয়। যেমন, আপনার অ্যাপে একটি অ্যাক্টিভিটি একাধিকবার ইনস্ট্যান্সিয়েট করা হতে পারে, এমনকি বিভিন্ন টাস্ক থেকেও, যেমনটি চিত্র ৩-এ দেখানো হয়েছে।
ব্যবহারকারী 'ফিরে যান' বোতাম বা জেসচার ব্যবহার করে আগের পৃষ্ঠায় ফিরে গেলে, অ্যাক্টিভিটির ইনস্ট্যান্সগুলি যে ক্রমে খোলা হয়েছিল সেই ক্রমে প্রকাশ করা হয়, যার প্রত্যেকটির নিজস্ব UI স্টেট থাকে। তবে, আপনি যদি কোনও অ্যাক্টিভিটি একাধিকবার ইনস্ট্যান্সিয়েট করতে না চান, তাহলে এই আচরণ পরিবর্তন করতে পারেন। আরও তথ্যের জন্য, টাস্ক ম্যানেজ করুন দেখুন।
একাধিক উইন্ডো এনভায়রনমেন্ট
Android 7.0 (API লেভেল ২৪) এবং তার পরবর্তী যেকোনও ভার্সনে কাজ করে এমন মাল্টি-উইন্ডো এনভায়রনমেন্টে একসাথে অ্যাপ রান করলে, সিস্টেম প্রতিটি উইন্ডোর জন্য আলাদাভাবে টাস্ক ম্যানেজ করে। প্রতিটি উইন্ডোতে একাধিক টাস্ক থাকতে পারে। Chromebook-এ চলা Android অ্যাপের ক্ষেত্রেও একই কথা প্রযোজ্য: সিস্টেম প্রতিটি উইন্ডো অনুযায়ী টাস্ক বা টাস্কের গ্রুপ ম্যানেজ করে।
লাইফসাইকেল রিক্যাপ
অ্যাক্টিভিটি ও টাস্কের জন্য ডিফল্ট অ্যাকশনের সারসংক্ষেপ করতে:
অ্যাক্টিভিটি A, অ্যাক্টিভিটি B শুরু করলে, অ্যাক্টিভিটি A বন্ধ হয়ে যায় কিন্তু সিস্টেম তার অবস্থা ধরে রাখে, যেমন স্ক্রল পজিশন এবং ফর্মে লেখা যেকোনও টেক্সট। অ্যাক্টিভিটি B-তে থাকাকালীন ব্যবহারকারী ট্যাপ করলে বা 'ফিরে যান' জেসচার ব্যবহার করলে, অ্যাক্টিভিটি A আগের অবস্থায় ফিরে আসে।
ব্যবহারকারী হোম বোতাম বা জেসচার ব্যবহার করে কোনও টাস্ক থেকে বেরিয়ে গেলে, বর্তমান অ্যাক্টিভিটি বন্ধ হয়ে যায় এবং টাস্কটি ব্যাকগ্রাউন্ডে চলে যায়। সিস্টেম টাস্কের প্রতিটি অ্যাক্টিভিটির স্টেট ধরে রাখে। ব্যবহারকারী পরে যে লঞ্চার আইকন টাস্ক শুরু করেছিল সেটি বেছে নিয়ে টাস্ক আবার শুরু করলে, টাস্কটি ফোরগ্রাউন্ডে চলে আসে এবং স্ট্যাকের সবচেয়ে উপরে থাকা অ্যাক্টিভিটি আবার শুরু করে।
ব্যবহারকারী 'ফিরে যান' বিকল্পে ট্যাপ করলে বা জেসচার করলে, বর্তমান অ্যাক্টিভিটি স্ট্যাক থেকে পপ-আপ হয়ে যায় এবং নষ্ট হয়ে যায়। স্ট্যাকের আগের অ্যাক্টিভিটি আবার শুরু হয়। কোনও অ্যাক্টিভিটি নষ্ট হয়ে গেলে, সিস্টেম অ্যাক্টিভিটির অবস্থা ধরে রাখে না।
Android 12 (API লেভেল 31) এবং তার পরবর্তী ভার্সনে রুট লঞ্চার অ্যাক্টিভিটি-এর ক্ষেত্রে এই আচরণ আলাদা।
অ্যাক্টিভিটি একাধিকবার ইনস্ট্যান্সিয়েট করা যেতে পারে, এমনকি অন্যান্য টাস্ক থেকেও।
টাস্ক ম্যানেজ করুন
Android, টাস্ক ও ব্যাক স্ট্যাক ম্যানেজ করে, একই টাস্কে পরপর শুরু হওয়া সব অ্যাক্টিভিটি, লাস্ট ইন, ফার্স্ট আউট স্ট্যাকে রেখে। এটি বেশিরভাগ অ্যাপের জন্য খুব ভাল কাজ করে এবং সাধারণত আপনার অ্যাক্টিভিটি কীভাবে টাস্কের সাথে সম্পর্কিত বা ব্যাক স্ট্যাকে কীভাবে থাকে তা নিয়ে আপনাকে চিন্তা করতে হবে না।
তবে, আপনি হয়ত সিদ্ধান্ত নিতে পারেন যে আপনি স্বাভাবিক আচরণে বাধা দিতে চান। যেমন, আপনি হয়ত চান যে আপনার অ্যাপের কোনও অ্যাক্টিভিটি শুরু হলে, সেটি বর্তমান টাস্কের মধ্যে না থেকে, নতুন টাস্ক শুরু করুক। অথবা, আপনি কোনও অ্যাক্টিভিটি শুরু করার সময়, ব্যাক স্ট্যাকের উপরে নতুন ইনস্ট্যান্স তৈরি করার পরিবর্তে, সেটির আগে থেকে থাকা ইনস্ট্যান্স সামনে নিয়ে আসতে চাইতে পারেন। অথবা ব্যবহারকারী টাস্ক থেকে বেরিয়ে গেলে, আপনি হয়ত রুট অ্যাক্টিভিটি ছাড়া ব্যাক স্ট্যাকের সব অ্যাক্টিভিটি মুছে দিতে চাইবেন।
আপনি <activity> ম্যানিফেস্ট এলিমেন্টে অ্যাট্রিবিউট এবং startActivity()-এ পাস করা ইনটেন্টে ফ্ল্যাগ ব্যবহার করে এইসব কাজ এবং আরও অনেক কিছু করতে পারবেন।
এগুলি হল প্রধান <activity> অ্যাট্রিবিউট যা আপনি টাস্ক ম্যানেজ করতে ব্যবহার করতে পারেন:
taskAffinitylaunchModeallowTaskReparentingclearTaskOnLaunchalwaysRetainTaskStatefinishOnTaskLaunch
এবং এগুলি হল প্রধান ইনটেন্ট ফ্ল্যাগ যা আপনি ব্যবহার করতে পারবেন:
নিম্নলিখিত বিভাগগুলি আলোচনা করে যে কীভাবে এই ম্যানিফেস্ট অ্যাট্রিবিউটগুলি ব্যবহার করতে হয় এবং অ্যাক্টিভিটিগুলি কীভাবে টাস্কের সাথে যুক্ত হয় এবং কীভাবে তারা ব্যাক স্ট্যাকে আচরণ করে তা নির্ধারণ করার জন্য ইনটেন্ট ফ্ল্যাগ ব্যবহার করতে হয়।
এছাড়াও, নিম্নলিখিত বিভাগে আলোচনা করা হয়েছে যে কীভাবে সিস্টেম সাম্প্রতিক স্ক্রিনে টাস্ক ও অ্যাক্টিভিটি দেখায় ও ম্যানেজ করে। সাধারণত, আপনি সিস্টেমকে নির্ধারণ করতে দেন যে কীভাবে আপনার টাস্ক এবং অ্যাক্টিভিটি সাম্প্রতিক স্ক্রিনে দেখানো হবে এবং আপনাকে এই আচরণ পরিবর্তন করতে হবে না। আরও তথ্যের জন্য, সাম্প্রতিক স্ক্রিন দেখুন।
লঞ্চ মোড নির্দিষ্ট করুন
লঞ্চ মোডের মাধ্যমে আপনি নির্ধারণ করতে পারবেন যে কোনও অ্যাক্টিভিটির নতুন ইনস্ট্যান্স কীভাবে বর্তমান টাস্কের সাথে সম্পর্কিত। আপনি দুটি উপায়ে লঞ্চ মোড নির্ধারণ করতে পারেন, যা নিচের বিভাগে বর্ণনা করা হয়েছে:
-
আপনার ম্যানিফেস্ট ফাইলে কোনও অ্যাক্টিভিটি ঘোষণা করার সময়, অ্যাক্টিভিটি শুরু হলে কীভাবে তা টাস্কের সাথে সম্পর্কিত হয় তা আপনি নির্দিষ্ট করতে পারবেন।
-
আপনি
startActivity()কল করার সময়,Intent-এ একটি ফ্ল্যাগ যোগ করতে পারেন যা ঘোষণা করে যে নতুন অ্যাক্টিভিটি বর্তমান টাস্কের সাথে কীভাবে (বা আদৌ) যুক্ত।
তাই, অ্যাক্টিভিটি A যদি অ্যাক্টিভিটি B শুরু করে, তাহলে অ্যাক্টিভিটি B তার ম্যানিফেস্টে বর্তমান টাস্কের সাথে কীভাবে যুক্ত তা নির্ধারণ করতে পারে এবং অ্যাক্টিভিটি A বর্তমান টাস্কের সাথে অ্যাক্টিভিটি B কীভাবে যুক্ত হতে পারে তা অনুরোধ করার জন্য একটি ইনটেন্ট ফ্ল্যাগ ব্যবহার করতে পারে।
দুটি অ্যাক্টিভিটিই যদি নির্ধারণ করে যে অ্যাক্টিভিটি B কীভাবে কোনও টাস্কের সাথে যুক্ত হবে, তাহলে অ্যাক্টিভিটি A-এর অনুরোধ, ইনটেন্টে যেভাবে নির্ধারণ করা হয়েছে, অ্যাক্টিভিটি B-এর অনুরোধের চেয়ে বেশি গুরুত্ব পায়, যেমনটি তার ম্যানিফেস্টে নির্ধারণ করা হয়েছে।
ম্যানিফেস্ট ফাইল ব্যবহার করে লঞ্চ মোড নির্ধারণ করুন
আপনার ম্যানিফেস্ট ফাইলে কোনও অ্যাক্টিভিটি ঘোষণা করার সময়, <activity> এলিমেন্টের
launchMode অ্যাট্রিবিউট ব্যবহার করে, কোনও টাস্কের সাথে অ্যাক্টিভিটি কীভাবে সম্পর্কিত তা নির্দিষ্ট করতে পারবেন।
আপনি launchMode অ্যাট্রিবিউটে পাঁচটি লঞ্চ মোড অ্যাসাইন করতে পারবেন:
"standard"- ডিফল্ট মোড। সিস্টেমটি যে টাস্ক থেকে অ্যাক্টিভিটি শুরু করা হয়েছিল, সেখানে অ্যাক্টিভিটির একটি নতুন ইনস্ট্যান্স তৈরি করে এবং ইনটেন্টকে সেখানে রুট করে। অ্যাক্টিভিটি একাধিকবার ইনস্ট্যান্সিয়েট করা যেতে পারে, প্রতিটি ইনস্ট্যান্স আলাদা আলাদা টাস্কের অন্তর্গত হতে পারে এবং একটি টাস্কের একাধিক ইনস্ট্যান্স থাকতে পারে।
"singleTop"- বর্তমান টাস্কের উপরে অ্যাক্টিভিটির কোনও ইনস্ট্যান্স আগে থেকেই থাকলে,
সিস্টেম অ্যাক্টিভিটির নতুন ইনস্ট্যান্স তৈরি করার পরিবর্তে
onNewIntent()মেথডে কল করার মাধ্যমে ইনটেন্টকে সেই ইনস্ট্যান্সে রুট করে। অ্যাক্টিভিটি একাধিকবার ইনস্ট্যান্সিয়েট করা হয়, প্রতিটি ইনস্ট্যান্স বিভিন্ন টাস্কের সাথে সম্পর্কিত হতে পারে এবং একটি টাস্কের একাধিক ইনস্ট্যান্স থাকতে পারে (তবে শুধুমাত্র ব্যাক স্ট্যাকের সবচেয়ে উপরে থাকা অ্যাক্টিভিটি যদি অ্যাক্টিভিটির আগে থেকে থাকা ইনস্ট্যান্স না হয়)।
যেমন, ধরুন কোনও টাস্কের ব্যাক স্ট্যাকে রুট অ্যাক্টিভিটি A-এর সাথে উপরে অ্যাক্টিভিটি B, C ও D আছে (তাই স্ট্যাক হল A-B-C-D, যেখানে D উপরে আছে)। D ধরনের অ্যাক্টিভিটির জন্য একটি ইনটেন্ট আসে। D-এর ডিফল্ট
"standard"লঞ্চ মোড থাকলে, ক্লাসের একটি নতুন ইনস্ট্যান্স লঞ্চ করা হয় এবং স্ট্যাকটি A-B-C-D-D হয়ে যায়। তবে, D-এর লঞ্চ মোড"singleTop"হলে, D-এর আগে থেকে থাকা ইনস্ট্যান্সonNewIntent()-এর মাধ্যমে ইনটেন্ট পায়, কারণ এটি স্ট্যাকের সবচেয়ে উপরে থাকে এবং স্ট্যাক A-B-C-D হিসেবেই থেকে যায়। অন্যদিকে, B ধরনের অ্যাক্টিভিটির জন্য কোনও ইনটেন্ট এলে, B-এর নতুন ইনস্ট্যান্স স্ট্যাকে যোগ করা হয়, এমনকি এটির লঞ্চ মোড"singleTop"হলেও।"singleTask"- সিস্টেমটি নতুন টাস্কের রুটে অ্যাক্টিভিটি তৈরি করে বা একই অ্যাফিনিটি সহ কোনও বিদ্যমান টাস্কে অ্যাক্টিভিটি
খুঁজে বের করে। অ্যাক্টিভিটির কোনও ইনস্ট্যান্স আগে থেকেই থাকলে, সিস্টেম নতুন ইনস্ট্যান্স তৈরি করার পরিবর্তে, এর
onNewIntent()মেথডে কল করার মাধ্যমে আগে থেকে থাকা ইনস্ট্যান্সে ইনটেন্ট রুট করে। ইতিমধ্যে, এর উপরে থাকা অন্যান্য সব অ্যাক্টিভিটি নষ্ট হয়ে যায়।
"singleInstance"- আচরণটি
"singleTask"-এর মতোই, তবে সিস্টেমটি ইনস্ট্যান্স ধারণকারী টাস্কে অন্য কোনও অ্যাক্টিভিটি চালু করে না। অ্যাক্টিভিটি সবসময় তার টাস্কের একমাত্র এবং একক মেম্বার। এই অ্যাক্টিভিটি থেকে শুরু হওয়া যেকোনও অ্যাক্টিভিটি আলাদা টাস্কে খোলে।
"singleInstancePerTask"- অ্যাক্টিভিটি শুধুমাত্র টাস্কের রুট অ্যাক্টিভিটি হিসেবে চলতে পারে, প্রথম অ্যাক্টিভিটি
যা টাস্ক তৈরি করেছে এবং তাই এই টাস্কে এই অ্যাক্টিভিটির শুধুমাত্র একটি দৃষ্টান্ত থাকতে পারে।
singleTaskলঞ্চ মোডের বিপরীতে, এই অ্যাক্টিভিটিFLAG_ACTIVITY_MULTIPLE_TASKবাFLAG_ACTIVITY_NEW_DOCUMENTফ্ল্যাগ সেট করা থাকলে বিভিন্ন টাস্কে একাধিক ইনস্ট্যান্সে শুরু করা যেতে পারে।
যেমন, Android ব্রাউজার <activity>-এ singleTask নির্দিষ্ট করে, তাই এর
অ্যাক্টিভিটি আপনার অ্যাপের টাস্কে রাখা হয় না। পরিবর্তে, ব্রাউজারের জন্য নতুন টাস্ক শুরু হয়
অথবা আগে থেকে থাকা ব্রাউজারের ব্যাকগ্রাউন্ড টাস্ক সামনে আসে।
কোনও অ্যাক্টিভিটি নতুন টাস্কে শুরু হোক বা যে অ্যাক্টিভিটি এটি শুরু করেছে তার সাথে একই টাস্কে শুরু হোক,
'ফিরে যান' বোতাম এবং জেসচার ব্যবহারকারীকে সবসময়
আগের অ্যাক্টিভিটিতে নিয়ে যায়। তবে, আপনি যদি এমন কোনও অ্যাক্টিভিটি শুরু করেন যা
singleTask লঞ্চ মোড নির্দিষ্ট করে এবং সেই অ্যাক্টিভিটির কোনও ইনস্ট্যান্স ব্যাকগ্রাউন্ড টাস্কে
থাকে, তাহলে সেই পুরো টাস্কটি ফোরগ্রাউন্ডে আনা হয়। এই মুহূর্তে, ব্যাক
স্ট্যাকে টাস্কের সব অ্যাক্টিভিটি অন্তর্ভুক্ত থাকে যা স্ট্যাকের
সবচেয়ে উপরে নিয়ে আসা হয়। ছবি ৪-এ এই ধরনের পরিস্থিতি দেখানো হয়েছে।
"singleTask" লঞ্চ মোড সহ কোনও অ্যাক্টিভিটি কীভাবে ব্যাক স্ট্যাকে যোগ করা হয়
তার একটি উপস্থাপনা। অ্যাক্টিভিটি যদি
ইতিমধ্যে ব্যাকগ্রাউন্ড টাস্কের অংশ হয় এবং সেটির নিজস্ব ব্যাক স্ট্যাক থাকে, তাহলে সেই
সম্পূর্ণ ব্যাক স্ট্যাকও বর্তমান টাস্কের উপরে
সামনে চলে আসে।ম্যানিফেস্ট ফাইলে লঞ্চ মোড ব্যবহার করার ব্যাপারে আরও তথ্যের জন্য,
<activity> এলিমেন্ট ডকুমেন্টেশন দেখুন।
ইনটেন্ট ফ্ল্যাগ ব্যবহার করে লঞ্চ মোড নির্ধারণ করা
কোনও অ্যাক্টিভিটি শুরু করার সময়, আপনি startActivity()-এ ডেলিভার করা ইনটেন্টে ফ্ল্যাগ অন্তর্ভুক্ত করে
কোনও অ্যাক্টিভিটির ডিফল্ট অ্যাসোসিয়েশনকে এর টাস্কে পরিবর্তন করতে পারবেন। ডিফল্ট অ্যাকশন পরিবর্তন করার জন্য আপনি যেসব ফ্ল্যাগ ব্যবহার করতে পারেন
সেগুলি নিচে উল্লেখ করা হল:
FLAG_ACTIVITY_NEW_TASKসিস্টেমটি নতুন টাস্কে অ্যাক্টিভিটি শুরু করে। যে অ্যাক্টিভিটি শুরু করা হচ্ছে, সেটির জন্য কোনও টাস্ক আগে থেকেই চলতে থাকলে, সেই টাস্কটি তার শেষ স্ট্যাটাস সহ ফোরগ্রাউন্ডে আনা হয় এবং অ্যাক্টিভিটিটি
onNewIntent()-এ নতুন ইনটেন্ট পায়।এটি আগের বিভাগে আলোচনা করা
"singleTask"launchModeভ্যালুর মতো একই আচরণ করে।FLAG_ACTIVITY_SINGLE_TOPশুরু করা অ্যাক্টিভিটি যদি বর্তমান অ্যাক্টিভিটি হয়, তাহলে ব্যাক স্ট্যাকের সবচেয়ে উপরে, অ্যাক্টিভিটির নতুন ইনস্ট্যান্স তৈরি করার পরিবর্তে, আগে থেকে থাকা ইনস্ট্যান্স
onNewIntent()-এ কল রিসিভ করে।এটি আগের বিভাগে আলোচনা করা
"singleTop"launchModeভ্যালুর মতো একই আচরণ তৈরি করে।FLAG_ACTIVITY_CLEAR_TOPযে অ্যাক্টিভিটি শুরু করা হচ্ছে সেটি যদি বর্তমান টাস্কে আগে থেকেই চলতে থাকে, তাহলে—সেই অ্যাক্টিভিটির নতুন ইনস্ট্যান্স লঞ্চ করার পরিবর্তে—সিস্টেম তার উপরে থাকা অন্যান্য সব অ্যাক্টিভিটি নষ্ট করে দেয়। অ্যাক্টিভিটির আবার চালু করা ইনস্ট্যান্সে ইনটেন্ট ডেলিভার করা হয়েছে, এখন
onNewIntent()-এর মাধ্যমে উপরে দেখানো হচ্ছে।launchModeঅ্যাট্রিবিউটের জন্য কোনও ভ্যালু নেই যা এই আচরণ তৈরি করে।FLAG_ACTIVITY_CLEAR_TOPবেশিরভাগ ক্ষেত্রেFLAG_ACTIVITY_NEW_TASK-এর সাথে ব্যবহার করা হয়। একসাথে ব্যবহার করা হলে, এই ফ্ল্যাগগুলি অন্য টাস্কে আগে থেকে থাকা অ্যাক্টিভিটি খুঁজে বের করে এবং এমন একটি পজিশনে রাখে যেখানে এটি ইনটেন্টের উত্তর দিতে পারে।
হ্যান্ডেল অ্যাফিনিটি
অ্যাফিনিটি থেকে বোঝা যায় যে কোনও অ্যাক্টিভিটি কোন টাস্কের সাথে "যুক্ত হতে চায়"। ডিফল্ট হিসেবে, একই অ্যাপের সব অ্যাক্টিভিটির একে অপরের প্রতি অ্যাফিনিটি থাকে: তারা একই টাস্কে থাকতে "পছন্দ করে"।
তবে, আপনি কোনও অ্যাক্টিভিটির জন্য ডিফল্ট অ্যাফিনিটি পরিবর্তন করতে পারবেন। বিভিন্ন অ্যাপে সংজ্ঞায়িত অ্যাক্টিভিটি অ্যাফিনিটি শেয়ার করতে পারে এবং একই অ্যাপে সংজ্ঞায়িত অ্যাক্টিভিটি বিভিন্ন টাস্ক অ্যাফিনিটিতে অ্যাসাইন করা যেতে পারে।
আপনি <activity> এলিমেন্টের taskAffinity অ্যাট্রিবিউট ব্যবহার করে
অ্যাক্টিভিটির অ্যাফিনিটি পরিবর্তন করতে পারবেন।
taskAffinity অ্যাট্রিবিউট একটি স্ট্রিং ভ্যালু নেয় যা অবশ্যই <manifest> এলিমেন্টে
ঘোষিত ডিফল্ট প্যাকেজের নাম থেকে আলাদা হতে হবে, কারণ সিস্টেম
অ্যাপের জন্য ডিফল্ট টাস্ক অ্যাফিনিটি শনাক্ত করতে সেই নামটি ব্যবহার করে।
দুটি পরিস্থিতিতে অ্যাফিনিটি কাজ করে:
অ্যাক্টিভিটি লঞ্চ করা ইনটেন্টে
FLAG_ACTIVITY_NEW_TASKফ্ল্যাগ থাকলে।ডিফল্ট হিসেবে,
startActivity()-কে কল করা অ্যাক্টিভিটির টাস্কে নতুন অ্যাক্টিভিটি লঞ্চ করা হয়। এটি কলারের মতো একই ব্যাক স্ট্যাকে পুশ করা হয়।তবে,
startActivity()-এ পাস করা ইনটেন্টেFLAG_ACTIVITY_NEW_TASKফ্ল্যাগ থাকলে, সিস্টেম নতুন অ্যাক্টিভিটি দেখানোর জন্য অন্য টাস্ক খোঁজে। সাধারণত, এটি একটি নতুন টাস্ক। তবে, এটি করার প্রয়োজন নেই। নতুন অ্যাক্টিভিটির মতো একই অ্যাফিনিটি সহ কোনও টাস্ক আগে থেকেই থাকলে, অ্যাক্টিভিটিটি সেই টাস্কে লঞ্চ করা হয়। না হলে, এটি নতুন টাস্ক শুরু করে।এই ফ্ল্যাগ কোনও অ্যাক্টিভিটিকে নতুন টাস্ক শুরু করতে বাধ্য করলে এবং ব্যবহারকারী হোম বোতাম বা জেসচার ব্যবহার করে সেটি থেকে বেরিয়ে এলে, ব্যবহারকারীর কাছে টাস্কে ফিরে যাওয়ার কোনও উপায় থাকতে হবে। কিছু এন্টিটি, যেমন বিজ্ঞপ্তি ম্যানেজার, সবসময় এক্সটার্নাল টাস্কে অ্যাক্টিভিটি শুরু করে, কখনও নিজের অংশ হিসেবে নয়, তাই তারা সবসময়
FLAG_ACTIVITY_NEW_TASK-কেstartActivity()-এ পাস করা ইনটেন্টে রাখে।কোনও এক্সটার্নাল এন্টিটি এই ফ্ল্যাগ দিয়ে আপনার অ্যাক্টিভিটি ইনভোক করতে পারলে, ব্যবহারকারীদের ফিরে আসার জন্য একটি স্বতন্ত্র উপায় দিন, যেমন টাস্কের রুট অ্যাক্টিভিটিতে
CATEGORY_LAUNCHERফিল্টার থেকে লঞ্চার আইকন। আরও তথ্যের জন্য, টাস্ক শুরু করুন দেখুন।কোনও অ্যাক্টিভিটির
allowTaskReparentingঅ্যাট্রিবিউট"true"-এ সেট করা থাকলে।এই ক্ষেত্রে, অ্যাক্টিভিটি যে টাস্কে শুরু হয় সেখান থেকে যে টাস্কের সাথে অ্যাফিনিটি আছে সেখানে চলে যেতে পারে, যখন সেই টাস্ক ফোরগ্রাউন্ডে আসে।
যেমন, ধরুন কোনও ট্রাভেল অ্যাপের অংশ হিসেবে এমন একটি অ্যাক্টিভিটি সংজ্ঞায়িত করা হয়েছে যা বেছে নেওয়া শহরের আবহাওয়ার পরিস্থিতি সম্পর্কে রিপোর্ট করে। একই অ্যাপের অন্যান্য অ্যাক্টিভিটির মতো এটিরও একই অ্যাফিনিটি আছে, ডিফল্ট অ্যাপ অ্যাফিনিটি এবং এই অ্যাট্রিবিউটের মাধ্যমে এটি রি-পেরেন্ট করা যেতে পারে।
আপনার কোনও অ্যাক্টিভিটি আবহাওয়া রিপোর্টার অ্যাক্টিভিটি শুরু করলে, প্রাথমিকভাবে এটি আপনার অ্যাক্টিভিটির মতো একই টাস্কের অংশ হয়। তবে, ট্রাভেল অ্যাপের টাস্ক ফোরগ্রাউন্ডে এলে, আবহাওয়ার রিপোর্টার অ্যাক্টিভিটি সেই টাস্কে আবার অ্যাসাইন করা হয় এবং তার মধ্যে দেখানো হয়।
ব্যাক স্ট্যাক মুছে দিন
ব্যবহারকারী কোনও টাস্ক অনেকক্ষণ ধরে না করলে, সিস্টেম রুট অ্যাক্টিভিটি ছাড়া বাকি সব অ্যাক্টিভিটির টাস্ক মুছে দেয়। ব্যবহারকারী টাস্কে ফিরে এলে, শুধুমাত্র রুট অ্যাক্টিভিটি রিস্টোর করা হয়। সিস্টেম এই অনুমান করে যে, দীর্ঘ সময় পরে ব্যবহারকারী আগে যা করছিলেন তা ছেড়ে দিয়েছেন এবং নতুন কিছু শুরু করার জন্য টাস্কে ফিরে আসছেন।
এই আচরণ পরিবর্তন করার জন্য আপনি কিছু অ্যাক্টিভিটি অ্যাট্রিবিউট ব্যবহার করতে পারেন:
alwaysRetainTaskState- কোনও টাস্কের রুট অ্যাক্টিভিটিতে এই অ্যাট্রিবিউট
"true"-এ সেট করা থাকলে, এইমাত্র বর্ণনা করা ডিফল্ট অ্যাকশনটি ঘটে না। টাস্কটি অনেকদিন পরেও তার স্ট্যাকের সব অ্যাক্টিভিটি ধরে রাখে। clearTaskOnLaunchকোনও টাস্কের রুট অ্যাক্টিভিটিতে এই অ্যাট্রিবিউট
"true"-এ সেট করা থাকলে, ব্যবহারকারী যখনই টাস্কটি ছেড়ে চলে যান এবং আবার ফিরে আসেন, তখনই টাস্কটি রুট অ্যাক্টিভিটি পর্যন্ত মুছে ফেলা হয়। অন্যভাবে বলতে গেলে, এটিalwaysRetainTaskState-এর বিপরীত। ব্যবহারকারী সবসময় টাস্কের প্রাথমিক অবস্থায় ফিরে আসেন, এমনকি টাস্ক থেকে মাত্র এক মুহূর্তের জন্য বেরিয়ে গেলেও।finishOnTaskLaunchএই অ্যাট্রিবিউটটি
clearTaskOnLaunch-এর মতো, তবে এটি একটি একক অ্যাক্টিভিটিতে কাজ করে, পুরো টাস্কে নয়। এছাড়াও, এটি রুট অ্যাক্টিভিটি ছাড়া অন্য যেকোনও অ্যাক্টিভিটি শেষ করতে পারে। এটি"true"-এ সেট করা থাকলে, অ্যাক্টিভিটি শুধুমাত্র বর্তমান সেশনের জন্য টাস্কের অংশ হিসেবে থেকে যায়। ব্যবহারকারী টাস্ক ছেড়ে চলে গিয়ে আবার ফিরে এলে, সেটি আর দেখতে পাবেন না।
টাস্ক শুরু করা
আপনি কোনও অ্যাক্টিভিটিকে টাস্কের এন্ট্রি পয়েন্ট হিসেবে সেট-আপ করতে পারেন। এর জন্য আপনাকে নির্দিষ্ট অ্যাকশন হিসেবে "android.intent.action.MAIN" এবং নির্দিষ্ট বিভাগ হিসেবে "android.intent.category.LAUNCHER" সহ ইনটেন্ট ফিল্টার দিতে হবে:
<activity ... >
<intent-filter ... >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
...
</activity>
এই ইনটেন্ট ফিল্টার অ্যাপ লঞ্চারে অ্যাক্টিভিটির জন্য একটি আইকন ও লেবেল দেখায়, যা ব্যবহারকারীকে অ্যাক্টিভিটি লঞ্চ করার এবং এটি যে টাস্ক তৈরি করে তাতে ফিরে যাওয়ার সুযোগ দেয়।
এই দ্বিতীয় ক্ষমতাটি গুরুত্বপূর্ণ। ব্যবহারকারীকে কোনও টাস্ক ছেড়ে বেরিয়ে আসার এবং পরে এই অ্যাক্টিভিটি লঞ্চার ব্যবহার করে
আবার ফিরে আসার সুবিধা দিতে হবে। এই কারণে, শুধুমাত্র দুটি লঞ্চ মোড ব্যবহার করুন
যা অ্যাক্টিভিটিকে সবসময় টাস্ক শুরু করার জন্য চিহ্নিত করে,
"singleTask" এবং "singleInstance", যখন অ্যাক্টিভিটিতে
ACTION_MAIN এবং CATEGORY_LAUNCHER ফিল্টার থাকে।
উদাহরণস্বরূপ, ফিল্টারটি না থাকলে কী হতে পারে তা কল্পনা করুন: একটি
ইনটেন্ট "singleTask" অ্যাক্টিভিটি চালু করে, একটি নতুন টাস্ক শুরু করে এবং ব্যবহারকারী
সেই টাস্কে কাজ করার জন্য কিছু সময় ব্যয় করেন। ব্যবহারকারী তারপর হোম বোতাম বা
জেসচার ব্যবহার করেন। টাস্কটি এখন ব্যাকগ্রাউন্ডে পাঠানো হয়েছে এবং দেখা যাচ্ছে না। এখন ব্যবহারকারীর
টাস্কে ফিরে আসার কোনও উপায় নেই, কারণ এটি অ্যাপ
লঞ্চারে দেখানো হয় না।
আপনি যদি চান যে ব্যবহারকারী কোনও অ্যাক্টিভিটিতে ফিরে না আসুক, তাহলে <activity> এলিমেন্টের finishOnTaskLaunch-কে
"true"-এ সেট করুন। আরও তথ্যের জন্য, ব্যাক স্ট্যাক মুছে দিন দেখুন।
সাম্প্রতিক স্ক্রিনে কীভাবে টাস্ক ও অ্যাক্টিভিটি দেখানো ও ম্যানেজ করা হয় সেই সম্পর্কে আরও জানতে, সাম্প্রতিক স্ক্রিন দেখুন।