যেহেতু (আপনি বলেছেন) প্রথমে সুপার অনক্রিটকে কল করা বুদ্ধিমান: এটি সম্পর্কে চিন্তা করুন।
আমি যখন তৈরি করতে চাই তখন আমার সুপার তার সংস্থানগুলি তৈরি করে> আমি আমার সংস্থানগুলি তৈরি করি।
বিপরীতভাবে: (একটি স্ট্যাকের সাজানো)
আমি যখন ধ্বংস করতে চাই, আমি আমার সংস্থানগুলি নষ্ট করি> আমার সুপার তার সংস্থানগুলি ধ্বংস করে।
এই অর্থে, এটি যে কোনও ফাংশন (অনক্রিট / অনডাস্ট্রয়, অনারিউজ / অনপজ, অন স্টার্ট / অনস্টপ) এর ক্ষেত্রে প্রযোজ্য। স্বাভাবিকভাবেই, অনক্রিয়েট সংস্থান তৈরি করবে এবং অনডাস্ট্রয়ে এই সংস্থানগুলি মুক্ত করবে। যাইহোক, একই প্রমাণ অন্যান্য দম্পতিদের জন্য প্রযোজ্য।
আসুন আপনি ডাউনলোড করেছেন এমন একটি গ্রন্থাগার বিবেচনা করুন যাতে লোকেশনঅ্যাক্টিভিটি রয়েছে যাতে গেটলোকেশন () ফাংশন রয়েছে যা লোকেশন সরবরাহ করে। সম্ভবত, এই ক্রিয়াকলাপটির জন্য অনক্রিট () এর স্টাফ শুরু করতে হবে যা আপনাকে প্রথমে সুপার.অনক্রিটকে কল করতে বাধ্য করবে। আপনি ইতিমধ্যে এটি করেছেন কারণ আপনি অনুভব করেন যে এটি বোধগম্য। এখন, আপনার অনডাস্ট্রয়ে, আপনি সিদ্ধান্ত নিয়েছেন যে আপনি ভাগ করে নেওয়া পছন্দগুলি কোথাও অবস্থানটি সংরক্ষণ করতে চান। আপনি যদি প্রথমে সুপার.অনডাস্ট্রয়কে কল করেন তবে এটি নির্দিষ্ট পরিমাণে সম্ভব যে গেটলোকেশন এই কলের পরে একটি নাল মান ফিরে আসবে কারণ লোকেশনএকটিভিটির প্রয়োগটি অনডেসট্রয়ে লোকেশন মানকে বাতিল করে দেয়। ধারণাটি হ'ল যদি এটি ঘটে তবে আপনি দোষারোপ করবেন না। অতএব, আপনি নিজের অনডেট্রয়েয়ের সাথে কাজ শেষ করার পরে আপনি সুপার.অন.ডাস্ট্রয়কে কল করবেন। আমি আশা করি এটি কিছুটা বোধগম্য হবে।
উপরেরটি যদি বোঝায়, তবে যে কোনও মুহুর্তে আমাদের এমন একটি ক্রিয়াকলাপ রয়েছে যা উপরের ধারণার সাথে মেনে চলেন consider যদি আমি এই ক্রিয়াকলাপটি প্রসারিত করতে চাই তবে আমি সম্ভবত একইভাবে অনুভব করব এবং একই সঠিক যুক্তির কারণে একই ক্রমটি অনুসরণ করব।
প্রবেশন দ্বারা, যে কোনও ক্রিয়াকলাপ একই জিনিস করা উচিত। এই নিয়মগুলি অনুসরণ করতে বাধ্য করা একটি ক্রিয়াকলাপের জন্য এখানে একটি ভাল বিমূর্ত শ্রেণি রয়েছে:
package mobi.sherif.base;
import android.app.Activity;
import android.os.Bundle;
public abstract class BaseActivity extends Activity {
protected abstract void doCreate(Bundle savedInstanceState);
protected abstract void doDestroy();
protected abstract void doResume();
protected abstract void doPause();
protected abstract void doStart();
protected abstract void doStop();
protected abstract void doSaveInstanceState(Bundle outState);
@Override
protected final void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
doCreate(savedInstanceState);
}
@Override
protected final void onDestroy() {
doDestroy();
super.onDestroy();
}
@Override
protected final void onResume() {
super.onResume();
doResume();
}
@Override
protected final void onPause() {
doPause();
super.onPause();
}
@Override
protected final void onStop() {
doStop();
super.onStop();
}
@Override
protected final void onStart() {
super.onStart();
doStart();
}
@Override
protected final void onSaveInstanceState(Bundle outState) {
doSaveInstanceState(outState);
super.onSaveInstanceState(outState);
}
}
অবশেষে, যদি আপনার কার্যকলাপটি AnudeepBullaActivity
বেসঅ্যাক্টিভিটি এবং তার পরে প্রসারিত হয় তবে আমি কী এটি তৈরি SherifElKhatibActivity
করতে চাই যা আপনার কার্যকলাপকে প্রসারিত করে? কোন ক্রমে আমাকে super.do
ফাংশনগুলি কল করা উচিত ? এটি শেষ পর্যন্ত একই জিনিস।
আপনার প্রশ্নের হিসাবে:
আমি মনে করি যে গুগলের উদ্দেশ্য আমাদের বলা: দয়া করে সুপারকে যেখানেই ফোন করুন না কেন। অবশ্যই একটি সাধারণ অনুশীলন হিসাবে, শুরুতে এটি কল করুন। গুগলের অবশ্যই উজ্জ্বল প্রকৌশলী এবং বিকাশকারী রয়েছে তাই তারা সম্ভবত তাদের সুপার কলগুলি বিচ্ছিন্ন করে এবং শিশু কলগুলিতে হস্তক্ষেপ না করে একটি ভাল কাজ করেছেন।
আমি কিছুটা চেষ্টা করেছিলাম এবং এটি সম্ভবত সহজ নয় (যেহেতু এটি গুগল তাই আমরা ভুল প্রমাণ করার চেষ্টা করছি) কখন এমন একটি কার্যকলাপ তৈরি করা যায় যা কখন সুপার বলা হয়।
কেন?
এই ফাংশনগুলিতে যে কোনও কিছু করা ক্রিয়াকলাপ শ্রেণীর কাছে ব্যক্তিগত এবং এটি আপনার সাবক্লাসের সাথে কোনও বিরোধের কারণ হতে পারে না। উদাহরণস্বরূপ (onDestroy)
protected void onDestroy() {
if (DEBUG_LIFECYCLE) Slog.v(TAG, "onDestroy " + this);
mCalled = true;
if (mManagedDialogs != null) {
final int numDialogs = mManagedDialogs.size();
for (int i = 0; i < numDialogs; i++) {
final ManagedDialog md = mManagedDialogs.valueAt(i);
if (md.mDialog.isShowing()) {
md.mDialog.dismiss();
}
}
mManagedDialogs = null;
}
synchronized (mManagedCursors) {
int numCursors = mManagedCursors.size();
for (int i = 0; i < numCursors; i++) {
ManagedCursor c = mManagedCursors.get(i);
if (c != null) {
c.mCursor.close();
}
}
mManagedCursors.clear();
}
if (mSearchManager != null) {
mSearchManager.stopSearch();
}
getApplication().dispatchActivityDestroyed(this);
}
mManagedCursors এবং mManagedDialogs এবং mSearchManager সমস্ত ব্যক্তিগত ক্ষেত্র। এবং এখানে সর্বজনীন / সুরক্ষিত এপিআই এর দ্বারা প্রভাবিত হবে না।
তবে, এপিআই 14-এ, আপনার অ্যাপ্লিকেশনটিতে নিবন্ধিত অ্যাক্টিভিটি লাইফাইসাইক্যালব্যাকগুলিতে একটিঅ্যাক্টিভিটিডাস্ট্রয়েড অন প্রেরণে প্রেরণঅ্যাক্টিভিটিডাস্ট্রয়েড যুক্ত করা হয়েছিল। অতএব, আপনার অ্যাক্টিভিটিসাইফাইসাইক্যালব্যাকগুলিতে কিছু যুক্তির উপর নির্ভর করবে এমন কোনও কোডের যখন আপনি সুপারকে কল করছেন তার উপর ভিত্তি করে আলাদা ফলাফল হবে। উদাহরণ স্বরূপ:
বর্তমানে চলমান ক্রিয়াকলাপগুলির সংখ্যা গণনা করে এমন একটি অ্যাপ্লিকেশন ক্লাস তৈরি করুন:
package mobi.shush;
import android.app.Activity;
import android.app.Application;
import android.app.Application.ActivityLifecycleCallbacks;
import android.os.Bundle;
public class SherifApplication extends Application implements ActivityLifecycleCallbacks {
@Override
public void onCreate() {
super.onCreate();
registerActivityLifecycleCallbacks(this);
}
public int getCount() {
return count;
}
int count = 0;
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
count++;
}
@Override
public void onActivityDestroyed(Activity activity) {
count--;
}
@Override
public void onActivityPaused(Activity activity) {}
@Override
public void onActivityResumed(Activity activity) {}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {}
@Override
public void onActivityStarted(Activity activity) {}
@Override
public void onActivityStopped(Activity activity) {}
}
নিম্নলিখিতগুলি সম্ভবত একটি ভাল অনুশীলনের অর্থবোধ করে না বা তা নয় তবে এটি কেবল একটি বিষয় প্রমাণ করার জন্য রয়েছে (কেউ আরও বাস্তব পরিস্থিতি খুঁজে পেতে পারে)। মেইনএ্যাকটিভিটি তৈরি করুন যা সম্ভবত শেষ হওয়ার পরে এবং এটি শেষ ক্রিয়াকলাপ হিসাবে গুডবাইয়ের ক্রিয়াকলাপে চলে যায়:
@Override
protected void onDestroy() {
super.onDestroy();
if(((SherifApplication) getApplication()).getCount() == 0) {
startActivity(new Intent(this, GoodBye.class));
}
}
আপনি যদি আপনার অনডেট্রয়ের শুরুতে সুপার.অনডেস্ট্রয়কে কল করেন তবে গুডবাই ক্রিয়াকলাপটি চালু করা হবে। আপনি যদি আপনার অনডেট্রয়ের শেষে সুপার.অনডেস্ট্রয় কল করেন তবে গুডবাই ক্রিয়াকলাপটি আরম্ভ হবে না।
অবশ্যই, আবার এটি সর্বোত্তম উদাহরণ নয়। তবে এটি দেখায় যে গুগল এখানে কিছুটা গণ্ডগোল করেছে। অন্য কোনও ভেরিয়েবল আপনার অ্যাপ্লিকেশনটির আচরণকে প্রভাবিত করবে না। তবে এই প্রেরণটিকে onDestroy এ যুক্ত করার ফলে সুপারটি আপনার সাবক্লাসে কোনওভাবে হস্তক্ষেপ করে।
আমি বলি তারা আলাদা কারণেও গণ্ডগোল করেছে। কেবলমাত্র তারা (এপিআই 14 এর আগে) কেবলমাত্র চূড়ান্ত এবং / বা ব্যক্তিগত কী সুপার কলগুলিতে স্পর্শ করেছিল তা নয়, তবে তারা বিভিন্ন অভ্যন্তরীণ ফাংশন (প্রাইভেট) নামেও ডাকে যা সত্যিকার অর্থে অনপজ ... ফাংশনগুলি প্রেরণ করে।
উদাহরণস্বরূপ, performStop
ফাংশনটিকে ফাংশন বলা হয় যা ঘুরে অনসটপ ফাংশনটি কল করে:
final void performStop() {
if (mLoadersStarted) {
mLoadersStarted = false;
if (mLoaderManager != null) {
if (!mChangingConfigurations) {
mLoaderManager.doStop();
} else {
mLoaderManager.doRetain();
}
}
}
if (!mStopped) {
if (mWindow != null) {
mWindow.closeAllPanels();
}
if (mToken != null && mParent == null) {
WindowManagerGlobal.getInstance().setStoppedState(mToken, true);
}
mFragments.dispatchStop();
mCalled = false;
mInstrumentation.callActivityOnStop(this);
if (!mCalled) {
throw new SuperNotCalledException(
"Activity " + mComponent.toShortString() +
" did not call through to super.onStop()");
}
synchronized (mManagedCursors) {
final int N = mManagedCursors.size();
for (int i=0; i<N; i++) {
ManagedCursor mc = mManagedCursors.get(i);
if (!mc.mReleased) {
mc.mCursor.deactivate();
mc.mReleased = true;
}
}
}
mStopped = true;
}
mResumed = false;
}
লক্ষ্য করুন যে তারা এই ক্রিয়াকলাপের কোথাও ক্রিয়াকলাপের অনস্টপকে কল করে। সুতরাং, তারা অন্টসটপে কল করার আগে বা তার পরে সমস্ত কোড (সুপার.অনসটপ অন্তর্ভুক্ত) রেখে এবং তারপরে খালি অনসটপ সুপার ফাংশনগুলি ব্যবহার করে এবং এমনকি সুপারনটক্ল্যাড এক্সেকশন যোগ না করে বা এই কলটির জন্য পরীক্ষা না করেই সাবস্ক্লাসগুলি অবহিত করতে পারে।
এর জন্য, তারা যদি এই প্রেরণটিকে সুপার.অনডস্ট্রয়ের শেষের দিকে কল না করে পারফর্মডেস্ট্রয়ে অ্যাক্টিভিটি লাইফসাইকেলের কাছে কল করে, আমাদের কার্যকলাপের আচরণটি আমরা সুপারকে কখন ডাকতাম তা নির্বিশেষে একই রকম হতে পারত।
যাইহোক এটিই তারা প্রথম কাজ করে (কিছুটা ভুল) এবং এটি কেবল এপিআই 14 এ রয়েছে।