মধ্যে পার্থক্য কি getContext()
, getApplicationContext()
, getBaseContext()
, এবং " this
"?
যদিও এটি সাধারণ প্রশ্ন তবে আমি তাদের মধ্যে মূল পার্থক্য বুঝতে অক্ষম। সম্ভব হলে কিছু সহজ উদাহরণ দিন।
মধ্যে পার্থক্য কি getContext()
, getApplicationContext()
, getBaseContext()
, এবং " this
"?
যদিও এটি সাধারণ প্রশ্ন তবে আমি তাদের মধ্যে মূল পার্থক্য বুঝতে অক্ষম। সম্ভব হলে কিছু সহজ উদাহরণ দিন।
উত্তর:
View.getContext()
: দৃশ্যটি বর্তমানে চলছে এমন প্রসঙ্গটি ফিরিয়ে দেয় Usually সাধারণত বর্তমানে সক্রিয় ক্রিয়াকলাপ।
Activity.getApplicationContext()
: পুরো অ্যাপ্লিকেশনটির প্রসঙ্গটি ফেরত দেয় (সমস্ত ক্রিয়াকলাপটি যে ক্রিয়াকলাপটির অভ্যন্তরে চলছে)। আপনার যদি কেবলমাত্র বর্তমান ক্রিয়াকলাপ নয়, পুরো অ্যাপ্লিকেশনটির জীবনচক্রের সাথে আবদ্ধ কোনও প্রসঙ্গের প্রয়োজন হয় তবে বর্তমান ক্রিয়াকলাপের প্রেক্ষাপটের পরিবর্তে এটি ব্যবহার করুন।
ContextWrapper.getBaseContext()
: আপনার যদি অন্য প্রসঙ্গের মধ্যে থেকে কোনও প্রসঙ্গে অ্যাক্সেসের প্রয়োজন হয় তবে আপনি একটি কনটেক্সট্র্যাপার ব্যবহার করেন। প্রসঙ্গটি অভ্যন্তরীণ থেকে উল্লিখিত প্রসঙ্গটি getBaseContext () এর মাধ্যমে অ্যাক্সেস করা হয় Con
this
এবং getContext()
সবসময় হয় না কার্যকলাপের ক্লাসে একই যেমন, আপনি ব্যবহার করতে পারেন this
কারণ Activity
থেকে উত্তরাধিকারী Context
কিন্তু পদ্ধতি getContext()
নেই Activity
বর্গ। @ মাইকেড্রয়েড @ কেসিআরজু
বেশিরভাগ উত্তর ইতিমধ্যে কভার করা হয়েছে getContext()
এবং getApplicationContext()
তবে getBaseContext () খুব কমই ব্যাখ্যা করা হয়েছে।
পদ্ধতিটি কেবল getBaseContext()
তখনই প্রাসঙ্গিক যখন আপনার একটি থাকে ContextWrapper
। অ্যান্ড্রয়েড একটি ContextWrapper
ক্লাস সরবরাহ করে যা বিদ্যমান Context
ব্যবহার করে তৈরি করা হয়:
ContextWrapper wrapper = new ContextWrapper(context);
ContextWrapper
এটিকে ব্যবহার করার সুবিধাটি হ'ল এটি আপনাকে "মূল প্রসঙ্গে পরিবর্তন না করে আচরণ পরিবর্তন করতে" দেয়। উদাহরণস্বরূপ, যদি আপনার কাছে কোনও ক্রিয়াকলাপ বলা হয় myActivity
তবে তার View
চেয়ে আলাদা থিম সহ একটি তৈরি করতে পারেন myActivity
:
ContextWrapper customTheme = new ContextWrapper(myActivity) {
@Override
public Resources.Theme getTheme() {
return someTheme;
}
}
View myView = new MyView(customTheme);
ContextWrapper
সত্যই শক্তিশালী কারণ এটি আপনাকে Context
সংস্থাগুলি অ্যাক্সেসের জন্য কোড (যেমন openFileInput()
, getString()
), অন্যান্য উপাদানগুলির (যেমন sendBroadcast()
, registerReceiver()
) সাথে যোগাযোগের , অনুমতিগুলির অনুরোধ (উদাহরণস্বরূপ checkCallingOrSelfPermission()
) এবং ফাইল সিস্টেমের অবস্থানগুলির সমাধান (উদাহরণস্বরূপ ) সহ বেশিরভাগ ফাংশনগুলিকে ওভাররাইড করতে দেয় getFilesDir()
। ContextWrapper
ডিভাইস / সংস্করণ নির্দিষ্ট সমস্যাগুলির আশেপাশে কাজ করার জন্য বা একটি প্রসঙ্গের প্রয়োজন এমন ভিউয়ের মতো উপাদানগুলিতে ওয়ান-অফ কাস্টমাইজেশন প্রয়োগ করতে সত্যই কার্যকর।
GetBaseContext ( পদ্ধতি ) পদ্ধতিটি "বেইস" প্রসঙ্গে যে মোড়কে আবদ্ধ হয় তা অ্যাক্সেস করতে ব্যবহার করা যেতে পারে ContextWrapper
। আপনি, উদাহরণস্বরূপ, চেক কিনা এটি একটি এর প্রয়োজন হলে আপনি "বেস" প্রসঙ্গ ব্যবহার করার দরকার হতে পারে Service
, Activity
বা Application
:
public class CustomToast {
public void makeText(Context context, int resId, int duration) {
while (context instanceof ContextWrapper) {
context = context.baseContext();
}
if (context instanceof Service)) {
throw new RuntimeException("Cannot call this from a service");
}
...
}
}
বা যদি আপনাকে কোনও পদ্ধতির "মোড়ানো" সংস্করণটি কল করতে হয়:
class MyCustomWrapper extends ContextWrapper {
@Override
public Drawable getWallpaper() {
if (BuildInfo.DEBUG) {
return mDebugBackground;
} else {
return getBaseContext().getWallpaper();
}
}
}
ContextWrapper
অ্যান্ড্রয়েড কাঠামোর বিকাশকারীদের দ্বারা করা সবচেয়ে খারাপ সিদ্ধান্তগুলির মধ্যে একটি এর অস্তিত্ব । যখন তারা বুঝতে পেরেছিল যে তারা Godশ্বর অবজেক্টগুলির একটি সম্পূর্ণ পরিবার তৈরি করেছে, সঠিক কাজটি করার পরিবর্তে এবং একক দায়িত্বের প্রতি কোডটিকে পুনরায় প্রতিস্থাপনের পরিবর্তে, তারা একটি কুরুচিপূর্ণ হ্যাক যুক্ত করেছে যা উত্তরাধিকারসূত্রে গাছকে আরও গভীর করে কনটেক্সট আচরণকে পরিবর্তন করতে দেয়। খারাপ সফ্টওয়্যার ইঞ্জিনিয়ারিং এর অদ্বিতীয়তম। আমাদের হিসাবে, বিকাশকারীরা, আইএমএইচও কারও কখনও ব্যবহার করা উচিত নয় getBaseContext()
বা ContextWrapper
। আপনি যদি করেন - এটি একটি বিশাল "কোড গন্ধ"।
CustomToast
কোডটি দেখতে চাই । :) :)))
getApplicationContext () - প্রয়োগে চলমান সমস্ত ক্রিয়াকলাপের জন্য প্রসঙ্গটি ফেরত দেয়।
getBaseContext () - আপনি যদি অ্যাপ্লিকেশনের মধ্যে অন্য প্রসঙ্গ থেকে প্রসঙ্গ অ্যাক্সেস করতে চান তবে আপনি অ্যাক্সেস করতে পারেন।
getContext () - কেবলমাত্র চলমান ক্রিয়াকলাপটি প্রসঙ্গ দেখায় s
"প্রসঙ্গটি কী" প্রশ্নটি অ্যান্ড্রয়েড মহাবিশ্বের সবচেয়ে জটিল একটি প্রশ্ন।
প্রসঙ্গটি এমন পদ্ধতিগুলি সংজ্ঞায়িত করে যা সিস্টেম সংস্থানগুলিতে অ্যাক্সেস করে, অ্যাপ্লিকেশনটির স্থিতিশীল সম্পদ পুনরুদ্ধার করে, অনুমতিগুলি পরীক্ষা করে, UI ম্যানিপুলেশনগুলি সম্পাদন করে এবং আরও অনেক কিছু করে। সংক্ষেপে, Context
গড অবজেক্টের একটি উদাহরণ উত্পাদনে অ্যান্টি-প্যাটার্ন।
যখন আমাদের ধরণের Context
ব্যবহার করা উচিত তখন এটি খুব জটিল হয়ে যায় কারণ গড অবজেক্ট ব্যতীত Context
সাবক্লাসের হায়ারার্ক গাছটি লিসকো সাবস্টিটিউশন নীতিটিকে নির্মমভাবে লঙ্ঘন করে।
এই ব্লগ পোস্টটিContext
বিভিন্ন পরিস্থিতিতে ক্লাসের প্রয়োগযোগ্যতার সংক্ষিপ্তসার চেষ্টা করে ।
সম্পূর্ণতার জন্য আমাকে সেই পোস্ট থেকে মূল টেবিলটি অনুলিপি করা উচিত:
+----------------------------+-------------+----------+---------+-----------------+-------------------+ | | Application | Activity | Service | ContentProvider | BroadcastReceiver | +----------------------------+-------------+----------+---------+-----------------+-------------------+ | Show a Dialog | NO | YES | NO | NO | NO | | Start an Activity | NO¹ | YES | NO¹ | NO¹ | NO¹ | | Layout Inflation | NO² | YES | NO² | NO² | NO² | | Start a Service | YES | YES | YES | YES | YES | | Bind to a Service | YES | YES | YES | YES | NO | | Send a Broadcast | YES | YES | YES | YES | YES | | Register BroadcastReceiver | YES | YES | YES | YES | NO³ | | Load Resource Values | YES | YES | YES | YES | YES | +----------------------------+-------------+----------+---------+-----------------+-------------------+
- একটি অ্যাপ্লিকেশন এখান থেকে একটি ক্রিয়াকলাপ শুরু করতে পারে তবে এটির জন্য একটি নতুন টাস্ক তৈরি করা দরকার। এটি নির্দিষ্ট ব্যবহারের ক্ষেত্রে উপযুক্ত হতে পারে তবে আপনার আবেদনে অ-স্ট্যান্ডার্ড ব্যাক স্ট্যাক আচরণ তৈরি করতে পারে এবং সাধারণত সুপারিশ করা হয় না বা ভাল অনুশীলন হিসাবে বিবেচিত হয় না।
- এটি আইনী, তবে মুদ্রাস্ফীতিটি আপনি যে সিস্টেমটিতে চলেছেন তার ডিফল্ট থিম দিয়েই করা হবে, আপনার প্রয়োগে সংজ্ঞায়িত নয়।
- যদি রিসিভারটি নাল হয় তবে এটি অ্যান্ড্রয়েড ৪.২ এবং তারপরের উপরে স্টিকি ব্রডকাস্টের বর্তমান মান অর্জনের জন্য ব্যবহৃত হয়।
Context
নতুন তৈরি করা উপাদানগুলির Actvity
বা সম্পর্কে তথ্য সরবরাহ করে Application
।
প্রাসঙ্গিক Context
নতুন নির্মিত উপাদানগুলিতে সরবরাহ করা উচিত (অ্যাপ্লিকেশন প্রসঙ্গ বা ক্রিয়াকলাপের প্রসঙ্গ যাই হোক না কেন)
যেহেতু Activity
একটি সাবক্লাস Context
, তাই কেউ this
এই ক্রিয়াকলাপের প্রসঙ্গটি পেতে ব্যবহার করতে পারেন
getApplicationContext ()
এটি অ্যাপ্লিকেশন স্তরের জন্য ব্যবহৃত হয় এবং সমস্ত ক্রিয়াকলাপ পড়ুন।
getContext () এবং getBaseContext ()
সম্ভবত এটি একই .এটি কেবল বর্তমান ক্রিয়াকলাপটি সরাসরি প্রচারিত যা সরাসরি is
এই
সর্বদা বর্তমান বর্গ অবজেক্ট উল্লেখ করুন।
এ Context
: