কিভাবে কার্যকলাপ জীবনচক্র এবং রাষ্ট্র ব্যবহার করতে হয়, কিভাবে কার্যকলাপ জীবনচক্র এবং রাষ্ট্র ব্যবহার করতে হয়

1. স্বাগতম

এই ব্যবহারিক কোডল্যাবটি ইউনিট 1 এর অংশ: অ্যান্ড্রয়েড ডেভেলপার ফান্ডামেন্টাল (সংস্করণ 2) কোর্সে শুরু করুন। আপনি যদি ক্রমানুসারে কোডল্যাবগুলির মাধ্যমে কাজ করেন তবে আপনি এই কোর্সের সর্বাধিক মূল্য পাবেন:

  • কোর্সের কোডল্যাবগুলির সম্পূর্ণ তালিকার জন্য, অ্যান্ড্রয়েড ডেভেলপার ফান্ডামেন্টালস (V2) এর জন্য কোডল্যাবগুলি দেখুন৷
  • সমস্ত ধারণা অধ্যায়, অ্যাপস এবং স্লাইডের লিঙ্ক সহ কোর্স সম্পর্কে বিশদ বিবরণের জন্য, Android বিকাশকারীর মৌলিক বিষয়গুলি (সংস্করণ 2) দেখুন৷

ভূমিকা

এই ব্যবহারিক আপনি কার্যকলাপ জীবনচক্র সম্পর্কে আরো জানুন. জীবনচক্র হল এমন রাজ্যগুলির সেট যা একটি কার্যকলাপ তার সমগ্র জীবনকালের মধ্যে থাকতে পারে, যখন এটি তৈরি হয় তখন থেকে এটি ধ্বংস হয়ে যায় এবং সিস্টেমটি তার সংস্থানগুলি পুনরায় দাবি করে। যেহেতু একজন ব্যবহারকারী আপনার অ্যাপের ক্রিয়াকলাপগুলির মধ্যে নেভিগেট করে (সেইসাথে আপনার অ্যাপের মধ্যে এবং বাইরে), তাদের জীবনচক্রে বিভিন্ন রাজ্যের মধ্যে কার্যকলাপের স্থানান্তর।

দ্বিগুণ ঝামেলা

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

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

এই ব্যবহারিকটিতে আপনি TwoActivities অ্যাপে লগিং স্টেটমেন্ট যোগ করেন এবং অ্যাপ ব্যবহার করার সাথে সাথে কার্যকলাপের জীবনচক্র পরিবর্তনগুলি পর্যবেক্ষণ করেন। তারপরে আপনি এই পরিবর্তনগুলির সাথে কাজ শুরু করুন এবং এই অবস্থার অধীনে ব্যবহারকারীর ইনপুট কীভাবে পরিচালনা করবেন তা অন্বেষণ করুন।

পূর্বশর্ত

আপনি সক্ষম হতে হবে:

  • অ্যান্ড্রয়েড স্টুডিওতে একটি অ্যাপ প্রকল্প তৈরি করুন এবং চালান।
  • আপনার অ্যাপে লগ স্টেটমেন্ট যোগ করুন এবং লগক্যাট প্যানে সেই লগগুলি দেখুন।
  • একটি কার্যকলাপ এবং একটি অভিপ্রায়কে বুঝুন এবং কাজ করুন এবং তাদের সাথে যোগাযোগ করতে স্বাচ্ছন্দ্য বোধ করুন৷

আপনি কি শিখবেন

  • কিভাবে কার্যকলাপ জীবনচক্র কাজ করে.
  • যখন একটি ক্রিয়াকলাপ শুরু হয়, বিরতি দেয়, থেমে যায় এবং ধ্বংস হয়ে যায়।
  • কার্যকলাপ পরিবর্তনের সাথে যুক্ত জীবনচক্র কলব্যাক পদ্ধতি সম্পর্কে।
  • অ্যাকশনের প্রভাব (যেমন কনফিগারেশন পরিবর্তন) যার ফলে অ্যাক্টিভিটি লাইফসাইকেল ইভেন্ট হতে পারে।
  • কিভাবে জীবনচক্র ইভেন্ট জুড়ে কার্যকলাপ অবস্থা বজায় রাখা.

