GetContext (), getapplicationContext (), getBaseContext () এবং "এটি" এর মধ্যে পার্থক্য


565

মধ্যে পার্থক্য কি getContext(), getApplicationContext(), getBaseContext(), এবং " this"?

যদিও এটি সাধারণ প্রশ্ন তবে আমি তাদের মধ্যে মূল পার্থক্য বুঝতে অক্ষম। সম্ভব হলে কিছু সহজ উদাহরণ দিন।


1
আছে: প্রথম উত্তর একটি চমৎকার কাজের মধ্যে থাকবেন হয় stackoverflow.com/questions/1026973/...
ky1enamic

উত্তর:


528
  • View.getContext(): দৃশ্যটি বর্তমানে চলছে এমন প্রসঙ্গটি ফিরিয়ে দেয় Usually সাধারণত বর্তমানে সক্রিয় ক্রিয়াকলাপ।

  • Activity.getApplicationContext(): পুরো অ্যাপ্লিকেশনটির প্রসঙ্গটি ফেরত দেয় (সমস্ত ক্রিয়াকলাপটি যে ক্রিয়াকলাপটির অভ্যন্তরে চলছে)। আপনার যদি কেবলমাত্র বর্তমান ক্রিয়াকলাপ নয়, পুরো অ্যাপ্লিকেশনটির জীবনচক্রের সাথে আবদ্ধ কোনও প্রসঙ্গের প্রয়োজন হয় তবে বর্তমান ক্রিয়াকলাপের প্রেক্ষাপটের পরিবর্তে এটি ব্যবহার করুন।

  • ContextWrapper.getBaseContext(): আপনার যদি অন্য প্রসঙ্গের মধ্যে থেকে কোনও প্রসঙ্গে অ্যাক্সেসের প্রয়োজন হয় তবে আপনি একটি কনটেক্সট্র্যাপার ব্যবহার করেন। প্রসঙ্গটি অভ্যন্তরীণ থেকে উল্লিখিত প্রসঙ্গটি getBaseContext () এর মাধ্যমে অ্যাক্সেস করা হয় Con


59
এবং "এই" সম্পর্কে কি?
শীতল i3oY

16
+ শীতল আই 3oY getContext এর সাথে একই
মিকি

13
আসলে আমি বিভ্রান্ত যে প্রসঙ্গে সঠিক সংজ্ঞা কি ??
রবি

11
"এটি" এবং getContext () উভয়ই এক
কেসিআরজু

43
thisএবং getContext()সবসময় হয় না কার্যকলাপের ক্লাসে একই যেমন, আপনি ব্যবহার করতে পারেন thisকারণ Activityথেকে উত্তরাধিকারী Contextকিন্তু পদ্ধতি getContext()নেই Activityবর্গ। @ মাইকেড্রয়েড @ কেসিআরজু
নন্দন

92

বেশিরভাগ উত্তর ইতিমধ্যে কভার করা হয়েছে 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();
    }
  }
}

17
আমি বলব, এটি কোনও গৃহীত উত্তর পাওয়ার পরে সবচেয়ে গুরুত্বপূর্ণ উত্তর।
0leg

4
আমি বলব যে ContextWrapperঅ্যান্ড্রয়েড কাঠামোর বিকাশকারীদের দ্বারা করা সবচেয়ে খারাপ সিদ্ধান্তগুলির মধ্যে একটি এর অস্তিত্ব । যখন তারা বুঝতে পেরেছিল যে তারা Godশ্বর অবজেক্টগুলির একটি সম্পূর্ণ পরিবার তৈরি করেছে, সঠিক কাজটি করার পরিবর্তে এবং একক দায়িত্বের প্রতি কোডটিকে পুনরায় প্রতিস্থাপনের পরিবর্তে, তারা একটি কুরুচিপূর্ণ হ্যাক যুক্ত করেছে যা উত্তরাধিকারসূত্রে গাছকে আরও গভীর করে কনটেক্সট আচরণকে পরিবর্তন করতে দেয়। খারাপ সফ্টওয়্যার ইঞ্জিনিয়ারিং এর অদ্বিতীয়তম। আমাদের হিসাবে, বিকাশকারীরা, আইএমএইচও কারও কখনও ব্যবহার করা উচিত নয় getBaseContext()বা ContextWrapper। আপনি যদি করেন - এটি একটি বিশাল "কোড গন্ধ"।
ভাসিলি

আমি সম্পূর্ণ CustomToastকোডটি দেখতে চাই । :) :)))
অ্যালস্টন

39

getApplicationContext () - প্রয়োগে চলমান সমস্ত ক্রিয়াকলাপের জন্য প্রসঙ্গটি ফেরত দেয়।

getBaseContext () - আপনি যদি অ্যাপ্লিকেশনের মধ্যে অন্য প্রসঙ্গ থেকে প্রসঙ্গ অ্যাক্সেস করতে চান তবে আপনি অ্যাক্সেস করতে পারেন।

