টাস্ক এবং পিছনে স্ট্যাক

একটি টাস্ক হল ক্রিয়াকলাপের একটি সংগ্রহ যা ব্যবহারকারীরা আপনার অ্যাপে কিছু করার চেষ্টা করার সময় যোগাযোগ করে। এই ক্রিয়াকলাপগুলিকে একটি স্ট্যাকের মধ্যে সাজানো হয় যাকে ব্যাক স্ট্যাক বলা হয় যে ক্রমে প্রতিটি কার্যকলাপ খোলা হয়।

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

একটি টাস্কের জীবনচক্র এবং এর ব্যাক স্ট্যাক

ডিভাইস হোম স্ক্রীন হল বেশিরভাগ কাজের শুরুর স্থান। যখন কোনও ব্যবহারকারী অ্যাপ লঞ্চারে বা হোম স্ক্রিনে কোনও অ্যাপ বা শর্টকাটের আইকন স্পর্শ করেন, সেই অ্যাপের কাজটি অগ্রভাগে চলে আসে। যদি অ্যাপের জন্য কোনও টাস্ক না থাকে, তাহলে একটি নতুন টাস্ক তৈরি করা হয় এবং সেই অ্যাপের মূল অ্যাক্টিভিটি স্ট্যাকের রুট অ্যাক্টিভিটি হিসেবে খোলে।

যখন বর্তমান অ্যাক্টিভিটি আরেকটি শুরু হয়, তখন নতুন অ্যাক্টিভিটি স্ট্যাকের উপরের দিকে ঠেলে দেওয়া হয় এবং ফোকাস নেয়। পূর্ববর্তী কার্যকলাপ স্ট্যাকের মধ্যে থাকে, কিন্তু বন্ধ করা হয়। যখন একটি কার্যকলাপ বন্ধ করা হয়, সিস্টেমটি তার ব্যবহারকারী ইন্টারফেসের বর্তমান অবস্থা বজায় রাখে। ব্যবহারকারী যখন ব্যাক অ্যাকশনটি সঞ্চালন করে, তখন বর্তমান অ্যাক্টিভিটি স্ট্যাকের উপরে থেকে পপ করা হয় এবং ধ্বংস হয়ে যায়। পূর্ববর্তী কার্যকলাপ পুনরায় শুরু হয়, এবং এর UI এর পূর্ববর্তী অবস্থা পুনরুদ্ধার করা হয়।

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

চিত্র 1. একটি টাস্কের প্রতিটি নতুন ক্রিয়াকলাপ কীভাবে পিছনের স্ট্যাকে একটি আইটেম যুক্ত করে তার একটি উপস্থাপনা। যখন ব্যবহারকারী টোকা বা অঙ্গভঙ্গি করে পিছনে, বর্তমান কার্যকলাপ ধ্বংস হয়ে যায় এবং পূর্ববর্তী কার্যকলাপ পুনরায় শুরু হয়।

ব্যবহারকারী যতক্ষণ ট্যাপ করতে বা ফিরে যাওয়ার ইঙ্গিত করতে থাকে, স্ট্যাকের প্রতিটি কার্যকলাপ আগেরটি প্রকাশ করার জন্য পপ অফ করা হয়, যতক্ষণ না ব্যবহারকারী হোম স্ক্রিনে ফিরে আসে বা টাস্ক শুরু হওয়ার সময় যে কোনও কার্যকলাপ চলছিল। যখন সমস্ত ক্রিয়াকলাপ স্ট্যাক থেকে সরানো হয়, তখন কাজটি আর বিদ্যমান থাকে না।

রুট লঞ্চার কার্যকলাপের জন্য ব্যাক ট্যাপ আচরণ

রুট লঞ্চার ক্রিয়াকলাপগুলি হল এমন কার্যকলাপ যা ACTION_MAIN এবং CATEGORY_LAUNCHER উভয়ের সাথে একটি অভিপ্রায় ফিল্টার ঘোষণা করে৷ এই ক্রিয়াকলাপগুলি অনন্য কারণ এগুলি অ্যাপ লঞ্চার থেকে আপনার অ্যাপে এন্ট্রি পয়েন্ট হিসাবে কাজ করে এবং একটি টাস্ক শুরু করতে ব্যবহৃত হয়৷

