সংরক্ষণ ইনস্ট্যান্স স্টেট ব্যবহার করে Android কার্যকলাপ সংরক্ষণ করা হচ্ছে




android-activity application-state (22)

এখন অ্যান্ড্রয়েড স্টেট সংরক্ষণের জন্য ViewModels সরবরাহ করে , আপনি এটি সংরক্ষণের পরিবর্তে এটি ব্যবহার করার চেষ্টা করা উচিত।

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

package com.android.hello;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class HelloAndroid extends Activity {

  private TextView mTextView = null;

  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    mTextView = new TextView(this);

    if (savedInstanceState == null) {
       mTextView.setText("Welcome to HelloAndroid!");
    } else {
       mTextView.setText("Welcome back.");
    }

    setContentView(mTextView);
  }
}

আমি মনে করি এটি সহজতম ক্ষেত্রে যথেষ্ট হবে, তবে এটি সর্বদা প্রথম বার্তার সাথে প্রতিক্রিয়া জানায়, আমি কোনও অ্যাপ্লিকেশান থেকে নেভিগেট করি না কেন।

আমি নিশ্চিত যে সমাধানটি ওভাররাইড করার মতো সহজ এবং কিছুটা ওভাররাইড করা, তবে আমি 30 মিনিট বা তারও বেশি সময় নথিভুক্ত করে ফেলেছি এবং কিছু সুস্পষ্ট খুঁজে পাইনি।


এখান থেকে একটি মন্তব্য স্টিভ Moseley এর উত্তর (দ্বারা ToolmakerSteve ) যে দৃষ্টিকোণ মধ্যে জিনিষ রাখে (পুরো onSaveInstanceState বনাম onPause সালে পূর্ব খরচ বনাম পশ্চিমে খরচ কাহিনী)

@ ভিভিকে - আমি আংশিকভাবে অসম্মতি জানাই। একটি অ্যাপ্লিকেশন থেকে বেরিয়ে যাওয়ার কিছু উপায়গুলি স্যাসইনস্টেন্স স্ট্যাটে (ওএসআইএস) ট্রিগার হয় না। এই osis এর উপযোগিতা ব্যবহার সীমাবদ্ধ। ন্যূনতম OS সংস্থানগুলির জন্য এটি সমর্থনযোগ্য, তবে কোনও অ্যাপ্লিকেশানটি ব্যবহারকারীকে রাষ্ট্রের কাছে ফেরত দিতে চায় তবে অ্যাপটি কীভাবে বেরিয়ে এসেছে তা কোন ব্যাপার না, পরিবর্তে একটি স্থায়ী স্টোরেজ পদ্ধতি ব্যবহার করা প্রয়োজন। আমি বান্ডিল চেক করতে ক্রিয়েটিভ ব্যবহার করি, এবং এটি অনুপস্থিত থাকলে, স্থায়ী সঞ্চয়স্থান চেক করুন এই সিদ্ধান্ত গ্রহণ centralizes। আমি একটি ক্র্যাশ, বা ব্যাক বাটন প্রস্থান বা কাস্টম মেনু আইটেম প্রস্থান থেকে পুনরুদ্ধার করতে পারেন, অথবা স্ক্রিন ব্যবহারকারী ফিরে পেতে অনেক দিন পরে ছিল। - ToolmakerSteve 19 সেপ্টেম্বর 15 '10:38 এ


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

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

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


আমার সমস্যা ছিল যে আবেদনপত্রের জীবনকালের সময়ই আমার দৃঢ়তা প্রয়োজন (অর্থাৎ একই অ্যাপের মধ্যে অন্য উপ-ক্রিয়াকলাপগুলি শুরু করে এবং যন্ত্রটি ঘুরানো ইত্যাদি সহ একক মৃত্যুদণ্ড)। আমি উপরে উত্তর বিভিন্ন সমন্বয় চেষ্টা কিন্তু সব পরিস্থিতিতে আমি চেয়েছিলেন কি না। অবশেষে আমার জন্য কী কাজ করেছে savedInstanceState এ একটি রেফারেন্স প্রাপ্ত করার সময় Create:

mySavedInstanceState=savedInstanceState;

এবং আমার ভেরিয়েবলের সামগ্রীগুলি পেতে যখন এটির প্রয়োজন হয় তখন সেগুলি ব্যবহার করুন:

if (mySavedInstanceState !=null) {
   boolean myVariable = mySavedInstanceState.getBoolean("MyVariable");
}

আমি ব্যবহার onSaveInstanceStateএবং onRestoreInstanceStateউপরে প্রস্তাব হিসাবে কিন্তু আমি অনুমান করেছি যে পরিবর্তনশীল যখন পরিবর্তনশীল সংরক্ষণ করতে আমি আমার পদ্ধতি ব্যবহার করতে পারি (যেমন ব্যবহার putBoolean)