আপনি কি করবেন

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

2. অ্যাপ ওভারভিউ

এই ব্যবহারিক ক্ষেত্রে আপনি TwoActivities অ্যাপে যোগ করুন। অ্যাপটি দেখায় এবং মোটামুটি একই আচরণ করে যেমনটি এটি গত কোডল্যাবে করেছিল। এটিতে দুটি কার্যকলাপ বাস্তবায়ন রয়েছে এবং ব্যবহারকারীকে তাদের মধ্যে পাঠানোর ক্ষমতা দেয়। এই ব্যবহারিক অ্যাপটিতে আপনি যে পরিবর্তনগুলি করবেন তা এর দৃশ্যমান ব্যবহারকারীর আচরণকে প্রভাবিত করবে না।

3. 3. টাস্ক 1: টু অ্যাক্টিভিটি-তে লাইফসাইকেল কলব্যাক যোগ করুন

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

1.1 (ঐচ্ছিক) TwoActivity প্রজেক্ট কপি করুন

এই ব্যবহারিক কাজের জন্য, আপনি সর্বশেষ ব্যবহারিক সময়ে তৈরি করা বিদ্যমান TwoActivities প্রকল্পটি পরিবর্তন করবেন। আপনি যদি পূর্ববর্তী TwoActivities প্রকল্পটি অক্ষত রাখতে চান, তাহলে পরিশিষ্টের ধাপগুলি অনুসরণ করুন: প্রকল্পের একটি অনুলিপি তৈরি করতে ইউটিলিটিগুলি

1.2 মেইন অ্যাক্টিভিটিতে কলব্যাক প্রয়োগ করুন

  1. অ্যান্ড্রয়েড স্টুডিওতে টু অ্যাক্টিভিটি প্রকল্পটি খুলুন এবং প্রকল্প > অ্যান্ড্রয়েড প্যানে মেইনঅ্যাক্টিভিটি খুলুন।
  2. onCreate() পদ্ধতিতে, নিম্নলিখিত লগ স্টেটমেন্ট যোগ করুন:
Log.d(LOG_TAG, "-------");
Log.d(LOG_TAG, "onCreate");
  1. সেই ইভেন্টের লগে একটি বিবৃতি সহ onStart() কলব্যাকের জন্য একটি ওভাররাইড যোগ করুন:
@Override
public void onStart(){
    super.onStart();
    Log.d(LOG_TAG, "onStart");
}

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

  1. onPause(), onRestart(), onResume(), onStop(), এবং onDestroy() লাইফসাইকেল কলব্যাকগুলি বাস্তবায়ন করতে একটি টেমপ্লেট হিসাবে onStart() পদ্ধতি ব্যবহার করুন

সমস্ত কলব্যাক পদ্ধতিতে একই স্বাক্ষর রয়েছে (নাম ব্যতীত)। আপনি যদি এই অন্যান্য কলব্যাক পদ্ধতিগুলি তৈরি করতে onStart() কপি এবং পেস্ট করেন, তাহলে সুপারক্লাসে সঠিক পদ্ধতিতে কল করতে এবং সঠিক পদ্ধতিতে লগ করতে বিষয়বস্তু আপডেট করতে ভুলবেন না।

  1. আপনার অ্যাপ চালান।
  2. লগক্যাট ফলকটি দেখানোর জন্য অ্যান্ড্রয়েড স্টুডিওর নীচে লগক্যাট ট্যাবে ক্লিক করুন। আপনি তিনটি লগ বার্তা দেখতে পাবেন যে তিনটি জীবনচক্রের অবস্থা দেখানো হয়েছে যে কার্যকলাপটি শুরু হওয়ার সাথে সাথে স্থানান্তরিত হয়েছে:
D/MainActivity: -------
D/MainActivity: onCreate
D/MainActivity: onStart
D/MainActivity: onResume

1.3 সেকেন্ড অ্যাক্টিভিটিতে লাইফসাইকেল কলব্যাক প্রয়োগ করুন

এখন আপনি মেইনঅ্যাক্টিভিটির জন্য লাইফসাইকেল কলব্যাক পদ্ধতি প্রয়োগ করেছেন, সেকেন্ডঅ্যাক্টিভিটির জন্যও একই কাজ করুন।

  1. সেকেন্ড অ্যাক্টিভিটি খুলুন।
  2. ক্লাসের শীর্ষে, LOG_TAG ভেরিয়েবলের জন্য একটি ধ্রুবক যোগ করুন:
private static final String LOG_TAG = SecondActivity.class.getSimpleName();
  1. দ্বিতীয় কার্যকলাপে লাইফসাইকেল কলব্যাক এবং লগ স্টেটমেন্ট যোগ করুন। (আপনি মেইনঅ্যাক্টিভিটি থেকে কলব্যাক পদ্ধতিগুলি কপি এবং পেস্ট করতে পারেন।)
  2. Finish() পদ্ধতির ঠিক আগে returnReply() পদ্ধতিতে একটি লগ স্টেটমেন্ট যোগ করুন:
Log.d(LOG_TAG, "End SecondActivity");

1.4 অ্যাপটি চলার সাথে সাথে লগটি পর্যবেক্ষণ করুন**

  1. আপনার অ্যাপ চালান।
  2. লগক্যাট ফলকটি দেখানোর জন্য অ্যান্ড্রয়েড স্টুডিওর নীচে লগক্যাট ট্যাবে ক্লিক করুন।
  3. অনুসন্ধান বাক্সে কার্যকলাপ লিখুন. অ্যান্ড্রয়েড লগক্যাট খুব দীর্ঘ এবং বিশৃঙ্খল হতে পারে। যেহেতু প্রতিটি ক্লাসের LOG_TAG ভেরিয়েবলে হয় MainActivity বা SecondActivity শব্দগুলি থাকে, এই কীওয়ার্ডটি আপনাকে শুধুমাত্র আপনার আগ্রহের জিনিসগুলির জন্য লগ ফিল্টার করতে দেয়৷

দ্বিগুণ ঝামেলা

আপনার অ্যাপ ব্যবহার করে পরীক্ষা করুন এবং মনে রাখবেন যে জীবনচক্রের ঘটনাগুলি বিভিন্ন কর্মের প্রতিক্রিয়ায় ঘটে। বিশেষ করে, এই জিনিসগুলি চেষ্টা করুন:

  • অ্যাপটি সাধারণভাবে ব্যবহার করুন (একটি বার্তা পাঠান, অন্য বার্তার সাথে উত্তর দিন)।
  • দ্বিতীয় অ্যাক্টিভিটি থেকে মূল অ্যাক্টিভিটিতে ফিরে যেতে ব্যাক বোতামটি ব্যবহার করুন।
  • দ্বিতীয় অ্যাক্টিভিটি থেকে মূল অ্যাক্টিভিটিতে ফিরে যেতে অ্যাপ বারে উপরের তীরটি ব্যবহার করুন।
  • আপনার অ্যাপে বিভিন্ন সময়ে প্রধান এবং দ্বিতীয় উভয় ক্রিয়াকলাপে ডিভাইসটিকে ঘোরান এবং * লগ এবং স্ক্রিনে কী ঘটছে তা পর্যবেক্ষণ করুন।
  • ওভারভিউ বোতাম টিপুন (হোমের ডানদিকে বর্গাকার বোতাম) এবং অ্যাপটি বন্ধ করুন (এক্সে আলতো চাপুন)।
  • হোম স্ক্রিনে ফিরে যান এবং আপনার অ্যাপটি পুনরায় চালু করুন।

টিপ: আপনি যদি একটি এমুলেটরে আপনার অ্যাপ চালাচ্ছেন, তাহলে আপনি Control+F11 বা Control+Function+F11 দিয়ে ঘূর্ণন অনুকরণ করতে পারেন।

টাস্ক 1 সমাধান কোড

নিম্নলিখিত কোড স্নিপেটগুলি প্রথম কাজের জন্য সমাধান কোড দেখায়।

প্রধান কার্যকলাপ

নিম্নলিখিত কোড স্নিপেটগুলি মেইনঅ্যাক্টিভিটিতে যোগ করা কোড দেখায়, কিন্তু পুরো ক্লাসে নয়।

onCreate() পদ্ধতি:

@Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Log the start of the onCreate() method.
        Log.d(LOG_TAG, "-------");
        Log.d(LOG_TAG, "onCreate");

        // Initialize all the view variables.
        mMessageEditText = findViewById(R.id.editText_main);
        mReplyHeadTextView = findViewById(R.id.text_header_reply);
        mReplyTextView = findViewById(R.id.text_message_reply);
}

অন্যান্য জীবনচক্র পদ্ধতি:

@Override
protected void onStart() {
        super.onStart();
        Log.d(LOG_TAG, "onStart");
}

@Override
protected void onPause() {
        super.onPause();
        Log.d(LOG_TAG, "onPause");
}

@Override
protected void onRestart() {
        super.onRestart();
        Log.d(LOG_TAG, "onRestart");
}

@Override
protected void onResume() {
        super.onResume();
        Log.d(LOG_TAG, "onResume");
}

@Override
protected void onStop() {
        super.onStop();
        Log.d(LOG_TAG, "onStop");
}

@Override
protected void onDestroy() {
        super.onDestroy();
        Log.d(LOG_TAG, "onDestroy");
}

দ্বিতীয় কার্যকলাপ

নিম্নলিখিত কোড স্নিপেট সেকেন্ডঅ্যাক্টিভিটিতে যোগ করা কোড দেখায়, কিন্তু পুরো ক্লাসে নয়।

সেকেন্ড অ্যাক্টিভিটি ক্লাসের শীর্ষে:

private static final String LOG_TAG = SecondActivity.class.getSimpleName();

returnReply() পদ্ধতি:

public void returnReply(View view) {
        String reply = mReply.getText().toString();
        Intent replyIntent = new Intent();
        replyIntent.putExtra(EXTRA_REPLY, reply);
        setResult(RESULT_OK, replyIntent);
        Log.d(LOG_TAG, "End SecondActivity");
        finish();
}

অন্যান্য জীবনচক্র পদ্ধতি:

উপরের MainActivity-এর মতোই।

4. 4. টাস্ক 2: অ্যাক্টিভিটি ইনস্ট্যান্স স্টেট সংরক্ষণ করুন এবং পুনরুদ্ধার করুন

সিস্টেম রিসোর্স এবং ব্যবহারকারীর আচরণের উপর নির্ভর করে, আপনার অ্যাপের প্রতিটি অ্যাক্টিভিটি আপনার ধারণার চেয়ে অনেক বেশি ঘন ঘন ধ্বংস এবং পুনর্গঠিত হতে পারে।

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

প্রতিটি কার্যকলাপের অবস্থা একটি বান্ডেল অবজেক্টে কী/মান জোড়ার সেট হিসাবে সংরক্ষিত হয় যাকে অ্যাক্টিভিটি ইনস্ট্যান্স স্টেট বলা হয়। সিস্টেমটি অ্যাক্টিভিটি বন্ধ হওয়ার ঠিক আগে ইন্সট্যান্স স্টেট বান্ডলে ডিফল্ট স্টেট ইনফরমেশন সেভ করে এবং পুনরুদ্ধার করতে নতুন অ্যাক্টিভিটি ইনস্ট্যান্সে সেই বান্ডিলটি পাস করে।

অপ্রত্যাশিতভাবে ধ্বংস এবং পুনরায় তৈরি করা হলে একটি কার্যকলাপে ডেটা হারানো থেকে বাঁচতে, আপনাকে onSaveInstanceState() পদ্ধতিটি প্রয়োগ করতে হবে। সিস্টেমটি আপনার অ্যাক্টিভিটিতে (onPause() এবং onStop() এর মধ্যে) এই পদ্ধতিটিকে কল করে যখন অ্যাক্টিভিটি ধ্বংস এবং পুনরায় তৈরি হওয়ার সম্ভাবনা থাকে।

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

2.1 onSaveInstanceState() দিয়ে অ্যাক্টিভিটি ইনস্ট্যান্স স্টেট সেভ করুন