যখন কোনও ব্যবহারকারী একটি রুট লঞ্চার কার্যকলাপ থেকে ফিরে ট্যাপ করে বা অঙ্গভঙ্গি করে, তখন ডিভাইসটি চলমান Android এর সংস্করণের উপর নির্ভর করে সিস্টেমটি ইভেন্টটিকে ভিন্নভাবে পরিচালনা করে।

অ্যান্ড্রয়েড 11 এবং তার নিচের ভার্সনে সিস্টেম আচরণ
সিস্টেম কার্যকলাপ শেষ.
Android 12 এবং উচ্চতর সংস্করণে সিস্টেম আচরণ

সিস্টেম ক্রিয়াকলাপ শেষ করার পরিবর্তে ক্রিয়াকলাপ এবং এর কাজটিকে পটভূমিতে নিয়ে যায়। হোম বোতাম বা অঙ্গভঙ্গি ব্যবহার করে একটি অ্যাপ থেকে নেভিগেট করার সময় এই আচরণটি ডিফল্ট সিস্টেম আচরণের সাথে মেলে।

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

আপনি যদি কাস্টম ব্যাক নেভিগেশন প্রদান করতে চান, তাহলে আমরা onBackPressed() ওভাররাইড করার পরিবর্তে AndroidX Activity API ব্যবহার করার পরামর্শ দিই। সিস্টেমের ব্যাক ট্যাপকে বাধা দেওয়ার মতো কোনো উপাদান না থাকলে AndroidX কার্যকলাপ APIগুলি স্বয়ংক্রিয়ভাবে উপযুক্ত সিস্টেম আচরণে পিছিয়ে যায়।

যাইহোক, যদি আপনার অ্যাপ ব্যাক নেভিগেশন পরিচালনা করতে এবং অ্যাক্টিভিটি শেষ করতে onBackPressed() ওভাররাইড করে, তাহলে শেষ করার পরিবর্তে super.onBackPressed() এ কল করার জন্য আপনার বাস্তবায়ন আপডেট করুন। super.onBackPressed() কল করা অ্যাক্টিভিটি এবং এর কাজকে উপযুক্ত হলে ব্যাকগ্রাউন্ডে নিয়ে যায় এবং অ্যাপ জুড়ে ব্যবহারকারীদের জন্য আরও সামঞ্জস্যপূর্ণ নেভিগেশন অভিজ্ঞতা প্রদান করে।

পটভূমি এবং অগ্রভাগের কাজ

চিত্র 2. দুটি কাজ: টাস্ক বি ফোরগ্রাউন্ডে ব্যবহারকারীর ইন্টারঅ্যাকশন গ্রহণ করে, যখন টাস্ক A ব্যাকগ্রাউন্ডে থাকে, আবার শুরু হওয়ার অপেক্ষায় থাকে।

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

বর্তমান টাস্ক A এর জন্য নিম্নলিখিত টাস্ক ফ্লো বিবেচনা করুন যার স্ট্যাকে তিনটি ক্রিয়াকলাপ রয়েছে, বর্তমান কার্যকলাপের অধীনে দুটি সহ:

  1. ব্যবহারকারী হোম বোতাম বা অঙ্গভঙ্গি ব্যবহার করে, তারপর অ্যাপ লঞ্চার থেকে একটি নতুন অ্যাপ শুরু করে।

    হোম স্ক্রীন প্রদর্শিত হলে, টাস্ক A পটভূমিতে চলে যায়। যখন নতুন অ্যাপটি শুরু হয়, সিস্টেমটি সেই অ্যাপের জন্য একটি টাস্ক শুরু করে (টাস্ক বি) তার নিজস্ব ক্রিয়াকলাপগুলির স্ট্যাক সহ।

  2. সেই অ্যাপটির সাথে ইন্টারঅ্যাক্ট করার পরে, ব্যবহারকারী আবার হোমে ফিরে আসে এবং সেই অ্যাপটি নির্বাচন করে যেটি মূলত টাস্ক A শুরু করেছিল।

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