একটি কার্যকলাপ recreating

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

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

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

সিস্টেমটি আপনার ক্রিয়াকলাপ বন্ধ করতে শুরু করে, এটি onSaveInstanceState() (1) এ কল করে যাতে আপনি অতিরিক্ত রাষ্ট্র ডেটা নির্দিষ্ট করতে পারেন যা আপনি সংরক্ষণ করতে চান তবে কার্যকলাপের উদাহরণটি পুনঃনির্মাণ করা উচিত। যদি ক্রিয়াকলাপটি ধ্বংস হয়ে যায় এবং একই দৃষ্টান্ত পুনঃনির্মিত করতে হয়, তবে সিস্টেমটি (1) onCreate() পদ্ধতিতে (2) এবং onRestoreInstanceState() পদ্ধতি (3) উভয়ের জন্য নির্ধারিত রাষ্ট্রের ডেটা পাস করে।

আপনার Activity রাজ্য সংরক্ষণ করুন

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

আপনার কার্যকলাপের জন্য অতিরিক্ত রাষ্ট্রীয় তথ্য সংরক্ষণ করার জন্য, আপনাকে অবশ্যই onSaveInstanceState() প্রয়োগ করতে হবে এবং বান্ডেল অবজেক্টের কী-মান জোড়া যুক্ত করতে হবে। উদাহরণ স্বরূপ:

  static final String STATE_SCORE = "playerScore";
  static final String STATE_LEVEL = "playerLevel";

  @Override
  public void onSaveInstanceState(Bundle savedInstanceState) {
  // Save the user's current game state
  savedInstanceState.putInt(STATE_SCORE, mCurrentScore);
  savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);

  // Always call the superclass so it can save the view hierarchy state
  super.onSaveInstanceState(savedInstanceState);
}

সাবধান: সর্বদা onSaveInstanceState() এর সুপারক্লাস বাস্তবায়ন কল করুন যাতে ডিফল্ট বাস্তবায়ন দৃশ্য অনুক্রমের অবস্থা সংরক্ষণ করতে পারে।

আপনার Activity অবস্থা পুনরুদ্ধার করুন

যখন আপনার ক্রিয়াকলাপটি পূর্বে ধ্বংস হয়ে যাওয়ার পরে পুনঃপ্রতিষ্ঠিত হয়, তখন আপনি আপনার সংরক্ষিত রাষ্ট্রটি বান্ডেল থেকে পুনরুদ্ধার করতে পারেন যে সিস্টেমটি আপনার কার্যকলাপ পাস করে। onRestoreInstanceState() onCreate() এবং onRestoreInstanceState() কলব্যাক পদ্ধতিগুলি একই onRestoreInstanceState() ধারণ করে যা দৃষ্টান্তের তথ্য তথ্য ধারণ করে।

কারণ onCreate() পদ্ধতিটি বলা হয় যে সিস্টেমটি আপনার কার্যকলাপের একটি নতুন উদাহরণ তৈরি করছে কিনা বা পূর্ববর্তীটি পুনঃস্থাপন করছে কিনা, আপনি এটি পড়ার চেষ্টা করার আগে রাষ্ট্র বান্ডেলটি নিল কিনা তা যাচাই করতে হবে। যদি এটি নাল হয় তবে সিস্টেমটি ধ্বংস হয়ে যাওয়া পূর্ববর্তী পুনরুদ্ধারের পরিবর্তে কার্যকলাপের একটি নতুন উদাহরণ তৈরি করছে।

উদাহরণস্বরূপ, এখানে আপনি onCreate() কিছু রাষ্ট্রের তথ্য পুনরুদ্ধার করতে পারেন:

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState); // Always call the superclass first

 // Check whether we're recreating a previously destroyed instance
 if (savedInstanceState != null) {
    // Restore value of members from saved state
    mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
    mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
 } else {
    // Probably initialize members with default values for a new instance
 }

 }

onRestoreInstanceState() সময় রাষ্ট্রটি পুনরুদ্ধার করার পরিবর্তে আপনি onRestoreInstanceState() , যা সিস্টেমে onRestoreInstanceState() পদ্ধতির পরে কল করার জন্য চয়ন করতে পারেন। সিস্টেমে পুনরুদ্ধারের জন্য সংরক্ষণ করা অবস্থায় থাকলে কেবল onRestoreInstanceState() কল করে, তাই আপনার onRestoreInstanceState() কিনা তা পরীক্ষা করার প্রয়োজন নেই:

  public void onRestoreInstanceState(Bundle savedInstanceState) {
  // Always call the superclass so it can restore the view hierarchy
  super.onRestoreInstanceState(savedInstanceState);

  // Restore state members from saved instance
  mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
  mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
}

