একটি কনটেক্সট পেতে বিভিন্ন পদ্ধতির মধ্যে পার্থক্য কী?


390

অ্যান্ড্রয়েড কোডের বিটগুলিতে আমি দেখেছি:

 public class MyActivity extends Activity {
    public void method() {
       mContext = this;    // since Activity extends Context
       mContext = getApplicationContext();
       mContext = getBaseContext();
    }
 }

তবে আমি কোন সুনির্দিষ্ট ব্যাখ্যা খুঁজে পাচ্ছি না যার মধ্যে কোনটি পছন্দনীয় এবং কোন পরিস্থিতিতে কোনটি ব্যবহার করা উচিত।

এটি সম্পর্কে ডকুমেন্টেশনের নির্দেশক এবং ভুলটি বেছে নেওয়া হলে কী ভাঙতে পারে সে সম্পর্কে দিকনির্দেশনা প্রশংসিত হবে।


2
এই লিঙ্কটি আপনাকে সাহায্য করতে পারে। দিয়ে যান এই ..
Aju

উত্তর:


305

আমি সম্মত হলাম যে অ্যান্ড্রয়েডের প্রসঙ্গগুলির জন্য ডকুমেন্টেশনগুলি অল্প পরিমাণে আসে, তবে আপনি বিভিন্ন উত্স থেকে কয়েকটি তথ্য একসাথে করতে পারেন।

অফিসিয়াল গুগল অ্যান্ড্রয়েড বিকাশকারী ব্লগের এই ব্লগ পোস্টটি বেশিরভাগ ক্ষেত্রে মেমরির ফাঁসের সমাধানে সহায়তা করার জন্য লেখা হয়েছিল, তবে প্রসঙ্গগুলি সম্পর্কে কিছু ভাল তথ্যও সরবরাহ করে:

নিয়মিত অ্যান্ড্রয়েড অ্যাপ্লিকেশনটিতে আপনার কাছে সাধারণত দুটি ধরণের প্রসঙ্গ, ক্রিয়াকলাপ এবং অ্যাপ্লিকেশন থাকে।

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

অ্যান্ড্রয়েড এসডিকে নিয়ে কাজ করা একজন গুগল ইঞ্জিনিয়ার ডায়ান হ্যাকোবারের পোস্ট ব্যতীত কখন getBaseContext () ব্যবহার করতে হবে সে সম্পর্কে সত্যই আমি কিছুই খুঁজে পাইনি:

GetBaseContext () ব্যবহার করবেন না, কেবলমাত্র আপনার প্রসঙ্গটি ব্যবহার করুন।

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

সুতরাং সামগ্রিকভাবে যখন সম্ভব হবে তখন বৈশ্বিক প্রয়োগের প্রসঙ্গটি ব্যবহার করা ভাল।


13
যখন আমার একটি ক্রিয়াকলাপ A থাকে যা ক্রিয়াকলাপ বি শুরু করতে পারে যা ঘুরেফিরে এটিকে CLEAR_TOP পতাকা দিয়ে পুনরায় চালু করতে পারে (এবং সম্ভবত এই চক্রটি বহুবার পুনরাবৃত্তি করতে পারে) - এর বিশাল ট্রেইল তৈরি না করার জন্য এই ক্ষেত্রে আমার কী প্রসঙ্গে ব্যবহার করা উচিত? রেফারেন্সড কনটেক্সট? ডায়ানা বলে গেটবেসেক্সটেক্সট এর পরিবর্তে 'এটি' ব্যবহার করে তবে ... বেশিরভাগ সময় এ পুনরায় ব্যবহার করা হবে তবে এমন পরিস্থিতিতে রয়েছে যখন এ এর ​​জন্য একটি নতুন অবজেক্ট তৈরি হবে এবং তারপরে পুরানো এ ফাঁস হবে। সুতরাং মনে হচ্ছে getBaseContext বেশিরভাগ ক্ষেত্রে সবচেয়ে উপযুক্ত পছন্দ choice তাহলে কেন তা পরিষ্কার নয় Don't use getBaseContext()। কেউ কি এই ব্যাখ্যা করতে পারে?
জেবিএম