একাধিক কার্যকলাপ উদাহরণ

চিত্র 3. একটি একক কার্যকলাপ একাধিকবার তাত্ক্ষণিক করা যেতে পারে।

কারণ ব্যাক স্ট্যাকের ক্রিয়াকলাপগুলি কখনই পুনর্বিন্যাস করা হয় না, যদি আপনার অ্যাপ ব্যবহারকারীদের একাধিক অ্যাক্টিভিটি থেকে একটি নির্দিষ্ট ক্রিয়াকলাপ শুরু করতে দেয়, সেই কার্যকলাপের একটি নতুন দৃষ্টান্ত তৈরি করা হয় এবং স্ট্যাকের উপর ঠেলে দেওয়া হয়, ক্রিয়াকলাপের আগের কোনও দৃষ্টান্ত আনার পরিবর্তে শীর্ষ। যেমন, চিত্র 3-এ দেখানো হিসাবে, আপনার অ্যাপে একটি ক্রিয়াকলাপ একাধিকবার তাৎক্ষণিক হতে পারে, এমনকি বিভিন্ন কাজ থেকেও।

যদি ব্যবহারকারী ব্যাক বোতাম বা অঙ্গভঙ্গি ব্যবহার করে পিছনের দিকে নেভিগেট করে, কার্যকলাপের দৃষ্টান্তগুলি তাদের খোলার ক্রম অনুসারে প্রকাশ করা হয়, প্রতিটির নিজস্ব UI অবস্থা। যাইহোক, আপনি এই আচরণটি পরিবর্তন করতে পারেন যদি আপনি একটি ক্রিয়াকলাপ একাধিকবার চালু করতে না চান। কাজগুলি পরিচালনার বিষয়ে বিভাগে এটি সম্পর্কে আরও জানুন।

মাল্টি-উইন্ডো পরিবেশ

যখন অ্যাপ্লিকেশানগুলি একটি মাল্টি-উইন্ডোযুক্ত পরিবেশে একই সাথে চলে, যা Android 7.0 (API স্তর 24) এবং উচ্চতর সমর্থিত, সিস্টেম প্রতিটি উইন্ডোর জন্য আলাদাভাবে কাজগুলি পরিচালনা করে৷ প্রতিটি উইন্ডোতে একাধিক কাজ থাকতে পারে। ক্রোমবুকে চলমান অ্যান্ড্রয়েড অ্যাপের ক্ষেত্রেও একই কথা প্রযোজ্য: সিস্টেমটি প্রতি-উইন্ডো ভিত্তিতে কাজগুলি বা কাজের গ্রুপগুলি পরিচালনা করে৷

লাইফসাইকেল রিক্যাপ