কোটলিন কোড:

সংরক্ষণ করুন:

override fun onSaveInstanceState(outState: Bundle) {
    super.onSaveInstanceState(outState.apply {
        putInt("intKey", 1)
        putString("stringKey", "String Value")
        putParcelable("parcelableKey", parcelableObject)
    })
}

এবং তারপর onCreate()বাonRestoreInstanceState()

    val restoredInt = savedInstanceState?.getInt("intKey") ?: 1 //default int
    val restoredString = savedInstanceState?.getString("stringKey") ?: "default string"
    val restoredParcelable = savedInstanceState?.getParcelable<ParcelableClass>("parcelableKey") ?: ParcelableClass() //default parcelable

আপনি বিকল্প আছে না চান তাহলে ডিফল্ট মান যোগ করুন


এই পরিবর্তন বাস্তবায়নের মূলত দুটি উপায় আছে।

  1. ব্যবহার onSaveInstanceState()এবং onRestoreInstanceState()
  2. ম্যানিফেস্টে android:configChanges="orientation|screenSize"

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

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

উদাহরণ: জেসন অবজেক্টটি চালিয়ে যেতে চান এমন একটি কেস বিবেচনা করুন। Getters এবং setters সঙ্গে একটি মডেল বর্গ তৈরি করুন।

class MyModel extends Serializable{
JSONObject obj;

setJsonObject(JsonObject obj)
{
this.obj=obj;
}

JSONObject getJsonObject()
return this.obj;
} 
}

এখন আপনার ক্রিয়েটিভ এবং onSaveInstanceState পদ্ধতিতে নিম্নলিখিত কাজ করুন। এটি এমন কিছু দেখতে পাবে:

@override
onCreate(Bundle savedInstaceState){
MyModel data= (MyModel)savedInstaceState.getSerializable("yourkey")
JSONObject obj=data.getJsonObject();
//Here you have retained JSONObject and can use.
}


@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
//Obj is some json object 
MyModel dataToSave= new MyModel();
dataToSave.setJsonObject(obj);
oustate.putSerializable("yourkey",dataToSave); 

}

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

আরো দীর্ঘস্থায়ী রাষ্ট্রের জন্য, একটি SQLite ডাটাবেস, একটি ফাইল, বা পছন্দগুলি ব্যবহার করে বিবেচনা করুন। স্থায়ী রাষ্ট্র সংরক্ষণ দেখুন।


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

এটার মতো কিছু:

import java.util.Date;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class dataHelper {

    private static final String DATABASE_NAME = "autoMate.db";
    private static final int DATABASE_VERSION = 1;

    private Context context;
    private SQLiteDatabase db;
    private OpenHelper oh ;

    public dataHelper(Context context) {
        this.context = context;
        this.oh = new OpenHelper(this.context);
        this.db = oh.getWritableDatabase();
    }

    public void close()
    {
        db.close();
        oh.close();
        db = null;
        oh = null;
        SQLiteDatabase.releaseMemory();
    }


    public void setCode(String codeName, Object codeValue, String codeDataType)
    {
        Cursor codeRow = db.rawQuery("SELECT * FROM code WHERE codeName = '"+  codeName + "'", null);
        String cv = "" ;

        if (codeDataType.toLowerCase().trim().equals("long") == true)
        {
            cv = String.valueOf(codeValue);
        }
        else if (codeDataType.toLowerCase().trim().equals("int") == true)
        {
            cv = String.valueOf(codeValue);
        }
        else if (codeDataType.toLowerCase().trim().equals("date") == true)
        {
            cv = String.valueOf(((Date)codeValue).getTime());
        }
        else if (codeDataType.toLowerCase().trim().equals("boolean") == true)
        {
            String.valueOf(codeValue);
        }
        else
        {
            cv = String.valueOf(codeValue);
        }

        if(codeRow.getCount() > 0) //exists-- update
        {
            db.execSQL("update code set codeValue = '" + cv +
                "' where codeName = '" + codeName + "'");
        }
        else // does not exist, insert
        {
            db.execSQL("INSERT INTO code (codeName, codeValue, codeDataType) VALUES(" +
                    "'" + codeName + "'," +
                    "'" + cv + "'," +
                    "'" + codeDataType + "')" );
        }
    }

    public Object getCode(String codeName, Object defaultValue)
    {
        //Check to see if it already exists
        String codeValue = "";
        String codeDataType = "";
        boolean found = false;
        Cursor codeRow  = db.rawQuery("SELECT * FROM code WHERE codeName = '"+  codeName + "'", null);
        if (codeRow.moveToFirst())
        {
            codeValue = codeRow.getString(codeRow.getColumnIndex("codeValue"));
            codeDataType = codeRow.getString(codeRow.getColumnIndex("codeDataType"));
            found = true;
        }

        if (found == false)
        {
            return defaultValue;
        }
        else if (codeDataType.toLowerCase().trim().equals("long") == true)
        {
            if (codeValue.equals("") == true)
            {
                return (long)0;
            }
            return Long.parseLong(codeValue);
        }
        else if (codeDataType.toLowerCase().trim().equals("int") == true)
        {
            if (codeValue.equals("") == true)
            {
                return (int)0;
            }
            return Integer.parseInt(codeValue);
        }
        else if (codeDataType.toLowerCase().trim().equals("date") == true)
        {
            if (codeValue.equals("") == true)
            {
                return null;
            }
            return new Date(Long.parseLong(codeValue));
        }
        else if (codeDataType.toLowerCase().trim().equals("boolean") == true)
        {
            if (codeValue.equals("") == true)
            {
                return false;
            }
            return Boolean.parseBoolean(codeValue);
        }
        else
        {
            return (String)codeValue;
        }
    }


    private static class OpenHelper extends SQLiteOpenHelper {

        OpenHelper(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL("CREATE TABLE IF  NOT EXISTS code" +
            "(id INTEGER PRIMARY KEY, codeName TEXT, codeValue TEXT, codeDataType TEXT)");
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        }
    }
}