2
ক্রিয়াকলাপ প্রসারিত না করে এমন কোনও শ্রেণীর অভ্যন্তরীণ বিষয়বস্তুটিতে কীভাবে কেউ প্রবেশ করতে পারে?
কোল

1
@ কোল, আপনি একটি শ্রেণি তৈরি করতে পারেন, যা আমরা এখানে "উদাহরণক্লাস" বলব, যার নির্মাতা একটি প্রসঙ্গ বস্তু গ্রহণ করে এবং একটি শ্রেণীর উদাহরণ পরিবর্তনশীল, "অ্যাপকন্টেক্সট" ইনস্ট্যান্ট করে। তারপরে, আপনার ক্রিয়াকলাপ শ্রেণি (বা অন্য কোনও ক্লাসের জন্য) একটি উদাহরণক্লাস পদ্ধতিতে কল করতে পারে যা উদাহরণ ক্লাসের "অ্যাপকন্টেক্সট" উদাহরণটি পরিবর্তনশীল ব্যবহার করে।
আর্কি 1986

54

এর ব্যবহার সম্পর্কে আমি যা পেয়েছি তা এখানে context:

1)। মধ্যে একটি Activityনিজেই, ব্যবহার thisলেআউট এবং মেনু বৃদ্ধি, রেজিস্টার প্রসঙ্গ মেনু, উইজেট শুরু করতে গিয়ে জন্য, অন্যান্য কার্যক্রম শুরু, নতুন তৈরি Intentএকটি মধ্যে Activityশুরু করতে গিয়ে পছন্দ, বা অন্যান্য পদ্ধতি একটি পাওয়া যায়, Activity

স্ফুটনা বিন্যাস:

View mView = this.getLayoutInflater().inflate(R.layout.myLayout, myViewGroup);

স্ফীত মেনু:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);
    this.getMenuInflater().inflate(R.menu.mymenu, menu);
    return true;
}

প্রসঙ্গ মেনু নিবন্ধন করুন:

this.registerForContextMenu(myView);

ইনস্ট্যান্ট উইজেট:

TextView myTextView = (TextView) this.findViewById(R.id.myTextView);

একটি শুরু করুন Activity:

Intent mIntent = new Intent(this, MyActivity.class);
this.startActivity(mIntent);

পছন্দগুলি ইনস্ট্যান্ট করুন:

SharedPreferences mSharedPreferences = this.getPreferenceManager().getSharedPreferences();

2)। অ্যাপ্লিকেশন-বিস্তৃত শ্রেণীর জন্য, getApplicationContext()প্রয়োগের আজীবন এই প্রসঙ্গটি বিদ্যমান হিসাবে ব্যবহার করুন ।

বর্তমান অ্যান্ড্রয়েড প্যাকেজের নাম পুনরুদ্ধার করুন:

public class MyApplication extends Application {    
    public static String getPackageName() {
        String packageName = null;
        try {
            PackageInfo mPackageInfo = getApplicationContext().getPackageManager().getPackageInfo(getApplicationContext().getPackageName(), 0);
            packageName = mPackageInfo.packageName;
        } catch (NameNotFoundException e) {
            // Log error here.
        }
        return packageName;
    }
}

অ্যাপ্লিকেশন-বিস্তৃত শ্রেণিতে বাঁধুন:

Intent mIntent = new Intent(this, MyPersistent.class);
MyServiceConnection mServiceConnection = new MyServiceConnection();
if (mServiceConnection != null) {
    getApplicationContext().bindService(mIntent, mServiceConnection, Context.BIND_AUTO_CREATE);
}

3)। শ্রোতাদের এবং অন্যান্য ধরণের অ্যান্ড্রয়েড ক্লাসগুলির জন্য (যেমন কনটেক্সটসবার্সার), একটি প্রসঙ্গে প্রতিস্থাপন ব্যবহার করুন:

mContext = this;    // Example 1
mContext = context; // Example 2

যেখানে thisবা contextশ্রেণীর প্রসঙ্গ (ক্রিয়াকলাপ ইত্যাদি)।

Activity প্রসঙ্গ প্রতিস্থাপন:

public class MyActivity extends Activity {
    private Context mContext;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);        
        mContext = this;
    }
}