ক্রিয়াকলাপ এবং কাজের জন্য ডিফল্ট আচরণ সংক্ষিপ্ত করতে:

  • যখন অ্যাক্টিভিটি এ অ্যাক্টিভিটি বি শুরু করে, তখন অ্যাক্টিভিটি এ বন্ধ হয়ে যায় কিন্তু সিস্টেমটি তার অবস্থা ধরে রাখে, যেমন তার স্ক্রোল পজিশন এবং ফর্মে প্রবেশ করা যেকোন টেক্সট। ব্যবহারকারী যদি অ্যাক্টিভিটি বি-তে থাকা অবস্থায় পিছনের অঙ্গভঙ্গিটি ট্যাপ করে বা ব্যবহার করে, তবে অ্যাক্টিভিটি A এর স্থিতি পুনরুদ্ধার করে পুনরায় শুরু হয়।

  • যখন ব্যবহারকারী হোম বোতাম বা অঙ্গভঙ্গি ব্যবহার করে একটি কাজ ছেড়ে যায়, তখন বর্তমান কার্যকলাপ বন্ধ হয়ে যায় এবং এর কাজটি পটভূমিতে চলে যায়। সিস্টেম টাস্কের প্রতিটি কার্যকলাপের অবস্থা বজায় রাখে। যদি ব্যবহারকারী পরবর্তীতে টাস্কটি শুরু করে এমন লঞ্চার আইকনটি নির্বাচন করে কাজটি পুনরায় শুরু করে, টাস্কটি অগ্রভাগে আসে এবং স্ট্যাকের শীর্ষে কার্যকলাপটি পুনরায় শুরু করে।

  • যদি ব্যবহারকারী ট্যাপ করে বা পিছনের অঙ্গভঙ্গি করে, বর্তমান কার্যকলাপ স্ট্যাক থেকে পপ করা হয় এবং ধ্বংস করা হয়। স্ট্যাকের পূর্ববর্তী কার্যকলাপ পুনরায় শুরু হয়। একটি কার্যকলাপ ধ্বংস হয়ে গেলে, সিস্টেমটি কার্যকলাপের অবস্থা বজায় রাখে না

    আপনার অ্যাপ যখন Android 12 বা উচ্চতর সংস্করণে চলে এমন একটি ডিভাইসে চলমান থাকে তখন রুট লঞ্চার ক্রিয়াকলাপের জন্য এই আচরণটি ভিন্ন।

  • ক্রিয়াকলাপগুলি একাধিকবার তাত্ক্ষণিক করা যেতে পারে, এমনকি অন্যান্য কাজ থেকেও।

কাজগুলি পরিচালনা করুন

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

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

আপনি startActivity() এ পাস করার উদ্দেশ্যে <activity> ম্যানিফেস্ট উপাদান এবং ফ্ল্যাগগুলির বৈশিষ্ট্যগুলি ব্যবহার করে এই জিনিসগুলি এবং আরও অনেক কিছু করতে পারেন।

এইগুলি হল প্রধান <activity> বৈশিষ্ট্য যা আপনি কাজগুলি পরিচালনা করতে ব্যবহার করতে পারেন:

এবং এইগুলি হল প্রধান উদ্দেশ্য পতাকা যা আপনি ব্যবহার করতে পারেন:

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

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

লঞ্চ মোড সংজ্ঞায়িত করুন

লঞ্চ মোডগুলি আপনাকে সংজ্ঞায়িত করতে দেয় যে কীভাবে একটি ক্রিয়াকলাপের একটি নতুন উদাহরণ বর্তমান টাস্কের সাথে যুক্ত। আপনি দুটি উপায়ে লঞ্চ মোড সংজ্ঞায়িত করতে পারেন, যা অনুসরণ করা বিভাগে বর্ণিত হয়েছে:

  • ম্যানিফেস্ট ফাইল ব্যবহার করে

    যখন আপনি আপনার ম্যানিফেস্ট ফাইলে একটি কার্যকলাপ ঘোষণা করেন, তখন আপনি নির্দিষ্ট করতে পারেন যে কিভাবে কার্যকলাপটি শুরু হওয়ার সময় কার্যগুলির সাথে যুক্ত হয়৷

  • উদ্দেশ্য পতাকা ব্যবহার করে

    আপনি যখন startActivity() কল করেন, তখন আপনি Intent একটি পতাকা অন্তর্ভুক্ত করতে পারেন যা ঘোষণা করে যে কীভাবে (বা কিনা) নতুন কার্যকলাপ বর্তমান টাস্কের সাথে যুক্ত।

সুতরাং, যদি অ্যাক্টিভিটি A অ্যাক্টিভিটি বি শুরু করে, তাহলে অ্যাক্টিভিটি বি তার ম্যানিফেস্টে সংজ্ঞায়িত করতে পারে যে এটি বর্তমান টাস্কের সাথে কীভাবে যুক্ত হয়, এবং অ্যাক্টিভিটি A কীভাবে অ্যাক্টিভিটি বি বর্তমান টাস্কের সাথে যুক্ত হতে পারে তা অনুরোধ করতে একটি অভিপ্রায় ফ্ল্যাগ ব্যবহার করতে পারে।