যে পরে একটি সহজ কল

dataHelper dh = new dataHelper(getBaseContext());
String status = (String) dh.getCode("appState", "safetyDisabled");
Date serviceStart = (Date) dh.getCode("serviceStartTime", null);
dh.close();
dh = null;

onSaveInstanceState()অস্থায়ী তথ্য (মধ্যে পুনরুদ্ধার জন্য onCreate()/ onRestoreInstanceState()), onPause()ক্রমাগত ডেটার জন্য (মধ্যে পুনরুদ্ধার onResume())। অ্যান্ড্রয়েড প্রযুক্তিগত সংস্থান থেকে:

OnSaveInstanceState () অ্যানড্রইড দ্বারা ক্রিয়াকলাপ করা হয় যদি ক্রিয়াকলাপ বন্ধ করা হয় এবং এটি পুনরায় শুরু হওয়ার আগেই মারা যেতে পারে! এর অর্থ হল কার্যকলাপটি পুনঃসূচনা করার সময় একই অবস্থায় পুনরায় সূচনা করার জন্য প্রয়োজনীয় যে কোনও রাষ্ট্র সংরক্ষণ করা উচিত। এটি onCreate () পদ্ধতির সমতুল্য এবং প্রকৃতপক্ষে savedInstanceState বান্ডেলটি ক্রিয়েট () -এ পাস করা একই বান্ডেল যা আপনি OnSaveInstanceState () পদ্ধতিতে আউটস্টেট হিসাবে তৈরি করেছেন।

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


