কিভাবে সেভডইন্সট্যান্স স্টেট ব্যবহার করবেন উদাহরণস্বরূপ


110

রাষ্ট্রের সংরক্ষণের বিষয়টি নেমে আসলে আমি বিভ্রান্ত হয়ে পড়েছি। তাই আমি জানি যে onSaveInstanceState(Bundle)ক্রিয়াকলাপটি ধ্বংস হতে চলেছে called তবে কীভাবে আপনি এতে আপনার তথ্য সংরক্ষণ করবেন এবং এটিকে আবার তার আসল অবস্থায় ফিরিয়ে আনবেন onCreate(Bundle savedInstanceState)? আমি বুঝতে পারি না যে এই বান্ডিলটি কীভাবে তথ্য পুনরুদ্ধার করবে। যদি কেউ উদাহরণ দিতে পারে তবে এটি সহায়ক হবে। দেব গাইড এটি ব্যাখ্যা করার জন্য ভাল কাজ করেন না।

public class Conversation extends Activity {
    private ProgressDialog progDialog;
    int typeBar;
    TextView text1;
    EditText edit;
    Button respond;
    private String name;
    private String textAtView;
    private String savedName;

    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);

        setContentView(R.layout.dorothydialog);
        text1 = (TextView)findViewById(R.id.dialog);
        edit = (EditText)findViewById(R.id.repsond);
        respond = (Button)findViewById(R.id.button01);

        if(savedInstanceState != null){
            savedInstanceState.get(savedName);
            text1.setText(savedName);
        }
        else{
            text1.setText("Hello! What is your name?");
            respond.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    name = edit.getText().toString();
                    text1.setText("Nice to meet you "+ name);
                }   
            });
        }
    }

    @Override
    public void onSaveInstanceState(Bundle outState){
        super.onSaveInstanceState(outState);
        outState.putString(savedName, name);
    }
}

text1.setText (savedInstanceState.getString (savedName));
স্পিডি

@ স্পিডি অনব্যাকড্রেস সম্পর্কে কী? আমি কীভাবে এই বান্ডিলটি দিয়ে প্রতিক্রিয়া জানাব?
tj ওয়াকার

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

উত্তর:


198

Bundleসব তথ্য আপনি সংরক্ষণ করতে চান তাদের জন্য একটা ধারক। আপনি এতে * প্রবেশ করানোর জন্য পুট * ফাংশন ব্যবহার করেন। এখানে একটি সংক্ষিপ্ত তালিকা করা ফাংশন আপনি ডেটা জমা করতে ব্যবহার করতে পারেন (আরো আছে) Bundle

putString
putBoolean
putByte
putChar
putFloat
putLong
putShort
putParcelable (used for objects but they must implement Parcelable)

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

if (savedInstanceState != null) {
    // Then the application is being reloaded
}

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

@Override
public void onSaveInstanceState(Bundle outState) {
   outState.putString("message", "This is my message to be reloaded");
   super.onSaveInstanceState(outState);
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (savedInstanceState != null) {
        String message = savedInstanceState.getString("message");
        Toast.makeText(this, message, Toast.LENGTH_LONG).show();
    }
}

আপনার সংরক্ষিত বার্তাটি স্ক্রিনে টোস্ট করা হবে। আশাকরি এটা সাহায্য করবে.


14
আপনার কার্যকলাপ বিরতি দেওয়ার আগে onSaveInstanceState () বলা হয়। সম্ভাব্যভাবে ধ্বংস হওয়ার পরে এটির যে কোনও তথ্যের দরকার পরে সেভ করা বান্ডেল থেকে পুনরুদ্ধার করা যেতে পারে
ডিয়েডেরিক

@ স্পিডি দুর্দান্ত! আপনি আমাকে সত্যিই আমাকে একটি বান্ডিল সম্পর্কে সমস্ত কিছু বুঝিয়ে দিয়েছেন! সুতরাং আমি অনুমান করে আউটস্টেটটি সেভডআইনস্ট্যান্সস্টেটের বান্ডেলে ফেরত দেওয়া হবে? সঠিক?
tj ওয়াকার

হাঁ। আউটস্টেট বান্ডিলটি সেভড ইনস্ট্যান্সস্টেট বান্ডেল হিসাবে ফেরত দেওয়া হয়েছে
স্পিডি

1
@tj ওয়াকার - আরও একটি দুর্দান্ত সংস্থান প্রযুক্তিগত রেফারেন্স বই। প্রো অ্যান্ড্রয়েড 3 হ'ল একটি সস্তা তবে বিস্তৃত সংস্থান যা আপনি অ্যামাজনে পেতে পারেন
স্পিডি