আপনি হয়তো লক্ষ্য করেছেন যে ডিভাইসটি ঘোরানো দ্বিতীয় কার্যকলাপের অবস্থাকে মোটেই প্রভাবিত করে না। এর কারণ হল দ্বিতীয় অ্যাক্টিভিটি লেআউট এবং স্টেট তৈরি করা হয় লেআউট থেকে এবং যে ইন্টেন্ট এটিকে সক্রিয় করেছে। এমনকি যদি অ্যাক্টিভিটি পুনরায় তৈরি করা হয়, তবুও ইন্টেন্টটি সেখানেই থাকে এবং প্রতিবার দ্বিতীয় অ্যাক্টিভিটির onCreate() মেথড কল করার সময় সেই ইন্টেন্টের ডেটা এখনও ব্যবহার করা হয়।

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

তাই শুধুমাত্র অ্যাক্টিভিটি স্টেট যেটিতে আপনি আগ্রহী তা হল উত্তর শিরোনামের জন্য টেক্সটভিউ উপাদান এবং মূল অ্যাক্টিভিটির উত্তর পাঠ্য। উভয় TextView উপাদান ডিফল্টরূপে অদৃশ্য; আপনি দ্বিতীয় অ্যাক্টিভিটি থেকে মূল অ্যাক্টিভিটিতে একটি বার্তা পাঠালেই সেগুলি দেখা যায়।

এই টাস্কে আপনি onSaveInstanceState() ব্যবহার করে এই দুটি TextView উপাদানের ইনস্ট্যান্স অবস্থা সংরক্ষণ করতে কোড যোগ করুন।

  1. মেইন অ্যাক্টিভিটি খুলুন।
  2. ক্রিয়াকলাপে onSaveInstanceState() এর এই কঙ্কাল বাস্তবায়ন যোগ করুন, অথবা একটি কঙ্কাল ওভাররাইড সন্নিবেশ করতে কোড > ওভাররাইড পদ্ধতি ব্যবহার করুন।
@Override
public void onSaveInstanceState(Bundle outState) {
          super.onSaveInstanceState(outState);
}
  1. শিরোনামটি বর্তমানে দৃশ্যমান কিনা তা পরীক্ষা করে দেখুন, এবং যদি তাই হয় তাহলে পুটবুলিয়ান() পদ্ধতি এবং "reply_visible" কী দিয়ে স্টেট বান্ডেলে সেই দৃশ্যমান অবস্থাটি রাখুন।
 if (mReplyHeadTextView.getVisibility() == View.VISIBLE) {
        outState.putBoolean("reply_visible", true);
    }

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

  1. একই চেকের ভিতরে, বান্ডেলে উত্তরের পাঠ্য যোগ করুন।
outState.putString("reply_text",mReplyTextView.getText().toString());

হেডারটি দৃশ্যমান হলে আপনি অনুমান করতে পারেন যে উত্তর বার্তাটিও দৃশ্যমান। আপনাকে উত্তর বার্তাটির বর্তমান দৃশ্যমানতার অবস্থা পরীক্ষা বা সংরক্ষণ করার দরকার নেই। "রিপ্লাই_টেক্সট" কী সহ শুধুমাত্র বার্তাটির প্রকৃত পাঠ্যই স্টেট বান্ডিলে যায়।

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

মনে রাখবেন যে সিস্টেমটি কিছু ভিউ উপাদানের অবস্থা সংরক্ষণ করবে, যেমন EditText-এর বিষয়বস্তু।

2.2 onCreate() এ অ্যাক্টিভিটি ইনস্ট্যান্স অবস্থা পুনরুদ্ধার করুন

একবার আপনি অ্যাক্টিভিটি ইন্সট্যান্স স্টেট সেভ করে ফেললে, অ্যাক্টিভিটি রিক্রিয়েট করার সময় আপনাকে এটি পুনরুদ্ধার করতে হবে। আপনি onCreate(), অথবা onRestoreInstanceState() কলব্যাক প্রয়োগ করে এটি করতে পারেন, যা কার্যকলাপ তৈরি হওয়ার পরে onStart() বলা হয়।