onSaveInstanceState(bundle)এবং onRestoreInstanceState(bundle)পদ্ধতি ডাটা অধ্যবসায় স্ক্রিন (স্থিতিবিন্যাস পরিবর্তন) আবর্তিত নিছক কিছুদিনের জন্য দরকারী।
তারা অ্যাপ্লিকেশন একটি থেকে অন্যটিতে পরিবর্তন (যেহেতু সময় এমনকি ভাল হয় না onSaveInstanceState()পদ্ধতি বলা হয় কিন্তু onCreate(bundle)onRestoreInstanceState(bundle)আবার প্রার্থনা করা হয় না।
আরো অধ্যবসায় ব্যবহার ভাগ পছন্দগুলি জন্য। এই নিবন্ধটি পড়তে


উভয় পদ্ধতি দরকারী এবং বৈধ এবং উভয় বিভিন্ন পরিস্থিতিতে জন্য উপযুক্ত উপযুক্ত:

  1. ব্যবহারকারীটি অ্যাপ্লিকেশনটি শেষ করে এবং পরের তারিখে এটি পুনরায় খুলতে পারে তবে অ্যাপ্লিকেশনটিকে শেষ সেশনের ডেটা পুনরায় লোড করতে হবে - এটিতে SQLite ব্যবহার করার মতো একটি স্থায়ী স্টোরেজ পদ্ধতির প্রয়োজন।
  2. ব্যবহারকারী অ্যাপ্লিকেশনটি স্যুইচ করে এবং তারপরে আসলটিতে ফিরে আসে এবং যেখানে তারা ছেড়ে চলে যায় সেগুলি চয়ন করতে চায় - onSaveInstanceState() এবং onRestoreInstanceState() বান্ডেল ডেটা (যেমন অ্যাপ্লিকেশন স্টেট ডেটা) সংরক্ষণ এবং পুনরুদ্ধার করতে সাধারণত যথেষ্ট।

যদি আপনি স্থিরভাবে রাষ্ট্রীয় তথ্য সংরক্ষণ করেন তবে এটি একটি onResume() অথবা অন onCreate() বা প্রকৃতপক্ষে কোন onCreate() কলটিতে পুনরায় লোড করা যেতে পারে। এই হতে পারে বা পছন্দসই আচরণ হতে পারে না। আপনি যদি InstanceState একটি বান্ডলে এটি সংরক্ষণ করেন তবে এটি ক্ষণস্থায়ী এবং একই ব্যবহারকারীর সেশনে ব্যবহারের জন্য ডেটা সংরক্ষণের জন্য শুধুমাত্র উপযুক্ত (আমি সেশনের শব্দটি ব্যবহার করি) তবে 'সেশন' এর মধ্যে নয়।

এটি এমন নয় যে একরকমটি অন্যরকমের তুলনায় ভাল, সবকিছু ঠিক যেমন, আপনার কী আচরণ প্রয়োজন এবং বোঝার জন্য সবচেয়ে উপযুক্ত পদ্ধতিটি নির্বাচন করা ঠিক।


Boilerplate কমানোর জন্য আমি নিম্নলিখিত ব্যবহার interfaceএবং সংরক্ষণ উদাহরণ অবস্থা জন্য classএকটি পড়তে / লিখুন Bundle

প্রথমে, আপনার ইন্টারফেস ভেরিয়েবলগুলিকে টীকা দেওয়ার জন্য ব্যবহার করা একটি ইন্টারফেস তৈরি করুন:

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({
        ElementType.FIELD
})
public @interface SaveInstance {

}

তারপরে, একটি বর্গ তৈরি করুন যেখানে বান্ডেলের মানগুলি সংরক্ষণ করতে প্রতিফলন ব্যবহার করা হবে:

import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.os.Parcelable;
import android.util.Log;

import java.io.Serializable;
import java.lang.reflect.Field;

/**
 * Save and load fields to/from a {@link Bundle}. All fields should be annotated with {@link
 * SaveInstance}.</p>
 */
public class Icicle {

    private static final String TAG = "Icicle";

    /**
     * Find all fields with the {@link SaveInstance} annotation and add them to the {@link Bundle}.
     *
     * @param outState
     *         The bundle from {@link Activity#onSaveInstanceState(Bundle)} or {@link
     *         Fragment#onSaveInstanceState(Bundle)}
     * @param classInstance
     *         The object to access the fields which have the {@link SaveInstance} annotation.
     * @see #load(Bundle, Object)
     */
    public static void save(Bundle outState, Object classInstance) {
        save(outState, classInstance, classInstance.getClass());
    }

    /**
     * Find all fields with the {@link SaveInstance} annotation and add them to the {@link Bundle}.
     *
     * @param outState
     *         The bundle from {@link Activity#onSaveInstanceState(Bundle)} or {@link
     *         Fragment#onSaveInstanceState(Bundle)}
     * @param classInstance
     *         The object to access the fields which have the {@link SaveInstance} annotation.
     * @param baseClass
     *         Base class, used to get all superclasses of the instance.
     * @see #load(Bundle, Object, Class)
     */
    public static void save(Bundle outState, Object classInstance, Class<?> baseClass) {
        if (outState == null) {
            return;
        }
        Class<?> clazz = classInstance.getClass();
        while (baseClass.isAssignableFrom(clazz)) {
            String className = clazz.getName();
            for (Field field : clazz.getDeclaredFields()) {
                if (field.isAnnotationPresent(SaveInstance.class)) {
                    field.setAccessible(true);
                    String key = className + "#" + field.getName();
                    try {
                        Object value = field.get(classInstance);
                        if (value instanceof Parcelable) {
                            outState.putParcelable(key, (Parcelable) value);
                        } else if (value instanceof Serializable) {
                            outState.putSerializable(key, (Serializable) value);
                        }
                    } catch (Throwable t) {
                        Log.d(TAG, "The field '" + key + "' was not added to the bundle");
                    }
                }
            }
            clazz = clazz.getSuperclass();
        }
    }

    /**
     * Load all saved fields that have the {@link SaveInstance} annotation.
     *
     * @param savedInstanceState
     *         The saved-instance {@link Bundle} from an {@link Activity} or {@link Fragment}.
     * @param classInstance
     *         The object to access the fields which have the {@link SaveInstance} annotation.
     * @see #save(Bundle, Object)
     */
    public static void load(Bundle savedInstanceState, Object classInstance) {
        load(savedInstanceState, classInstance, classInstance.getClass());
    }

    /**
     * Load all saved fields that have the {@link SaveInstance} annotation.
     *
     * @param savedInstanceState
     *         The saved-instance {@link Bundle} from an {@link Activity} or {@link Fragment}.
     * @param classInstance
     *         The object to access the fields which have the {@link SaveInstance} annotation.
     * @param baseClass
     *         Base class, used to get all superclasses of the instance.
     * @see #save(Bundle, Object, Class)
     */
    public static void load(Bundle savedInstanceState, Object classInstance, Class<?> baseClass) {
        if (savedInstanceState == null) {
            return;
        }
        Class<?> clazz = classInstance.getClass();
        while (baseClass.isAssignableFrom(clazz)) {
            String className = clazz.getName();
            for (Field field : clazz.getDeclaredFields()) {
                if (field.isAnnotationPresent(SaveInstance.class)) {
                    String key = className + "#" + field.getName();
                    field.setAccessible(true);
                    try {
                        Object fieldVal = savedInstanceState.get(key);
                        if (fieldVal != null) {
                            field.set(classInstance, fieldVal);
                        }
                    } catch (Throwable t) {
                        Log.d(TAG, "The field '" + key + "' was not retrieved from the bundle");
                    }
                }
            }
            clazz = clazz.getSuperclass();
        }
    }

}

উদাহরণ ব্যবহার:

public class MainActivity extends Activity {

    @SaveInstance
    private String foo;

    @SaveInstance
    private int bar;

    @SaveInstance
    private Intent baz;

    @SaveInstance
    private boolean qux;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Icicle.load(savedInstanceState, this);
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        Icicle.save(outState, this);
    }

}