আপনার কাছে দেখার জন্য @ স্পিডি আমি আমার ক্রিয়াকলাপটি উপরে পোস্ট করেছি। আপনার পরামর্শ অনুসারে, আমি আমার রাজ্যটি সঠিকভাবে সংরক্ষণ করছি কিনা তা আপনি আমাকে জানাতে পারেন।
tj ওয়াকার

34

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

অ্যান্ড্রয়েড ডক্স থেকে :

আপনার কেবলমাত্র কাজটির প্রয়োজন হ'ল প্রতিটি উইজেটের জন্য আপনি তার রাজ্যটি সংরক্ষণ করতে চান তার জন্য একটি অনন্য আইডি (অ্যান্ড্রয়েড: আইডি বৈশিষ্ট্য সহ) সরবরাহ করা। যদি কোনও উইজেটের আইডি না থাকে তবে এটি তার রাজ্যটি সংরক্ষণ করতে পারে না


1
আচ্ছা এটা কি সত্য? কারণ আমার একটি বোতামের পাঠ্যদর্শন এবং পাঠ্য সম্পাদনা করার ক্রিয়াকলাপ রয়েছে। যদি অ্যাপ্লিকেশনটি ধ্বংস হয় বা হত্যা করা হয় তবে সমস্ত কিছু তার আসল অবস্থায় ফিরে আসে। আমার অ্যাপ্লিকেশনটিতে প্রতিবার ব্যবহারকারী বোতামটি ক্লিক করলে পাঠ্যদর্শন পাঠ্যগুলি পরিবর্তন হয়।
tj ওয়াকার

ডকুমেন্টেশন কি ভুল? নিজস্ব তথ্য সংরক্ষণ করার জন্য আমার কাছে কখনও ভিউ ছিল না। আপনার সেরা বাজি হ'ল আপনার মতামতটি আমার মতে নিজেই সংরক্ষণ করা।
স্পিডি

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

@ নিসান ফ্যান আপনি উপরে উদাহরণস্বরূপ যেমন উদাহরণ দিতে পারেন? ভাগীদারদের সাথে এবং সব? ধন্যবাদ
tj ওয়াকার

নিখুঁতভাবে সেরা উদাহরণগুলি ডকুমেন্টেশন থেকে আসে। বিকাশকারী.অ্যান্ড্রয়েড.
কেথ অ্যাডলার

6

একটি ভাল তথ্য: আপনার বন্ডল অবজেক্টটি অনক্রিট () পদ্ধতিতে নাল কিনা তা পরীক্ষা করার দরকার নেই। OnRestoreInstanceState () পদ্ধতিটি ব্যবহার করুন, যা সিস্টেমটি স্টার্ট () পদ্ধতির পরে কল করে। সিস্টেমটি রিস্টোরইনস্ট্যান্স স্টেটকে কল করে কেবল তখনই যদি পুনরুদ্ধার করার জন্য কোনও সেভ স্টেট থাকে, সুতরাং আপনার বান্ডেলটি নাল কিনা তা পরীক্ষা করার দরকার নেই you


5

দোকান তথ্য:

static final String PLAYER_SCORE = "playerScore";
static final String PLAYER_LEVEL = "playerLevel";

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

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

আপনি যদি নিজের অনক্রিট পদ্ধতিতে তথ্য পুনরুদ্ধার করতে না চান:

এখানে উদাহরণ রয়েছে: একটি ক্রিয়াকলাপ পুনরুদ্ধার করা

অনক্রিট () এর সময় রাজ্য পুনরুদ্ধার করার পরিবর্তে আপনি onRestoreInstanceState () প্রয়োগ করতে বেছে নিতে পারেন, যা সিস্টেমটি অন স্টার্ট () পদ্ধতির পরে কল করে। সিস্টেমটি রিস্টোরইনস্ট্যান্স স্টেটকে কল করে কেবল তখনই যদি পুনরুদ্ধার করার জন্য কোনও সেভ স্টেট থাকে, সুতরাং আপনার বান্ডেলটি নাল কিনা তা পরীক্ষা করার দরকার নেই you

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(PLAYER_SCORE);
mCurrentLevel = savedInstanceState.getInt(PLAYER_LEVEL);
}

0

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

আসুন আপনাকে এডিট টেক্সট সহ একটি ক্রিয়াকলাপ আছে বলে দেয়। ব্যবহারকারী এটির ভিতরে কিছু পাঠ্য লিখেছিলেন। এর পরে সিস্টেমটি আপনার onSaveInstanceState () এ কল করে। আপনি সম্পাদনা পাঠের পাঠ্যটি পড়েন এবং এটি বান্ডেল.পুটস্ট্রিং ("edit_text_value", theValue) এর মাধ্যমে বান্ডলে লিখুন।