যদি উভয় ক্রিয়াকলাপ সংজ্ঞায়িত করে যে কীভাবে অ্যাক্টিভিটি B একটি কাজের সাথে যুক্ত হয়, তাহলে অ্যাক্টিভিটি A-এর অনুরোধ, উদ্দেশ্য হিসাবে সংজ্ঞায়িত করা হয়েছে, অ্যাক্টিভিটি B-এর অনুরোধকে সম্মান করা হবে, যেমন তার ম্যানিফেস্টে সংজ্ঞায়িত করা হয়েছে।

ম্যানিফেস্ট ফাইল ব্যবহার করে লঞ্চ মোড সংজ্ঞায়িত করুন

আপনার ম্যানিফেস্ট ফাইলে কোনো অ্যাক্টিভিটি ঘোষণা করার সময়, আপনি <activity> উপাদানের launchMode অ্যাট্রিবিউট ব্যবহার করে একটি টাস্কের সাথে অ্যাক্টিভিটি কিভাবে যুক্ত হবে তা উল্লেখ করতে পারেন।

পাঁচটি লঞ্চ মোড রয়েছে যা আপনি launchMode বৈশিষ্ট্যে বরাদ্দ করতে পারেন:

  1. "standard"
    ডিফল্ট মোড। সিস্টেমটি যে টাস্ক থেকে শুরু হয়েছিল সেখানে কার্যকলাপের একটি নতুন দৃষ্টান্ত তৈরি করে এবং এটির উদ্দেশ্যকে রুট করে। ক্রিয়াকলাপটি একাধিকবার তাত্ক্ষণিক হতে পারে, প্রতিটি দৃষ্টান্ত বিভিন্ন কাজের অন্তর্গত হতে পারে এবং একটি কাজের একাধিক দৃষ্টান্ত থাকতে পারে।
  2. "singleTop"
    যদি বর্তমান টাস্কের শীর্ষে ক্রিয়াকলাপের একটি দৃষ্টান্ত ইতিমধ্যেই বিদ্যমান থাকে, তবে সিস্টেমটি কার্যকলাপের একটি নতুন দৃষ্টান্ত তৈরি করার পরিবর্তে তার onNewIntent() পদ্ধতিতে একটি কলের মাধ্যমে সেই ইন্সট্যান্সের উদ্দেশ্যকে রুট করে। অ্যাক্টিভিটি একাধিকবার ইনস্ট্যান্ট করা হয়, প্রতিটি ইন্সট্যান্স বিভিন্ন টাস্কের অন্তর্গত হতে পারে এবং একটি টাস্কের একাধিক ইনস্ট্যান্স থাকতে পারে (কিন্তু শুধুমাত্র যদি ব্যাক স্ট্যাকের উপরের অ্যাক্টিভিটিটি অ্যাক্টিভিটির একটি বিদ্যমান উদাহরণ না হয়)।

    উদাহরণ স্বরূপ, ধরুন একটি টাস্কের ব্যাক স্ট্যাকে রুট অ্যাক্টিভিটি A রয়েছে যার উপরে B, C এবং D রয়েছে (তাই স্ট্যাকটি ABCD, উপরে D সহ)। D টাইপের একটি কার্যকলাপের জন্য একটি উদ্দেশ্য আসে। যদি D-এর ডিফল্ট "standard" লঞ্চ মোড থাকে, তবে ক্লাসের একটি নতুন উদাহরণ চালু করা হয় এবং স্ট্যাকটি ABCDD হয়ে যায়। যাইহোক, যদি D-এর লঞ্চ মোড "singleTop" হয়, তাহলে D-এর বিদ্যমান উদাহরণ onNewIntent() এর মাধ্যমে অভিপ্রায় গ্রহণ করে, কারণ এটি স্ট্যাকের শীর্ষে থাকে এবং স্ট্যাকটি ABCD থাকে। অন্যদিকে, যদি B টাইপের কোনো কার্যকলাপের জন্য কোনো উদ্দেশ্য আসে, তাহলে B-এর একটি নতুন উদাহরণ স্ট্যাকে যোগ করা হয় যদিও এর লঞ্চ মোড "singleTop" হয়।

  3. "singleTask"
    সিস্টেমটি একটি নতুন টাস্কের মূলে ক্রিয়াকলাপ তৈরি করে বা একই সখ্যতার সাথে একটি বিদ্যমান টাস্কে কার্যকলাপটি সনাক্ত করে। যদি কার্যকলাপের একটি দৃষ্টান্ত ইতিমধ্যেই বিদ্যমান থাকে, তাহলে সিস্টেমটি একটি নতুন উদাহরণ তৈরি করার পরিবর্তে তার onNewIntent() পদ্ধতিতে একটি কলের মাধ্যমে বিদ্যমান উদাহরণে অভিপ্রায়কে রুট করে। এরই মধ্যে এর ওপরের অন্যান্য কার্যক্রম ধ্বংস হয়ে যায়।
  4. "singleInstance"
    আচরণটি "singleTask" এর মতোই, ব্যতীত যে সিস্টেমটি দৃষ্টান্ত ধারণ করা টাস্কে অন্য কোনো ক্রিয়াকলাপ চালু করে না। কার্যকলাপ সবসময় তার টাস্ক একক এবং একমাত্র সদস্য. এটির দ্বারা শুরু হওয়া যেকোনো কার্যক্রম একটি পৃথক টাস্কে উন্মুক্ত।
  5. "singleInstancePerTask"
    অ্যাক্টিভিটি শুধুমাত্র টাস্কের রুট অ্যাক্টিভিটি হিসেবে চলতে পারে, প্রথম অ্যাক্টিভিটি যেটি টাস্ক তৈরি করেছে, এবং সেইজন্য একটি টাস্কে এই অ্যাক্টিভিটির একটি মাত্র উদাহরণ থাকতে পারে। singleTask লঞ্চ মোডের বিপরীতে, যদি FLAG_ACTIVITY_MULTIPLE_TASK বা FLAG_ACTIVITY_NEW_DOCUMENT পতাকা সেট করা থাকে তবে এই কার্যকলাপটি বিভিন্ন কাজের একাধিক দৃষ্টান্তে শুরু করা যেতে পারে৷

