OnSaveInstanceState () এবং onRestoreInstanceState () ঠিক কখন বলা হয়?


102

নিম্নলিখিত চিত্র ( অফিসিয়াল ডক থেকে ) একটি অ্যান্ড্রয়েড ক্রিয়াকলাপের সুপরিচিত জীবনচক্র বর্ণনা করে :

এখানে চিত্র বর্ণনা লিখুন

অন্যদিকে, যখন কার্যকলাপ সিস্টেম দ্বারা ধ্বংস করা হয় (উদাহরণস্বরূপ কারণ মেমরি চাহিদা পুনরায় দাবি করা হয়) উপর, কার্যকলাপ রাষ্ট্র কখনও কখনও স্বয়ংক্রিয়ভাবে হয় সংরক্ষিত এবং পুনরুদ্ধার পদ্ধতি মাধ্যমে onSaveInstanceState()এবং onRestoreInstanceState(), যেমন (নিচের চিত্র দ্বারা চিত্রিত এছাড়াও থেকে সরকারী ডক ):

এখানে চিত্র বর্ণনা লিখুন

আমি সচেতন যে যখন কোনও ক্রিয়াকলাপটি ধ্বংস হতে চলেছে তখন সর্বদা বলাonSaveInstanceState() হয় না । উদাহরণস্বরূপ, যদি এটি ধ্বংস হয়ে যায় কারণ ব্যবহারকারী "পিছনে" বোতাম টিপেছেন তবে ক্রিয়াকলাপের অবস্থাটি সংরক্ষণ করা হয়নি। কিন্তু মামলা যখন রাজ্যের হয় সংরক্ষিত এবং পুনরুদ্ধার এবং onSaveInstanceState()/ onRestoreInstanceState()নামক পেতে, যখন ঠিক তাদের বলা হয় ?

উদাহরণস্বরূপ, উপরে পরিসংখ্যান অনুযায়ী, onRestoreInstanceState()আগে বলা হতে পারে onStart(), অথবা পরে onStart()কিন্তু আগে onResume()কিংবা পরে onResume()। একইভাবে, বিভিন্ন সম্ভাবনার জন্য বিদ্যমান onSaveInstanceState()। তাহলে তাদের কখন ডাকা হবে?

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


অনপস () এবং অনস্টপ () এর মধ্যে কল করা অ্যানড্রয়েড অফস্ট্যান্স স্টেট () অ্যান্ড্রয়েড অফিসিয়াল ডকুমেন্ট থেকে চূড়ান্ত উত্তর পেয়েছে।
ঋষি

1
@ Ishষি আপনি কি এই দস্তাবেজের একটি লিঙ্ক সরবরাহ করতে পারেন?
লুইস মেন্ডো


সংরক্ষণ করুন আপনার কার্যকলাপের রাষ্ট্র অনুচ্ছেদ সেখানে পড়া
ঋষি

কিনা আমি সঠিক নই বা না পরিষ্কার করে বলো
ঋষি

উত্তর:


107

ডকুমেন্টেশন প্রতি :

অকার্যকরতরেস্টোরইনস্ট্যান্স স্টেট (বান্ডেল সেভড ইনস্ট্যান্সস্টেট)

এই পদ্ধতিটি onStart()এবং এর মধ্যে বলা হয় onPostCreate(Bundle)

সেভআইনস্ট্যান্সস্টেট অকার্যকর (বান্ডিল আউটস্টেট)

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


1
ধন্যবাদ। আপনি দয়া করে ডকুমেন্টেশনের লিঙ্কগুলি সরবরাহ করতে পারেন?
লুইস মেন্ডো

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

অনেক ধন্যবাদ. এটি ইস্যুটি পরিষ্কার করে
লুইস মেন্ডো

1
@ স্টিভম "অনপজ () এর আগে বা পরে তা ঘটবে কিনা সে সম্পর্কে কোনও গ্যারান্টি নেই" "এর অর্থ কি যদি আমরা কোনও ভিউ অ্যাক্সেস করার চেষ্টা করি (তালিকার ভিউ থেকে কোনও সূচকের মতো কিছু সঞ্চয় করার জন্য) আমরা নলপয়েন্টারএক্সেপশনগুলিতে চলে যেতে পারি?
টিয়াগো

3
তারপরে, অনপেজ-এ কোনও ডেটা স্ট্রাকচার সংরক্ষণ করে ওনসাইভস্ট্যান্সস্টেট এবং অন-স্টোরইনস্ট্যান্সস্টেটের পরিবর্তে এটির রিসুমে পুনরুদ্ধার করার জন্য কী প্রস্তাবিত?
Gödel77

18

অনুযায়ী doc1 এবং doc2

onSaveInstanceState

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

onRestoreInstanceState

পূর্ববর্তী সংরক্ষিত অবস্থা থেকে ক্রিয়াকলাপটি পুনরায় আরম্ভ করার সময় এই পদ্ধতিটি অনস্টার্ট () এবং অনপোস্টক্রিয়েট (বান্ডেল) এর মধ্যে ডাকা হয়


আপনি বিভিন্ন অ্যান্ড্রয়েড সংস্করণে
দৃশ্যধারণের উপায়টি

14

ইতিমধ্যে পোস্ট করা উত্তরগুলি ছাড়াও, অ্যান্ড্রয়েড পি-তে একটি সূক্ষ্ম পরিবর্তন চালু হয়েছে যা হ'ল:

সেভআইনস্ট্যান্সস্টেট অকার্যকর (বান্ডিল আউটস্টেট)

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

সূত্র: ডকস

কেন এই পরিবর্তনটি চালু করা হয়েছে, তার উত্তর এখানে দেওয়া হয়েছে:

... সুতরাং কোনও অ্যাপ্লিকেশনটি নিরাপদে খণ্ডের লেনদেনগুলি সম্পাদন করতে পারে onStop()এবং পরে স্থায়ী অবস্থা সংরক্ষণ করতে সক্ষম হবে।

সূত্র: ডকস


হাই, দুর্দান্ত মন্তব্য। আপনি কী জানেন যে অ্যাপটি যে টার্গেট পি টার্গেট করে তবে লো এপিতে চলে? অ্যাপটি নিম্ন এপিআইকে লক্ষ্য করে লক্ষ্য করা যায় বা এটি এপিআই জুড়ে সামঞ্জস্য হয় এবং "টার্গেটিং এপিআই" আচরণ চালিয়ে যায়?
ফিলিপকোইচিজ

@ ফিলিপকোইচিজ, Do you know how will behave app that target P but runs on lower api?যতক্ষণ না অ্যাপটি এম বলে চালানো হচ্ছে, ততক্ষণ এই ডিভাইসটির অ্যান্ড্রয়েড সংস্করণে কোনও পরিবর্তন নেই, এটি পিতে প্রবর্তিত হয়েছে, যার অর্থ আপনি লক্ষ্যমাত্রা নির্ধারণ Pনা করে নির্ধারিত হিসাবে আপনি দেখতে পাবেন না প্রাক-পি ডিভাইসের জন্য পৃথক। আশা করি এটি আপনার প্রশ্নের উত্তর দেয়।
আজিজবিকিয়ান

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

6

এটি SaveInstanceState (বান্ডিল) এর জন্য অতিরিক্ত তথ্য

ডক্স থেকে

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

সুতরাং এটির জন্য ডিফল্ট বাস্তবায়ন ..

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


0
String activityState;
@Override 
public void onCreate(Bundle savedInstanceState) {
// call the super class onCreate to complete the creation of activity like 
// the view hierarchy 
super.onCreate(savedInstanceState);

// recovering the instance state 
if (savedInstanceState != null) {
     activityState = savedInstanceState.getString(STATE_KEY);
 } 

   setContentView(R.layout.main_activity);
   mTextView = (TextView) findViewById(R.id.text_view);
} 

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

@Override 
public void onRestoreInstanceState(Bundle savedInstanceState) {
 mTextView.setText(savedInstanceState.getString(STATE_KEY));
  } 


// invoked when the activity may be temporarily destroyed, save the instance 
//state here 
//this method will be called before onstop

@Override 
 public void onSaveInstanceState(Bundle outState) {
    outState.putString(STATE_KEY, activityState);

    // call superclass to save any view hierarchy 
    super.onSaveInstanceState(outState);
} 

মাফ করবেন, যখন সংরক্ষণ / পুনরুদ্ধার পদ্ধতিগুলি ডাকা হয় ঠিক কীভাবে এই প্রশ্নের উত্তর দেয় ?
লুইস মেন্ডো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.