এখন অনক্রিট বলা হয়। সরবরাহ করা বান্ডিলটি নাল নয় কিনা তা আপনি পরীক্ষা করে দেখুন। যদি কেসটি হয় তবে আপনি Bundle.getString ("edit_text_value") এর মাধ্যমে আপনার মানটি পুনরুদ্ধার করতে পারেন এবং এটিকে আবার আপনার সম্পাদনা পাঠের মধ্যে রাখতে পারেন।


0

এটি অতিরিক্ত তথ্যের জন্য।

এই দৃশ্যটি কল্পনা করুন

  1. অ্যাক্টিভিটিএ লঞ্চ অ্যাক্টিভিটিবি।
  2. ক্রিয়াকলাপ দ্বারা নতুন একটি ক্রিয়াকলাপপ্রিম চালু করুন

    Intent intent = new Intent(getApplicationContext(), ActivityA.class);
    startActivity(intent);
  3. ক্রিয়াকলাপের সাথে ক্রিয়াকলাপের কোনও সম্পর্ক নেই।
    এক্ষেত্রে ActivityAprime.onCreate () বান্ডেলটি বাতিল হয়ে যাবে।

যদি ক্রিয়াকলাপএ এবং অ্যাক্টিভিটিপ্রাইম বিভিন্ন ক্রিয়াকলাপের পরিবর্তে একই ক্রিয়াকলাপ হয় তবে অ্যাক্টিভিটিবি স্টার্টঅ্যাক্টিভিটি () ব্যবহার না করে ফিনিস () সমাপ্তি কল করে।


কেবল আপনার উদাহরণ হিসাবে স্পষ্ট করে বলতে হবে, ক্রিয়াকলাপ == ক্রিয়াকলাপ উদাহরণ 1 এবং ক্রিয়াকলাপপ্রিম == ক্রিয়াকলাপ উদাহরণ 2? এছাড়াও, যখন আপনি বলেন, "ক্রিয়াকলাপ বি স্টার্টঅ্যাক্টিভিটি () ব্যবহার করার চেয়ে ফিনিস () কল করা উচিত।" আপনি কী বোঝাতে চাইছেন: (১) অ্যাক্টিভিটিবি'এ ফিনিশ () বলা উচিত এবং তারপরে স্টার্টএকটিভিটি () পরে ব্যবহার করা (2) বা অ্যাক্টিভিটিবি একেবারে স্টার্টএটিভিটি () ব্যবহার না করে ফিনিশ () বলা উচিত? যদি আপনি বিকল্প 2 বোঝাতে চান, তবে আপনি কীভাবে কেউ একই ক্রিয়াকলাপটি পুনরায় চালু করার পরামর্শ দিবেন উদাহরণস্বরূপ1 যাতে আপনি কার্যকলাপটি ধ্বংস / সমাপ্ত হওয়ার আগে থাকা ডেটা লোড করতে পারেন? ধন্যবাদ
cjayem13

ক্রিয়াকলাপএ এবং ক্রিয়াকলাপপ্রাইম একই শ্রেণীর তবে বিভিন্ন উদাহরণ। এই দৃশ্যে, অ্যাক্টিভিটিএ এখনও তার ব্যবসা শেষ করে না, এর মাঝামাঝি সময়ে এটি ক্রিয়াকলাপ তৈরি করে এবং এটি শুরু করে, সুতরাং যখন অ্যাক্টিভিটি বি সমাপ্ত হয়, তখন ক্রিয়াকলাপটিকে তার বাকী ব্যবসা চালিয়ে যাওয়া উচিত। এক্ষেত্রে স্টার্টএটিভিটি বলা ভুল, এবং ক্রিয়াকলাপএ এবং অ্যাক্টিভিয়াপ্রাইম একই উদাহরণ হিসাবে প্রত্যাশা করে। সুতরাং আমাদের ক্রিয়াকলাপ পুনরায় আরম্ভ করা উচিত নয়, কেবল ক্রিয়াকলাপ শেষ করুন এবং ক্রিয়াকলাপটিকে এটিকে আবার শুরু করা উচিত ...
কেন

0

যদি ডেটা লোড না হয় তবে savedInstanceStateনিম্নলিখিত কোডটি ব্যবহার করুন।
সমস্যাটি হ'ল ইউআরএল কলটি সম্পূর্ণরূপে সম্পূর্ণ হয় না, উদাহরণস্বরূপ মানটি দেখানোর জন্য ডেটা লোড হয়েছে কিনা তা পরীক্ষা করুন।

//suppose data is not Loaded to savedInstanceState at 1st swipe
if (savedInstanceState == null && !mAlreadyLoaded){
    mAlreadyLoaded = true;
    GetStoryData();//Url Call
} else {
    if (listArray != null) {  //Data Array From JsonArray(ListArray)
        System.out.println("LocalData  " + listArray);
        view.findViewById(R.id.progressBar).setVisibility(View.GONE);
    }else{
        GetStoryData();//Url Call
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.