শ্রোতার প্রসঙ্গে বিকল্প:

public class MyLocationListener implements LocationListener {
    private Context mContext;
    public MyLocationListener(Context context) {
        mContext = context;
    }
}

ContentObserver প্রসঙ্গ প্রতিস্থাপন:

public class MyContentObserver extends ContentObserver {
    private Context mContext;
    public MyContentObserver(Handler handler, Context context) {
        super(handler);
        mContext = context;
    }
}

4)। জন্য BroadcastReceiver(inlined / এমবেডেড রিসিভার সহ) রিসিভারের নিজস্ব প্রসঙ্গের ব্যবহার করুন।

বাহ্যিক BroadcastReceiver:

public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        final String action = intent.getAction();
        if (action.equals(Intent.ACTION_SCREEN_OFF)) {
            sendReceiverAction(context, true);
        }
        private static void sendReceiverAction(Context context, boolean state) {
            Intent mIntent = new Intent(context.getClass().getName() + "." + context.getString(R.string.receiver_action));
            mIntent.putExtra("extra", state);
            context.sendBroadcast(mIntent, null);
        }
    }
}

অন্তর্ভুক্ত / এম্বেড করা BroadcastReceiver:

public class MyActivity extends Activity {
    private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            final boolean connected = intent.getBooleanExtra(context.getString(R.string.connected), false);
            if (connected) {
                // Do something.
            }
        }
    };
}

5)। পরিষেবাদির জন্য, পরিষেবার নিজস্ব প্রসঙ্গ ব্যবহার করুন।

public class MyService extends Service {
    private BroadcastReceiver mBroadcastReceiver;
    @Override
    public void onCreate() {
        super.onCreate();
        registerReceiver();
    }
    private void registerReceiver() {
        IntentFilter mIntentFilter = new IntentFilter();
        mIntentFilter.addAction(Intent.ACTION_SCREEN_OFF);
        this.mBroadcastReceiver = new MyBroadcastReceiver();
        this.registerReceiver(this.mBroadcastReceiver, mIntentFilter);
    } 
}

6)। টোস্টের জন্য, সাধারণত ব্যবহার করুন getApplicationContext(), তবে যেখানে সম্ভব, কোনও ক্রিয়াকলাপ, পরিষেবা ইত্যাদি থেকে পাস করা প্রসঙ্গটি ব্যবহার করুন

আবেদনের প্রসঙ্গটি ব্যবহার করুন:

Toast mToast = Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG);
mToast.show();

উত্স থেকে পাস করা প্রসঙ্গ ব্যবহার করুন:

public static void showLongToast(Context context, String message) {
    if (context != null && message != null) {
        Toast mToast = Toast.makeText(context, message, Toast.LENGTH_LONG);
        mToast.show();
    }
}

এবং সর্বশেষে, getBaseContext()অ্যান্ড্রয়েডের ফ্রেমওয়ার্ক বিকাশকারীদের পরামর্শ অনুযায়ী ব্যবহার করবেন না ।

আপডেট:Context ব্যবহারের উদাহরণ যুক্ত করুন ।


1
এমকন্টেক্সট এর পরিবর্তে কেউ ব্যবহার করতে পারে OuterClass.this; মন্তব্য দেখতে stackoverflow.com/questions/9605459/...
পল Verest

3
এই ধরনের সহায়ক উত্তরের জন্য +1! আমি সম্মত হই যে স্বীকৃত উত্তর গৃহীত উত্তর হিসাবে ঠিক আছে, তবে পবিত্র মোলির এই উত্তরটি অত্যন্ত তথ্যমূলক ছিল! এই সমস্ত উদাহরণের জন্য আপনাকে ধন্যবাদ, তারা সামগ্রিকভাবে প্রসঙ্গের ব্যবহারটি আরও ভালভাবে বুঝতে আমাকে সহায়তা করেছে। এমনকি আমি আপনার উত্তরটি আমার মেশিনের একটি পাঠ্য ফাইলে রেফারেন্স হিসাবে অনুলিপি করেছি।
রায়ান

13