বেশিরভাগ সময় কার্যকলাপ অবস্থা পুনরুদ্ধার করার জন্য ভাল জায়গা হল onCreate(), নিশ্চিত করার জন্য যে UI, রাজ্য সহ, যত তাড়াতাড়ি সম্ভব উপলব্ধ। সমস্ত প্রারম্ভিকতা সম্পন্ন হওয়ার পরে এটি onRestoreInstanceState()-এ করা কখনও কখনও সুবিধাজনক হয়, অথবা আপনার ডিফল্ট বাস্তবায়ন ব্যবহার করবেন কিনা তা সিদ্ধান্ত নিতে সাবক্লাসগুলিকে অনুমতি দেওয়া হয়।

  1. onCreate() পদ্ধতিতে, findViewById() দিয়ে ভিউ ভেরিয়েবল শুরু করার পরে, savedInstanceState শূন্য না হয় তা নিশ্চিত করতে একটি পরীক্ষা যোগ করুন।
// Initialize all the view variables.
mMessageEditText = findViewById(R.id.editText_main);
mReplyHeadTextView = findViewById(R.id.text_header_reply);
mReplyTextView = findViewById(R.id.text_message_reply);

// Restore the state.
if (savedInstanceState != null) {
}

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

  1. সেই চেকের ভিতরে, "reply_visible" কী দিয়ে বান্ডেল থেকে বর্তমান দৃশ্যমানতা (সত্য বা মিথ্যা) পান।
if (savedInstanceState != null) {
    boolean isVisible = 
                     savedInstanceState.getBoolean("reply_visible");
}
  1. isVisible ভেরিয়েবলের জন্য আগের লাইনের নিচে একটি পরীক্ষা যোগ করুন।
if (isVisible) {
}

যদি স্টেট বান্ডেলে একটি রিপ্লাই_ভিসিবল কী থাকে (এবং isVisible তাই সত্য), আপনাকে স্টেট পুনরুদ্ধার করতে হবে।

  1. isVisible পরীক্ষার ভিতরে, হেডারটি দৃশ্যমান করুন।
mReplyHeadTextView.setVisibility(View.VISIBLE);
  1. "reply_text" কী সহ বান্ডেল থেকে পাঠ্য উত্তর বার্তা পান এবং সেই স্ট্রিংটি দেখানোর জন্য উত্তর পাঠ্য ভিউ সেট করুন।
mReplyTextView.setText(savedInstanceState.getString("reply_text"));
  1. উত্তর টেক্সটভিউকেও দৃশ্যমান করুন:
mReplyTextView.setVisibility(View.VISIBLE);
  1. অ্যাপটি চালান। অ্যাক্টিভিটি পুনরায় তৈরি হওয়ার পরে উত্তর বার্তাটি (যদি থাকে) স্ক্রিনে থাকে তা নিশ্চিত করতে ডিভাইস বা এমুলেটর ঘোরানোর চেষ্টা করুন।

টাস্ক 2 সমাধান কোড

নিম্নলিখিত কোড স্নিপেটগুলি এই কাজের জন্য সমাধান কোড দেখায়।

প্রধান কার্যকলাপ

নিম্নলিখিত কোড স্নিপেটগুলি মেইনঅ্যাক্টিভিটিতে যোগ করা কোড দেখায়, কিন্তু পুরো ক্লাসে নয়।

onSaveInstanceState() পদ্ধতি:

@Override
public void onSaveInstanceState(Bundle outState) {
   super.onSaveInstanceState(outState);
   // If the heading is visible, message needs to be saved.
   // Otherwise we're still using default layout.
   if (mReplyHeadTextView.getVisibility() == View.VISIBLE) {
       outState.putBoolean("reply_visible", true);
       outState.putString("reply_text", 
                      mReplyTextView.getText().toString());
   }
}

onCreate() পদ্ধতি:

@Override
protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.activity_main);

   Log.d(LOG_TAG, "-------");
   Log.d(LOG_TAG, "onCreate");

   // Initialize all the view variables.
   mMessageEditText = findViewById(R.id.editText_main);
   mReplyHeadTextView = findViewById(R.id.text_header_reply);
   mReplyTextView = findViewById(R.id.text_message_reply);

   // Restore the saved state. 
   // See onSaveInstanceState() for what gets saved.
   if (savedInstanceState != null) {
       boolean isVisible = 
                     savedInstanceState.getBoolean("reply_visible");
       // Show both the header and the message views. If isVisible is
       // false or missing from the bundle, use the default layout.
       if (isVisible) {
           mReplyHeadTextView.setVisibility(View.VISIBLE);
           mReplyTextView.setText(savedInstanceState
                                  .getString("reply_text"));
           mReplyTextView.setVisibility(View.VISIBLE);
       }
   }
}