আরেকটি উদাহরণ হিসেবে, অ্যান্ড্রয়েড ব্রাউজার অ্যাপ ঘোষণা করে যে ওয়েব ব্রাউজার অ্যাক্টিভিটি সর্বদা <activity> এলিমেন্টে singleTask লঞ্চ মোড নির্দিষ্ট করে তার নিজস্ব কাজে খোলে। এর মানে হল যে যদি আপনার অ্যাপটি অ্যান্ড্রয়েড ব্রাউজার খোলার অভিপ্রায় ইস্যু করে, তবে এটির কার্যকলাপ আপনার অ্যাপের মতো একই টাস্কে রাখা হয় না । পরিবর্তে, হয় ব্রাউজারের জন্য একটি নতুন টাস্ক শুরু হয় বা, যদি ব্রাউজারটির আগে থেকেই ব্যাকগ্রাউন্ডে একটি টাস্ক চলমান থাকে, সেই টাস্কটি নতুন অভিপ্রায় পরিচালনা করার জন্য এগিয়ে আনা হয়।

কোনও অ্যাক্টিভিটি কোনও নতুন টাস্কে শুরু হোক বা যে অ্যাক্টিভিটিটি শুরু করেছে সেই অ্যাক্টিভিটির মতো একই টাস্কে শুরু হোক না কেন, ব্যাক বোতাম এবং অঙ্গভঙ্গি সবসময় ব্যবহারকারীকে আগের অ্যাক্টিভিটিতে নিয়ে যায়। যাইহোক, যদি আপনি একটি কার্যকলাপ শুরু করেন যা singleTask লঞ্চ মোড নির্দিষ্ট করে এবং সেই কার্যকলাপের একটি উদাহরণ একটি ব্যাকগ্রাউন্ড টাস্কে বিদ্যমান থাকে, তাহলে সেই পুরো টাস্কটি অগ্রভাগে আনা হয়। এই মুহুর্তে, ব্যাক স্ট্যাক স্ট্যাকের শীর্ষে এগিয়ে আনা টাস্ক থেকে সমস্ত ক্রিয়াকলাপ অন্তর্ভুক্ত করে। চিত্র 4 এই ধরনের দৃশ্য দেখায়।