আমি এই থ্রেডটি কয়েকদিন আগে পড়েছিলাম, নিজেকে একই প্রশ্ন জিজ্ঞাসা করছি। এটি পড়ার পরে আমার সিদ্ধান্তটি সহজ ছিল: সর্বদা অ্যাপ্লিকেশন কনটেক্সট ব্যবহার করুন।

যাইহোক, আমি এটির সাথে একটি সমস্যার মুখোমুখি হয়েছি, এটি খুঁজে পেতে আমি কয়েক ঘন্টা ব্যয় করেছি এবং এটি সমাধানের জন্য কয়েক সেকেন্ড ... (একটি শব্দ পরিবর্তন করে ...)

আমি একটি স্পিনার সহ একটি ভিউ ফুলিয়ে তোলার জন্য একটি লেআউটআইনফ্লেটার ব্যবহার করছি।

সুতরাং এখানে দুটি সম্ভাবনা রয়েছে:

1)

    LayoutInflater layoutInflater = LayoutInflater.from(this.getApplicationContext());

2)

    LayoutInflater layoutInflater = LayoutInflater.from(this.getBaseContext());

তারপরে, আমি এই জাতীয় কিছু করছি:

    // managing views part
    View view = ContactViewer.mLayoutInflater.inflate(R.layout.aViewContainingASpinner, theParentView, false);
    Spinner spinner = (Spinner) view.findViewById(R.id.theSpinnerId);
    String[] myStringArray = new String[] {"sweet","love"};

    // managing adapter part
    // The context used here don't have any importance -- both work.
    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this.getApplicationContext(), myStringArray, android.R.layout.simple_spinner_item);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinner.setAdapter(adapter);

    theParentView.addView(view);

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

আপনি যদি বেসকন্টেক্সট ব্যবহার করেন তবে ঠিক আছে, প্রসঙ্গ মেনুটি খুলবে এবং আপনি আপনার পছন্দগুলির মধ্যে চয়ন করতে সক্ষম হবেন।

সুতরাং এখানে আমার উপসংহারটি দেওয়া হয়েছে: আমি মনে করি (আপনার ক্রিয়াকলাপে প্রসঙ্গমেনু নিয়ে কাজ করার সময় বেসকন্টেক্সট প্রয়োজনের চেয়ে আমি (আমি এটির আরও পরীক্ষা করিনি)

পরীক্ষাটি এপিআই 8 এর সাথে কোডিং করা হয়েছে এবং একটি এইচটিসি ডিজায়ার, Android 2.3.3 এ পরীক্ষা করা হয়েছে on

আমি আশা করি আমার মন্তব্য আপনাকে এখনও বিরক্ত করেনি, এবং আপনাকে শুভেচ্ছা জানায়। শুভ কোডিং ;-)


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

6

প্রথমত, আমি সম্মত হই যে যখনই সম্ভব আমাদের অ্যাপকন্টেক্সট ব্যবহার করা উচিত। তারপরে ক্রিয়াকলাপে "এটি"। আমার কখনই বেসকন্টেক্সটের দরকার পড়েনি।

আমার পরীক্ষাগুলিতে, বেশিরভাগ ক্ষেত্রে এগুলি বদলে যেতে পারে। বেশিরভাগ ক্ষেত্রে, আপনি যে প্রসঙ্গে একটি প্রসঙ্গ ধরে রাখতে চান তা ফাইল, পছন্দসমূহ, ডাটাবেস ইত্যাদি অ্যাক্সেস করা These আপনি কোন প্রসঙ্গটি ব্যবহার করেন না কেন, সেগুলি একই ফোল্ডারে / ফাইলগুলিতে ম্যাপ করা হবে যাতে আপনি ঠিক আছেন।

এটাই আমি লক্ষ্য করেছি। হতে পারে এমন কেস রয়েছে যা আপনার আলাদা করা উচিত।


আরম্ভের সময় অ্যাপ্লিকেশনটির ভাষাটি বিশ্বব্যাপী সেট করার জন্য আমার বেসকনেক্সট দরকার ছিল (যখন এটি ফোনের ডিফল্ট ল্যাংয়ের সাথে মেলে না)।
টিনা

3

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

((YourActivity) context).yourCallbackMethod(yourResultFromThread, ...);