সম্পূর্ণ প্রকল্প:

অ্যান্ড্রয়েড স্টুডিও প্রজেক্ট: টু অ্যাক্টিভিটি লাইফসাইকেল

5. কোডিং

চ্যালেঞ্জ: ব্যবহারকারী যে তালিকা তৈরি করছেন তার জন্য একটি প্রধান কার্যকলাপ সহ একটি সাধারণ শপিং-লিস্ট অ্যাপ তৈরি করুন এবং সাধারণ কেনাকাটার আইটেমগুলির একটি তালিকার জন্য একটি দ্বিতীয় কার্যকলাপ তৈরি করুন৷

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

একটি ক্রিয়াকলাপ থেকে অন্যটিতে তথ্য প্রেরণ করতে একটি অভিপ্রায় ব্যবহার করুন৷ ব্যবহারকারী ডিভাইসটি ঘোরানোর সময় কেনাকাটার তালিকার বর্তমান অবস্থা সংরক্ষণ করা হয়েছে তা নিশ্চিত করুন।

6. সারাংশ

  • অ্যাক্টিভিটি লাইফসাইকেল হল রাজ্যগুলির একটি সেট একটি অ্যাক্টিভিটি স্থানান্তরিত হয়, যখন এটি প্রথম তৈরি হয় এবং শেষ হয় যখন Android সিস্টেম সেই কার্যকলাপের জন্য সংস্থানগুলি পুনরুদ্ধার করে৷
  • ব্যবহারকারী যখন একটি অ্যাক্টিভিটি থেকে অন্য অ্যাক্টিভিটিতে নেভিগেট করে এবং আপনার অ্যাপের ভিতরে ও বাইরে, প্রতিটি অ্যাক্টিভিটি অ্যাক্টিভিটি লাইফসাইকেলের মধ্যে একটি স্টেটের মধ্যে চলে যায়।
  • অ্যাক্টিভিটি লাইফসাইকেলের প্রতিটি স্টেটের একটি সংশ্লিষ্ট কলব্যাক পদ্ধতি রয়েছে যা আপনি আপনার অ্যাক্টিভিটি ক্লাসে ওভাররাইড করতে পারেন।
  • জীবনচক্র পদ্ধতিগুলি হল onCreate(), onStart(), onPause(), onRestart(), onResume(), onStop(), onDestroy()।
  • একটি লাইফসাইকেল কলব্যাক পদ্ধতি ওভাররাইড করা আপনাকে এমন আচরণ যোগ করতে দেয় যা ঘটে যখন আপনার কার্যকলাপ সেই অবস্থায় রূপান্তরিত হয়।
  • আপনি কোড > ওভাররাইড সহ Android স্টুডিওতে আপনার ক্লাসে কঙ্কাল ওভাররাইড পদ্ধতি যোগ করতে পারেন।
  • ডিভাইসের কনফিগারেশন পরিবর্তন যেমন ঘূর্ণনের ফলে অ্যাক্টিভিটি ধ্বংস হয়ে যায় এবং নতুন করে তৈরি হয়।
  • EditText উপাদানের বর্তমান মান সহ একটি কনফিগারেশন পরিবর্তনে কার্যকলাপ অবস্থার একটি অংশ সংরক্ষণ করা হয়। অন্যান্য সমস্ত ডেটার জন্য, আপনাকে অবশ্যই সেই ডেটা নিজেই সংরক্ষণ করতে হবে৷
  • onSaveInstanceState() পদ্ধতিতে কার্যকলাপ উদাহরণ অবস্থা সংরক্ষণ করুন।
  • ইনস্ট্যান্স স্টেট ডেটা একটি বান্ডেলে সাধারণ কী/মান জোড়া হিসাবে সংরক্ষণ করা হয়। বান্ডেলের মধ্যে ডেটা রাখতে এবং বান্ডেল থেকে ডেটা ফেরত পেতে বান্ডেল পদ্ধতি ব্যবহার করুন।
  • onCreate(), যা পছন্দের উপায়, অথবা onRestoreInstanceState() এ ইনস্ট্যান্স অবস্থা পুনরুদ্ধার করুন। ফিরে