চিত্র 4. কিভাবে লঞ্চ মোড "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> উপাদানে ঘোষিত ডিফল্ট প্যাকেজ নামের থেকে আলাদা হতে হবে, কারণ সিস্টেমটি অ্যাপটির জন্য ডিফল্ট টাস্ক অ্যাফিনিটি সনাক্ত করতে সেই নামটি ব্যবহার করে।

সম্বন্ধ দুটি পরিস্থিতিতে খেলায় আসে:

  1. যখন উদ্দেশ্য যেটি একটি কার্যকলাপ চালু করে তাতে FLAG_ACTIVITY_NEW_TASK পতাকা থাকে৷

    একটি নতুন ক্রিয়াকলাপ, ডিফল্টরূপে, ক্রিয়াকলাপের টাস্কে চালু করা হয় যা startActivity() নামে পরিচিত। এটি কলারের মতো একই ব্যাক স্ট্যাকের দিকে ঠেলে দেওয়া হয়েছে।

    যাইহোক, startActivity() এ পাস করা অভিপ্রায় যদি FLAG_ACTIVITY_NEW_TASK পতাকা থাকে, তাহলে সিস্টেম নতুন অ্যাক্টিভিটি রাখার জন্য একটি ভিন্ন টাস্ক খোঁজে। প্রায়শই, এটি একটি নতুন কাজ। যাইহোক, এটা হতে হবে না. যদি নতুন কার্যকলাপের মতো একই সখ্যতা সহ একটি বিদ্যমান টাস্ক থাকে তবে কার্যকলাপটি সেই টাস্কে চালু করা হয়। যদি না হয়, এটি একটি নতুন কাজ শুরু করে।

    যদি এই পতাকাটি একটি নতুন কাজ শুরু করার জন্য একটি কার্যকলাপের কারণ হয় এবং ব্যবহারকারী এটি ছেড়ে যাওয়ার জন্য হোম বোতাম বা অঙ্গভঙ্গি ব্যবহার করে, ব্যবহারকারীর জন্য অবশ্যই টাস্কে ফিরে যাওয়ার জন্য কিছু উপায় থাকতে হবে৷ কিছু এন্টিটি, যেমন বিজ্ঞপ্তি ম্যানেজার, সর্বদা একটি বাহ্যিক টাস্কে ক্রিয়াকলাপ শুরু করে, তাদের নিজস্ব অংশ হিসাবে কখনই নয়, তাই তারা startActivity() এ যে উদ্দেশ্যগুলি পাস করে তাতে তারা সর্বদা FLAG_ACTIVITY_NEW_TASK রাখে৷

    যদি এই ফ্ল্যাগটি ব্যবহার করতে পারে এমন একটি বাহ্যিক সত্তা আপনার কার্যকলাপকে আমন্ত্রণ জানাতে পারে, তবে খেয়াল রাখুন যে ব্যবহারকারীর কাছে শুরু করা টাস্কে ফিরে যাওয়ার একটি স্বাধীন উপায় আছে, যেমন একটি লঞ্চার আইকন সহ, যেখানে টাস্কের রুট কার্যকলাপের একটি CATEGORY_LAUNCHER উদ্দেশ্য রয়েছে ছাঁকনি। আরও তথ্যের জন্য, কাজ শুরু করার বিষয়ে বিভাগটি দেখুন।

  2. যখন একটি অ্যাক্টিভিটি তার 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" এ সেট করুন। আরও তথ্যের জন্য, ব্যাক স্ট্যাক পরিষ্কার করার বিভাগটি দেখুন।

সাম্প্রতিক স্ক্রীনে কীভাবে কাজ এবং ক্রিয়াকলাপগুলি উপস্থাপন এবং পরিচালনা করা হয় সে সম্পর্কে আরও তথ্য সাম্প্রতিক স্ক্রীনে উপলব্ধ।

আরও সম্পদ