2

সহজ কথায়

getApplicationContext()পদ্ধতির নাম অনুসারে আপনার অ্যাপ্লিকেশনটির যে কোনও জায়গা থেকে অ্যাক্সেস করতে পারবেন এমন অ্যাপ্লিকেশন বিস্তৃত বিবরণ সম্পর্কে আপনার অ্যাপকে সচেতন করা হবে। তাই আপনি পরিষেবা বাঁধাই, সম্প্রচারের রেজিস্ট্রেশন ইত্যাদিতে এটি ব্যবহার করতে পারবেন Application contextঅ্যাপটি প্রস্থান না হওয়া অবধি বেঁচে থাকবে।

getActivity()বা thisআপনার অ্যাপ্লিকেশনটিকে বর্তমান স্ক্রিন সম্পর্কে সচেতন করে তুলবে যা সরবরাহিত অ্যাপ স্তরের বিশদটিও দৃশ্যমান application context। সুতরাং আপনি বর্তমানের পর্দার মতো যা কিছু জানতে চান Window ActionBar Fragementmangerএবং তা এই প্রসঙ্গে উপলব্ধ। মূলত এবং Activityপ্রসারিত Context। বর্তমান উপাদান (ক্রিয়াকলাপ) জীবিত না হওয়া পর্যন্ত এই প্রসঙ্গটি বেঁচে থাকবে


1

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

getContext()
getBaseContext()
getApplicationContext()
getActionBar().getThemedContext() //new

প্রসঙ্গ কী? আমি ব্যক্তিগতভাবে কনটেক্সটকে যে কোনও সময় আপনার আবেদনের রাজ্য হিসাবে ভাবতে চাই। অ্যাপ্লিকেশন প্রসঙ্গটি আপনার অ্যাপ্লিকেশনটির একটি গ্লোবাল বা বেস কনফিগারেশন উপস্থাপন করে এবং কোনও ক্রিয়াকলাপ বা পরিষেবা এটি তৈরি করতে পারে এবং এটি আপনার অ্যাপ্লিকেশনটির কনফিগারেশন উদাহরণ বা এর জন্য একটি ট্রানজিটিভ রাষ্ট্রের প্রতিনিধিত্ব করে।

আপনি যদি android.content.Context এর উত্সটি লক্ষ্য করেন তবে দেখতে পাবেন যে প্রসঙ্গটি একটি বিমূর্ত শ্রেণি এবং ক্লাসে মন্তব্যগুলি নীচে রয়েছে:

একটি অ্যাপ্লিকেশন পরিবেশ সম্পর্কে বিশ্বব্যাপী তথ্যের ইন্টারফেস। এটি একটি বিমূর্ত শ্রেণি যার প্রয়োগটি অ্যান্ড্রয়েড সিস্টেম দ্বারা সরবরাহ করা হয়েছে। এটি application-specificসংস্থানসমূহ এবং ক্লাসগুলিতে অ্যাক্সেসের পাশাপাশি application-levelক্রিয়াকলাপ চালু করা, সম্প্রচার এবং উদ্দেশ্যগুলি গ্রহণের মতো ক্রিয়াকলাপগুলির জন্য আপ কল দেয় I আমি যা এড়িয়ে যাই তা হ'ল কনটেক্সট অ্যাপ্লিকেশন স্তরের পাশাপাশি সিস্টেম স্তরের অ্যাক্সেসের জন্য একটি সাধারণ বাস্তবায়ন সরবরাহ করে সম্পদ। অ্যাপ্লিকেশন স্তরের সংস্থানগুলি স্ট্রিং রিসোর্স [getResources()]বা সম্পদ [getAssets()]এবং সিস্টেম-স্তরের সংস্থানগুলির মতো জিনিসগুলিতে অ্যাক্সেস করতে পারে যা আপনার সাথে অ্যাক্সেস করেContext.getSystemService().

প্রকৃতপক্ষে, পদ্ধতিগুলি সম্পর্কে মন্তব্যগুলি একবার দেখুন এবং তারা এই ধারণাটিকে আরও দৃforce় বলে মনে হচ্ছে:

getSystemService(): system-levelনাম অনুসারে কোনও পরিষেবাতে হ্যান্ডেলটি ফিরিয়ে দিন । প্রত্যাবর্তিত বস্তুর ক্লাস অনুরোধ করা নাম অনুসারে পরিবর্তিত হয়। getResources(): আপনার অ্যাপ্লিকেশন এর প্যাকেজের জন্য একটি উত্স উদাহরণ দিন। getAssets(): আপনার অ্যাপ্লিকেশন এর প্যাকেজের জন্য একটি উত্স উদাহরণ দিন। এটি উল্লেখ করার মতো হতে পারে যে প্রসঙ্গত বিমূর্ত শ্রেণিতে উপরোক্ত সমস্ত পদ্ধতি বিমূর্ত! গেটসিস্টেম সার্ভিস (ক্লাস) এর কেবলমাত্র একটি উদাহরণের একটি প্রয়োগ রয়েছে এবং এটি একটি বিমূর্ত পদ্ধতিটি আহ্বান করে। এর অর্থ, এর জন্য বাস্তবায়ন বেশিরভাগ বাস্তবায়নকারী ক্লাস দ্বারা সরবরাহ করা উচিত, যার মধ্যে রয়েছে:

ContextWrapper
Application
Activity
Service
IntentService

এপিআই ডকুমেন্টেশনের দিকে তাকালে ক্লাসের শ্রেণিবিন্যাসটি এরকম দেখাচ্ছে:

প্রসঙ্গ

| - কনটেক্সট র্যাপার

| - - আবেদন

| - - কনটেক্সট থিম র‍্যাপার

| - - - - ক্রিয়াকলাপ

| - - পরিষেবা

| - - - ইনটেন্স সার্ভিস

যেহেতু আমরা জানি যে Contextনিজেই কোনও অন্তর্দৃষ্টি সরবরাহ করছে না, তাই আমরা গাছের নীচে নেমে এসে দেখে নিই ContextWrapperএবং বুঝতে পারি যে সেখানে খুব একটা নেই। অ্যাপ্লিকেশনটি যেহেতু প্রসারিত হয়েছে ContextWrapper, তাই এটি সরবরাহের বাস্তবায়নটিকে ওভাররাইড না করে সেদিকে নজর দেওয়ার মতো খুব বেশি কিছু নেই ContextWrapper। এর অর্থ হ'ল প্রসঙ্গের জন্য বাস্তবায়ন ওএস দ্বারা সরবরাহ করা হয়েছে এবং এটি থেকে গোপন API। কনটেক্সট আইপিএল ক্লাসের উত্সটি দেখে আপনি কনটেক্সটের জন্য কংক্রিট বাস্তবায়নটি একবার দেখে নিতে পারেন।


0

আমি কেবল এটি ব্যবহার করেছি এবং getBaseContextযখন onClickজাভা এবং অ্যান্ড্রয়েড উভয়ের কাছে খুব সবুজ নুব টোস্টিং করি । আমি যখন এটি ক্লিক করি যখন আমার ক্লিককারী সরাসরি কার্যকলাপে থাকে এবং getBaseContextকোনও বেনামে অভ্যন্তরীণ ক্লিককারী ব্যবহার করতে হয়। আমি অনুমান করছি যে এটি কৌশলটি বেশ কার্যকর getBaseContext, এটি সম্ভবত অভ্যন্তরীণ শ্রেণিটি যে কার্যকলাপে লুকিয়ে রয়েছে তার প্রসঙ্গে ফিরে আসবে।


1
এটি ভুল, এটি ক্রিয়াকলাপের নিজেই বেস প্রসঙ্গটি ফিরিয়ে দিচ্ছে। বেনামি অভ্যন্তর শ্রেণীর থেকে ক্রিয়াকলাপটি (যা আপনি প্রসঙ্গ হিসাবে ব্যবহার করতে চান) পেতে এর মতো কিছু ব্যবহার করুন MyActivity.this। আপনি যেমন বর্ণনা করেছেন তেমন বেস প্রসঙ্গটি ব্যবহার করা সমস্যার কারণ হবে না তবে এটি ভুল।
নিকমার্টেনস 1980
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.