দ্রষ্টব্য: এই কোডটি AndroidAutowire নামে একটি লাইব্রেরী প্রকল্প থেকে গৃহীত হয়েছিল যা এমআইটি লাইসেন্সের অধীনে লাইসেন্সযুক্ত


আমি মনে করি আমি উত্তর পেয়েছি। আমাকে সহজ ভাষায় কী বলা হয়েছে তা বলতে দাও:

ধরুন আমার দুটি ক্রিয়াকলাপ আছে, activity1 এবং activity2 এবং আমি activity1 থেকে activity2 এ নেভিগেট করছি (ক্রিয়াকলাপে কিছু কাজ করেছি 2) এবং কার্যকলাপ 1 এর বোতামে ক্লিক করে আবার কার্যকলাপ 1 এ ফিরে আসি। এখন এই পর্যায়ে আমি কার্যকলাপ 2 এ ফিরে যেতে চেয়েছিলাম এবং আমি আমার কার্যকলাপ 2 দেখতে চাই যখন একই কাজটি শেষ করেছিলাম ২।

উপরের দৃশ্যের জন্য আমি যা করেছি তা হল ম্যানিফেস্টে আমি এই রকম কিছু পরিবর্তন করেছি:

<activity android:name=".activity2"
          android:alwaysRetainTaskState="true"      
          android:launchMode="singleInstance">
</activity>

এবং Activity1 এ বোতামে ক্লিক করুন ইভেন্টটি আমি এভাবে করেছি:

Intent intent = new Intent();
intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
intent.setClassName(this,"com.mainscreen.activity2");
startActivity(intent);

এবং কার্যকলাপ 2 বোতামে ক্লিক করুন ইভেন্টটি আমি এই রকম করেছি:

Intent intent=new Intent();
intent.setClassName(this,"com.mainscreen.activity1");
startActivity(intent);

এখন কী ঘটবে তা হল, আমরা যে ক্রিয়াকলাপটি করেছি সেটি 2 নষ্ট হবে না, এবং আমরা একই অবস্থাতে activity2 দেখতে পারি যা আমরা আগে রেখেছি।

আমি বিশ্বাস করি এই উত্তরটি এবং এটি আমার জন্য ভাল কাজ করে। আমি ভুল হলে আমাকে সংশোধন করুন।


যখন একটি কার্যকলাপ তৈরি হয় তখন এটি ক্র্যাক () পদ্ধতি বলা হয়।

   @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

savedInstanceState হল বান্ডেল ক্লাসের একটি অবজেক্ট যা প্রথমবারের জন্য নিল, তবে এটি পুনঃনির্মিত হওয়ার সময় মানগুলি থাকে। কার্যকলাপের অবস্থা সংরক্ষণ করার জন্য আপনাকে সেভইনস্ট্যান্সস্টেট () -এ ওভাররাইড করতে হবে।

   @Override
    protected void onSaveInstanceState(Bundle outState) {
      outState.putString("key","Welcome Back")
        super.onSaveInstanceState(outState);       //save state
    }