getContext () - কেবলমাত্র চলমান ক্রিয়াকলাপটি প্রসঙ্গ দেখায় s


1
অনুগ্রহ করে আপনার প্রসঙ্গের সংজ্ঞায় সংজ্ঞায়িত করতে অক্ষর A এবং B অক্ষরকে অন্তর্ভুক্ত করুন, কোন প্রসঙ্গে কোন প্রসঙ্গে অ্যাক্সেস করা হয়েছে তা এটি পরিষ্কার নয়।
আশাকরি

29

"প্রসঙ্গটি কী" প্রশ্নটি অ্যান্ড্রয়েড মহাবিশ্বের সবচেয়ে জটিল একটি প্রশ্ন।

প্রসঙ্গটি এমন পদ্ধতিগুলি সংজ্ঞায়িত করে যা সিস্টেম সংস্থানগুলিতে অ্যাক্সেস করে, অ্যাপ্লিকেশনটির স্থিতিশীল সম্পদ পুনরুদ্ধার করে, অনুমতিগুলি পরীক্ষা করে, 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               |
+----------------------------+-------------+----------+---------+-----------------+-------------------+
  1. একটি অ্যাপ্লিকেশন এখান থেকে একটি ক্রিয়াকলাপ শুরু করতে পারে তবে এটির জন্য একটি নতুন টাস্ক তৈরি করা দরকার। এটি নির্দিষ্ট ব্যবহারের ক্ষেত্রে উপযুক্ত হতে পারে তবে আপনার আবেদনে অ-স্ট্যান্ডার্ড ব্যাক স্ট্যাক আচরণ তৈরি করতে পারে এবং সাধারণত সুপারিশ করা হয় না বা ভাল অনুশীলন হিসাবে বিবেচিত হয় না।
  2. এটি আইনী, তবে মুদ্রাস্ফীতিটি আপনি যে সিস্টেমটিতে চলেছেন তার ডিফল্ট থিম দিয়েই করা হবে, আপনার প্রয়োগে সংজ্ঞায়িত নয়।
  3. যদি রিসিভারটি নাল হয় তবে এটি অ্যান্ড্রয়েড ৪.২ এবং তারপরের উপরে স্টিকি ব্রডকাস্টের বর্তমান মান অর্জনের জন্য ব্যবহৃত হয়।

স্ক্রিনশট


আপনার সাথে লিঙ্কযুক্ত দুর্দান্ত ব্লগ পোস্ট!
লেজোনল

28

Contextনতুন তৈরি করা উপাদানগুলির Actvityবা সম্পর্কে তথ্য সরবরাহ করে Application

প্রাসঙ্গিক Contextনতুন নির্মিত উপাদানগুলিতে সরবরাহ করা উচিত (অ্যাপ্লিকেশন প্রসঙ্গ বা ক্রিয়াকলাপের প্রসঙ্গ যাই হোক না কেন)

যেহেতু Activityএকটি সাবক্লাস Context, তাই কেউ thisএই ক্রিয়াকলাপের প্রসঙ্গটি পেতে ব্যবহার করতে পারেন


বেসকন্টেক্সট সম্পর্কে আপনার ব্যাখ্যা কোথায়?
ইগোরগানাপলস্কি

1

এই ডক্স থেকে

আমি বুঝতে পারি যে আপনার ব্যবহার করা উচিত:

প্রসঙ্গ-ক্রিয়াকলাপের পরিবর্তে প্রসঙ্গ-প্রয়োগটি ব্যবহার করার চেষ্টা করুন


0

getApplicationContext ()

এটি অ্যাপ্লিকেশন স্তরের জন্য ব্যবহৃত হয় এবং সমস্ত ক্রিয়াকলাপ পড়ুন।

getContext () এবং getBaseContext ()

সম্ভবত এটি একই .এটি কেবল বর্তমান ক্রিয়াকলাপটি সরাসরি প্রচারিত যা সরাসরি is

এই

সর্বদা বর্তমান বর্গ অবজেক্ট উল্লেখ করুন।


0

Context:

  • একটি বিমূর্ত শ্রেণি যার প্রয়োগ অ্যান্ড্রয়েড সিস্টেম দ্বারা সরবরাহ করা হয়েছে।
  • এটি অ্যাপ্লিকেশন-নির্দিষ্ট সংস্থান এবং ক্লাসগুলির অ্যাক্সেসের পাশাপাশি অ্যাপ্লিকেশন-স্তরের ক্রিয়াকলাপগুলির জন্য যেমন আপ-ক্রিয়াকলাপগুলি যেমন লঞ্চিং কার্যক্রম, সম্প্রচার এবং উদ্দেশ্য গ্রহণ করা ইত্যাদির জন্য আপ কল দেয় allows
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.