সুপার.অনক্রিয়েট (সেভড ইনস্ট্যান্সস্টেট);


89

আমি একটি অ্যান্ড্রয়েড অ্যাপ্লিকেশন প্রকল্প তৈরি করেছি এবং মেইনএকটিভিটি.জভাতে> onCreate()এটি কল করছে super.onCreate(savedInstanceState)

শিক্ষানবিস হিসাবে, কেউ কি ব্যাখ্যা করতে পারবেন উপরের লাইনের উদ্দেশ্য কী?

উত্তর:


161

আপনার করা প্রতিটি ক্রিয়াকলাপটি পদ্ধতি কলগুলির ক্রম দিয়ে শুরু করা হয়। onCreate()এই কলগুলির মধ্যে প্রথমটি।

আপনার প্রতিটি ক্রিয়াকলাপ android.app.Activityসরাসরি বা অন্য সাবক্লাসের সাবক্লাসিংয়ের মাধ্যমে প্রসারিত Activity

জাভাতে, আপনি যখন কোনও শ্রেণি থেকে উত্তরাধিকারী হন, আপনি সেগুলিতে নিজের কোড চালানোর জন্য এর পদ্ধতিগুলি ওভাররাইড করতে পারেন। এর খুব সাধারণ উদাহরণ হ'ল toString()প্রসারিত করার সময় পদ্ধতির ওভাররাইডিং java.lang.Object

যখন আমরা কোনও পদ্ধতিকে ওভাররাইড করি তখন আমাদের কাছে আমাদের ক্লাসে পদ্ধতিটি পুরোপুরি প্রতিস্থাপনের বা বিদ্যমান প্যারেন্ট ক্লাসের পদ্ধতিটি বাড়ানোর বিকল্প থাকে। কল করে super.onCreate(savedInstanceState);আপনি ডালভিক ভিএমকে অভিভাবক শ্রেণীর অনক্রিট () এর বিদ্যমান কোড ছাড়াও আপনার কোড চালানোর জন্য বলুন । আপনি যদি এই লাইনটি ছেড়ে দেন তবে কেবল আপনার কোডটি চালানো হবে। বিদ্যমান কোড সম্পূর্ণ উপেক্ষা করা হয়।

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

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


4
আরও একটি প্রশ্ন - যখন আমরা প্যারেন্ট ক্লাস পদ্ধতিটি ওভাররাইড করি তখন কি এই উত্পন্ন পদ্ধতিটি প্যারেন্ট ক্লাস পদ্ধতির কোডটি ধরে রাখে, বা এটি একটি নতুন তাজা পদ্ধতি?
প্রমোদ

15
আপনি যদি সুপারকে কল করেন তবে সুপার কল যেখানে রয়েছে সেখানে পিতামাতার পদ্ধতির কোডটি দেওয়া হয়। যদি সুপারকে না বলা হয় তবে এটি একটি নতুন পদ্ধতি।
রাঘব সূদ

4
রাঘব সূদ, আমি মনে করি আপনার মন্তব্যের পাঠ্য উত্তরের সাথে যুক্ত করা উচিত কারণ এটি নতুনদের জন্য সুপার পদ্ধতির ব্যবহার আরও বোধগম্যভাবে ব্যাখ্যা করে। কমপক্ষে আমি এটি কেবল আপনার মন্তব্য থেকে বুঝতে পেরেছি :)
আইয়াজ আলিফভ

5

* উত্পন্ন শ্রেণি onCreate(bundle)পদ্ধতিতে এই পদ্ধতির সুপারক্লাস বাস্তবায়ন কল করতে হবে। " সুপার " কীওয়ার্ডটি ব্যবহার না করা হলে এটি একটি ব্যতিক্রম সুপারনটক্ল্যাড এক্সসেপশন ফেলে দেবে ।

উত্তরাধিকারের জন্য Java, সুপারক্লাস পদ্ধতিটি ওভাররাইড করতে এবং উপরের শ্রেণি পদ্ধতিটি কার্যকর করতে, super.methodname()ওভাররাইডিং উত্পন্ন শ্রেণি পদ্ধতিতে ব্যবহার করুন;

অ্যান্ড্রয়েড ক্লাস একইভাবে কাজ করে। Activityক্লাসটি প্রসারিত করে যার onCreate(Bundle bundle)পদ্ধতিতে অর্থবহ কোড লেখা রয়েছে এবং সংজ্ঞায়িত ক্রিয়াকলাপে সেই কোডটি কার্যকর করতে, অনক্রিট () পছন্দ মতো পদ্ধতির সাথে সুপার কীওয়ার্ডটি ব্যবহার করুন super.onCreate(bundle)

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

protected void  onCreate(Bundle savedInstanceState) {
    mVisibleFromClient = mWindow.getWindowStyle().getBoolean(
    com.android.internal.R.styleable.Window_windowNoDisplay, true);
    mCalled = true;
}

boolean mVisibleFromClient = true;

/**
 * Controls whether this activity main window is visible.  This is intended
 * only for the special case of an activity that is not going to show a
 * UI itself, but can't just finish prior to onResume() because it needs
 * to wait for a service binding or such.  Setting this to false prevents the UI from being shown during that time.
 * 
 * <p>The default value for this is taken from the
 * {@link android.R.attr#windowNoDisplay} attribute of the activity's theme.
 */

এটি পরিবর্তনশীলও বজায় রাখে mCalledযার অর্থ আপনি super.onCreate(savedBundleInstance)আপনার ক্রিয়াকলাপটিকে কল করেছেন।

final void performStart() {
    mCalled = false;
    mInstrumentation.callActivityOnStart(this);
    if (!mCalled) {
        throw new SuperNotCalledException(
            "Activity " + mComponent.toShortString() +
            " did not call through to super.onStart()");
    }
}

উত্স কোড এখানে দেখুন।

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/1.5_r4/android/app/Activity.java#Activity.onCreate%28android.os.Bundle%29


1

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


আপনি কল না করলেও আপনার কোডটি সুখীভাবে সংকলন করবে super.onCreate(savedInstanceState), যদি না এতে আপনার মধ্যে অন্য কোনও ত্রুটি থাকে
রাঘব সুদ

1

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

সুপার.অনক্রিয়েট (সেভড ইনস্ট্যান্সস্টেট) বলার কারণ হ'ল আপনার কোড অন্যথায় সংকলন করবে না। ;-)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.