outstate.putString ("কী", "স্বাগতম ব্যাক") এবং সুপার কল করে সংরক্ষণ করুন আপনার মানগুলিকে "আউটস্টেট" বান্ডেল বস্তুর মধ্যে রাখুন। যখন ক্রিয়াকলাপটি নষ্ট হয়ে যাবে তখন এটি রাষ্ট্র বান্ডেল বস্তুর মধ্যে সংরক্ষিত হবে এবং RecreateCreate () অথবাRestoreInstanceState () এ বিনোদন পরে পুনরুদ্ধার করা যেতে পারে। ক্রিয়েট () এবং অন রিস্টোরেইন ইনস্ট্যান্স স্ট্যাটে প্রাপ্ত বান্ডিল একই।

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

          //restore activity's state
         if(savedInstanceState!=null){
          String reStoredString=savedInstanceState.getString("key");
            }
    }

অথবা

  //restores activity's saved state
 @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
      String restoredMessage=savedInstanceState.getString("key");
    }

onSaveInstanceকার্যকলাপ ব্যাকগ্রাউন্ড যায় যখন প্রকৃতপক্ষে রাষ্ট্র আহ্বান

ডক্স থেকে উদ্ধৃতি: "পদ্ধতিটি onSaveInstanceState(Bundle)এমন একটি ব্যাকগ্রাউন্ড অবস্থায় ক্রিয়াকলাপ স্থাপন করার আগে বলা হয়"


এদিকে আমি সাধারণভাবে কোন ব্যবহার না

Bundle savedInstanceState & Co

লাইভ চক্র অত্যন্ত জটিল এবং প্রয়োজনীয় নয় অধিকাংশ কার্যক্রমের জন্য। এবং গুগল নিজেই রাজ্যের, এটা এমনকি নির্ভরযোগ্য নয়।

আমার উপায় পছন্দ মধ্যে অবিলম্বে কোনো পরিবর্তন সংরক্ষণ করা হয়

 SharedPreferences p;
 p.edit().put(..).commit()

কিছু উপায়ে ভাগ করা উপস্থাপনাগুলি বান্ডলগুলির মতই কাজ করে। এবং স্বাভাবিকভাবেই এবং প্রথম এই ধরনের মান পছন্দ থেকে লাল হতে হবে।

জটিল তথ্য ক্ষেত্রে আপনি পছন্দগুলি ব্যবহারের পরিবর্তে স্লাইট ব্যবহার করতে পারেন।

এই ধারণাটি প্রয়োগ করার সময়, কার্যকলাপটি কেবলমাত্র শেষ সংরক্ষিত অবস্থায় ব্যবহার করা অব্যাহত থাকে, নির্বিশেষে এটি পিছনে স্ট্যাকের মধ্যে পুনরায় বুট করা বা পুনরায় খুলার সাথে একটি প্রাথমিক খোলা ছিল কিনা তা নির্বিশেষে।


আপনার প্রকল্পের লাইভডেটা (অ্যান্ড্রয়েড আর্কিটেকচার কম্পোনেন্ট) যোগ করা হচ্ছে

নিম্নলিখিত নির্ভরতা যোগ করুন

implementation "android.arch.lifecycle:extensions:1.1.0"

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

private TextView mTextView;
private MutableLiveData<String> mMutableLiveData;

@Override
protected void onCreate(Bundle savedInstanceState) {
    mTextView = (TextView) findViewById(R.id.textView);
    mMutableLiveData = new MutableLiveData<>();
    mMutableLiveData.observe(this, new Observer<String>() {
        @Override
        public void onChanged(@Nullable String s) {
            mTextView.setText(s);
        }
    });

}

সরাসরি মূল প্রশ্নের উত্তর দিতে। savedInstancestate নল কারণ আপনার কার্যকলাপ পুনরায় তৈরি করা হয় না।

আপনার কার্যকলাপ শুধুমাত্র একটি রাষ্ট্র বান্ডিল সঙ্গে পুনরায় তৈরি করা হবে যখন:

  • কনফিগারেশন পরিবর্তন যেমন অভিযোজন বা ফোন ভাষা পরিবর্তন যা নতুন কার্যকলাপের উদাহরণ তৈরি করতে হতে পারে।
  • OS এর কার্যকলাপটি ধ্বংস করার পরে আপনি ব্যাকগ্রাউন্ড থেকে অ্যাপ্লিকেশানে ফিরে যান।

মেমরি চাপ অধীনে বা তারা একটি বর্ধিত সময়ের জন্য পটভূমিতে হয়েছে পরে অ্যান্ড্রয়েড ব্যাকগ্রাউন্ড কার্যক্রম ধ্বংস করবে।

আপনার হ্যালো বিশ্ব উদাহরণ পরীক্ষার সময় ছেড়ে চলে যাওয়ার এবং কার্যকলাপে ফিরে যাওয়ার কয়েকটি উপায় রয়েছে।

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

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

সেটিংস -> বিকাশকারীদের বিকল্পগুলির অধীনে একটি বিকল্প রয়েছে "ক্রিয়াকলাপগুলি রাখুন না"। যখন এটি সক্ষম হয় তখন Android সর্বদা ক্রিয়াকলাপগুলি ধ্বংস করে এবং যখন তারা ব্যাকগ্রাউন্ড হয় তখন তাদের পুনঃস্থাপন করবে। উন্নয়নশীল যখন এটি সক্রিয় করার জন্য একটি দুর্দান্ত বিকল্প, এটি সবচেয়ে খারাপ কেস দৃশ্যকল্প simulates। (একটি কম মেমরি ডিভাইস সব সময় আপনার কার্যক্রম পুনর্ব্যবহারযোগ্য)।

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


সিস্টেমে মেমরি প্রয়োজন এবং একটি অ্যাপ্লিকেশন হত্যা যখন onSaveInstanceState বলা হয়। ব্যবহারকারী শুধুমাত্র অ্যাপ্লিকেশন বন্ধ যখন এটি বলা হয় না। তাই আমি মনে করি অ্যাপ্লিকেশন রাষ্ট্রটিও এতে সংরক্ষণ করা উচিত কারণ এটি Preferences বা Sqlite কিছু স্থায়ী স্টোরেজে সংরক্ষণ করা উচিত


আপনি onSaveInstanceState(Bundle savedInstanceState) ওভাররাইড করতে হবে এবং অ্যাপ্লিকেশন স্টেট মানগুলি লিখতে চান যা আপনি onSaveInstanceState(Bundle savedInstanceState) প্যারামিটারে পরিবর্তন করতে চান:

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
  super.onSaveInstanceState(savedInstanceState);
  // Save UI state changes to the savedInstanceState.
  // This bundle will be passed to onCreate if the process is
  // killed and restarted.
  savedInstanceState.putBoolean("MyBoolean", true);
  savedInstanceState.putDouble("myDouble", 1.9);
  savedInstanceState.putInt("MyInt", 1);
  savedInstanceState.putString("MyString", "Welcome back to Android");
  // etc.
}

বান্ডেল মূলত একটি NVP ("নাম-মূল্য জোড়া") ম্যাপ সংরক্ষণ করার একটি উপায়, এবং এটি onRestoreInstanceState() এবং এছাড়াও onRestoreInstanceState() যেখানে আপনি এর মতো মানগুলি বের করতে চাইবেন:

@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
  super.onRestoreInstanceState(savedInstanceState);
  // Restore UI state from the savedInstanceState.
  // This bundle has also been passed to onCreate.
  boolean myBoolean = savedInstanceState.getBoolean("MyBoolean");
  double myDouble = savedInstanceState.getDouble("myDouble");
  int myInt = savedInstanceState.getInt("MyInt");
  String myString = savedInstanceState.getString("MyString");
}

আপনি সাধারণত আপনার অ্যাপ্লিকেশন (নির্বাচন, অসংরক্ষিত পাঠ্য, ইত্যাদি) জন্য ইনস্ট্যান্স মান সংরক্ষণ করতে এই কৌশলটি ব্যবহার করবেন।


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

Icepick সঙ্গে এই মত কিছু করছেন:

class MainActivity extends Activity {
  @State String username; // These will be automatically saved and restored
  @State String password;
  @State int age;

  @Override public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Icepick.restoreInstanceState(this, savedInstanceState);
  }

  @Override public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    Icepick.saveInstanceState(this, outState);
  }
}

এই কাজ হিসাবে একই হয়:

class MainActivity extends Activity {
  String username;
  String password;
  int age;

  @Override
  public void onSaveInstanceState(Bundle savedInstanceState) {
    super.onSaveInstanceState(savedInstanceState);
    savedInstanceState.putString("MyString", username);
    savedInstanceState.putString("MyPassword", password);
    savedInstanceState.putInt("MyAge", age); 
    /* remember you would need to actually initialize these variables before putting it in the
    Bundle */
  }

  @Override
  public void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    username = savedInstanceState.getString("MyString");
    password = savedInstanceState.getString("MyPassword");
    age = savedInstanceState.getInt("MyAge");
  }
}

Icepick যে কোনও বস্তুর সাথে কাজ করবে যা এটির সাথে একটি রাষ্ট্র সংরক্ষণ করে Bundle







application-state