tag - uses permission android




ما هو "السياق" على نظام Android؟ (20)

في برمجة Android ، ما هو بالضبط فئة Context وما الذي يتم استخدامه؟

قرأت عنه في موقع المطور ، لكني غير قادر على فهمه بوضوح.


طالما أنك تفكر على أي حال ، فكر مليًا.

واجهة لمعلومات عالمية حول بيئة تطبيق. هذه هي فئة تجريدية يتم توفير تطبيقها بواسطة نظام Android.

ويسمح بالوصول إلى الموارد والفئات الخاصة بالتطبيقات ، فضلاً عن المكالمات الصادرة عن العمليات على مستوى التطبيقات مثل أنشطة الإطلاق والبث والاستلام ، وما إلى ذلك.


Boss Assistant Analogy

Lets have a small analogy before diving deep in the technicality of Context

Every Boss has an assistant or someone( errand boy) who does less important and more time consuming things for him. For example if they need a file or coffee then an assistant will be on run. Boss will not know what is going on in the background but the file or the task will be delivered

So Here
Boss - Android Application
Assistant - Context
File or cup of coffee - Resource

What official Android Developper site says about Context

Context is your accesss point for application related resources

Lets see some of such resources or tasks

  • Launching an activity.

  • Getting absolute path to the application specific cache directory on the filesystem.

  • Determining whether the given permission is allowed for a particular process and user ID running in the system.

  • Checking whether you have been granted a particular permission.

وما إلى ذلك وهلم جرا.
So if Android application wants to start an activity, it goes straight to Context (Access Point), and the Context class gives him back the resources(Intent in this case).

Like any other class Context class too has fields and methods.
You can explore more about Context in official documentation, it covers pretty much everything, available methods, fields and even how to use fields with methods.


إذا كنت ترغب في توصيل سياق مع فئات مألوفة أخرى في Android ، فضع في اعتبارك هذه البنية:

السياق <ContextWrapper <التطبيق

السياق <ContextWrapper <ContextThemeWrapper <النشاط

السياق <ContextWrapper <ContextThemeWrapper <النشاط <ListActivity

السياق <ContextWrapper <الخدمة

السياق <ContextWrapper <الخدمة <IntentService

إذن ، كل هذه الطبقات هي سياقات بطريقتها الخاصة. يمكنك تقديم الخدمة وقائمة النشاط إلى السياق إذا كنت ترغب في ذلك. ولكن إذا نظرت عن قرب ، فإن بعض الفئات ترث الموضوع أيضًا. في النشاط أو الجزء ، ترغب في تطبيقه على وجهات نظرك ، ولكن لا يهمك ذلك فئة الخدمة ، على سبيل المثال.

أشرح الفرق في السياقات here .


إن Android Context هو Interface تسمح بالوصول إلى موارد وفئة معينة من التطبيقات ومعلومات حول بيئة التطبيقات.

إذا كان تطبيقك على Android تطبيقًا على الويب ، فسيكون سياقك شيئًا مشابهًا لـ ServletContext (لا أقوم بإجراء مقارنة دقيقة هنا)

كما تعمل أنشطتك وخدماتك على توسيع السياق بحيث ترث جميع هذه الطرق للوصول إلى معلومات البيئة التي يتم تشغيل التطبيق فيها.


السياق هو أساسا للوصول إلى الموارد والحصول على تفاصيل البيئة من التطبيق (لسياق التطبيق) أو النشاط (لسياق النشاط) أو أي دولة أخرى ...

لتجنب تسرب الذاكرة ، يجب استخدام سياق التطبيق لكل المكونات التي تحتاج إلى كائن سياق .... لمزيد من الضغط here


السياق هو سياق الحالة الحالية للتطبيق / object.Its كيان يمثل بيانات بيئة مختلفة. يساعد السياق النشاط الحالي على التفاعل مع بيئة Android الجانبية مثل الملفات المحلية وقواعد البيانات ومحامل الطبقة المرتبطة بالبيئة والخدمات بما في ذلك الخدمات على مستوى النظام والمزيد.

السياق هو مؤشر على النظام. ويوفر خدمات مثل حل الموارد ، والحصول على قواعد البيانات والتفضيلات ، وهلم جرا. يحتوي تطبيق Android على أنشطة. إنها تشبه مؤشر البيئة الذي يتم تشغيل التطبيق عليه حاليًا. يرث كائن النشاط كائن السياق.

أساليب الاستدعاء المختلفة التي يمكنك من خلالها الحصول على السياق 1. getApplicationContext ()، 2. getContext ()، 3. getBaseContext () 4. أو هذا (عندما تكون في فئة النشاط).


السياق هو مثيلات للفئة android.content.Context لتوفير الاتصال لنظام Android الذي ينفذ التطبيق. على سبيل المثال ، يمكنك التحقق من حجم عرض الجهاز الحالي عبر السياق.

كما يتيح الوصول إلى موارد المشروع. إنها الواجهة إلى معلومات عالمية حول بيئة التطبيق.

توفر فئة السياق أيضًا الوصول إلى خدمات Android ، على سبيل المثال ، مدير التنبيه لتشغيل أحداث تستند إلى الوقت.

الأنشطة والخدمات توسيع فئة السياق. لذلك يمكن استخدامها مباشرة للوصول إلى السياق.


السياق هو مرجع للكائن الحالي كهذا. كما يسمح السياق بالوصول إلى المعلومات المتعلقة ببيئة التطبيق.


توفر فئة android.content.Context الاتصال بنظام Android وموارد المشروع. إنها الواجهة إلى معلومات عالمية حول بيئة التطبيق.

يوفر السياق أيضًا إمكانية الوصول إلى خدمات Android ، مثل خدمة الموقع.

تمدد الأنشطة والخدمات فئة Context .


فقط وضعه هناك للمبتدئين.

إذن ، فهم أولاً سياق الكلمات:

في اللغة الإنجليزية lib. هذا يعني:

"الظروف التي تشكل الإعداد لحدث أو بيان أو فكرة ، ومن حيث يمكن فهمها وتقييمها بشكل كامل."

"أجزاء من شيء مكتوب أو منطوق يسبق مباشرة وتتبع كلمة أو مقطع ويوضح معناها".

الآن تأخذ نفس الفهم لبرمجة العالم:

سياق الحالة الحالية للتطبيق / الكائن. يتيح للكائنات المنشأة حديثا فهم ما يجري. عادة ما تسميها للحصول على معلومات تتعلق بجزء آخر من برنامجك (نشاط ، حزمة / تطبيق)

يمكنك الحصول على السياق عن طريق استدعاء getApplicationContext() أو getContext(), getBaseContext() أو this (عندما تكون في فئة النشاط).

للحصول على سياق في أي مكان في التطبيق ، استخدم الرمز التالي:

إنشاء AppContext فئة جديدة داخل تطبيق الروبوت الخاص بك

public class AppContext extends Application {

    private static Context context;

    public void onCreate(){
        super.onCreate();
        AppContext.context = getApplicationContext();
    }

    public static Context getAppContext() {
        return AppContext.context;
    }
}

الآن في أي وقت تريد فيه سياق التطبيق في فئة غير الأنشطة ، اتصل بهذه الطريقة ولديك سياق التطبيق.

نأمل أن تكون هذه المساعدة ؛)


مثال بسيط لفهم context في android:

كل رئيس لديه مساعد لرعاية ، للقيام بكل المهام أقل أهمية وتستغرق وقتا طويلا. إذا كان هناك حاجة ملف أو فنجان من القهوة ، ومساعد هو هارب. بعض الرؤساء بالكاد يعرفون ما يجري في المكتب ، لذلك يسألون مساعديهم بشأن هذا أيضا. إنهم يقومون ببعض الأعمال بأنفسهم ولكن بالنسبة لمعظم الأشياء الأخرى فإنهم يحتاجون إلى مساعدة من مساعديهم.

في هذا السيناريو،

بوس - هو تطبيق الروبوت

مساعد - هو السياق

ملفات / كوب من القهوة - هي الموارد

نسمي السياق بوجه عام عندما نحتاج إلى الحصول على معلومات حول الأجزاء المختلفة من طلبنا مثل الأنشطة والتطبيقات وما إلى ذلك.

بعض العمليات (أشياء تحتاج إلى مساعد) عندما يكون السياق مشتملاً:

تحميل الموارد المشتركة إنشاء طرق عرض ديناميكية عرض رسائل التوست إطلاق الأنشطة إلخ. طرق مختلفة للحصول على السياق:

getContext()

getBaseContext()

getApplicationContext()

this

واجهة لمعلومات عالمية حول بيئة تطبيق. هذه هي فئة تجريدية يتم توفير تطبيقها بواسطة نظام Android. ويسمح بالوصول إلى الموارد والفئات الخاصة بالتطبيقات ، فضلاً عن المكالمات الصادرة عن العمليات على مستوى التطبيقات مثل أنشطة الإطلاق والبث والاستلام ، وما إلى ذلك.


وضعه ببساطة:

كما يوحي الاسم ، هو سياق الحالة الحالية للتطبيق / الكائن. يتيح للكائنات المنشأة حديثًا فهم ما يجري. عادةً ما تسميها للحصول على معلومات تتعلق بجزء آخر من برنامجك (النشاط والحزمة / التطبيق).

يمكنك الحصول على السياق عن طريق استدعاء getApplicationContext() أو getContext() أو getBaseContext() أو this (عندما تكون في فئة تمتد من Context ، مثل فئات التطبيق والنشاط والخدمة وخدمة IntentService).

الاستخدامات النموذجية للسياق:

  • إنشاء كائنات جديدة : إنشاء طرق عرض جديدة ومحولات ومستمعين:

    TextView tv = new TextView(getContext());
    ListAdapter adapter = new SimpleCursorAdapter(getApplicationContext(), ...);
    
  • الوصول إلى الموارد القياسية القياسية : خدمات مثل LAYOUT_INFLATER_SERVICE ، SharedPreferences:

    context.getSystemService(LAYOUT_INFLATER_SERVICE)
    getApplicationContext().getSharedPreferences(*name*, *mode*);
    
  • الوصول إلى المكونات ضمنيًا : فيما يتعلق بموفري المحتوى والبث والنية

    getApplicationContext().getContentResolver().query(uri, ...);
    

Source

يبدو أن موضوع السياق في Android يربك الكثيرين. يعلم الناس أن السياق مطلوب في كثير من الأحيان للقيام بالأشياء الأساسية في Android. يشعر الناس بالذعر أحيانًا لأنهم يحاولون تنفيذ بعض العمليات التي تتطلب السياق وهم لا يعرفون كيفية "الحصول على" السياق الصحيح. سأحاول إزالة الغموض عن فكرة السياق في Android. إن المعالجة الكاملة للمشكلة تقع خارج نطاق هذا المنشور ، ولكن سأحاول تقديم نظرة عامة حتى يكون لديك إحساس بماهية السياق وكيفية استخدامه. لفهم السياق ، دعنا نلقي نظرة على شفرة المصدر:

https://github.com/android/platform_frameworks_base/blob/master/core/java/android/content/Context.java

ما هو السياق بالضبط؟

حسنًا ، توفر الوثائق نفسها شرحًا واضحًا إلى حد ما: تعتبر فئة السياق "واجهة إلى معلومات عالمية حول بيئة تطبيق".

يتم تعريف فئة السياق نفسها على أنها فئة تجريدية ، ويتم توفير تطبيقها بواسطة نظام تشغيل Android. كما تنص الوثائق أيضًا على أن السياق "... يسمح بالوصول إلى الموارد والفئات الخاصة بالتطبيقات ، فضلاً عن المكالمات الصادرة عن العمليات على مستوى التطبيقات مثل إطلاق الأنشطة ، والبث والاستلام ، وما إلى ذلك".

يمكنك أن تفهم جيدًا الآن ، لماذا الاسم هو السياق. انها لأنها مجرد ذلك. يوفر السياق الرابط أو الخطاف ، إذا شئت ، لنشاط أو خدمة أو أي مكون آخر ، وبالتالي ربطه بالنظام ، مما يتيح الوصول إلى بيئة التطبيقات العامة. بمعنى آخر: يوفر السياق الإجابة على سؤال المكونات "أين الجحيم بالنسبة للتطبيق بشكل عام وكيف يمكنني الوصول إلى / التواصل مع باقي التطبيق؟" إذا كان كل هذا يبدو مربكًا بعض الشيء ، نظرة على الطرق التي تعرضها طبقة السياق توفر بعض القرائن الأخرى عن طبيعتها الحقيقية.

إليك عينة عشوائية من هذه الطرق:

  1. getAssets()
  2. getResources()
  3. getPackageManager()
  4. getString()
  5. getSharedPrefsFile()

ما الذي تشترك فيه كل هذه الطرق؟ فهي تمكّن جميع الأشخاص الذين لديهم إمكانية الوصول إلى السياق من الوصول إلى الموارد على مستوى التطبيق.

وبمعنى آخر ، يقوم السياق بتوصيل المكوّن الذي يحتوي على مرجع إلى باقي بيئة التطبيق. تتوفر الأصول (مجلد 'think' / assets 'في مشروعك) ، على سبيل المثال ، عبر التطبيق ، شريطة أن يكون النشاط أو الخدمة أو أي شيء يعرف كيفية الوصول إلى تلك الموارد. وينطبق نفس الشيء على getResources() الذي يسمح بفعل أشياء مثل getResources().getColor() التي ستقوم colors.xml مورد colors.xml (ما يعني أن aapt يمكن من الوصول إلى الموارد عبر java code ، هذه مشكلة منفصلة).

النتيجة هي أن Context هو الذي يمكّن من الوصول إلى موارد النظام ومكوناته المكوّنة في "التطبيق الأعظم". دعونا ننظر إلى الفئات الفرعية من Context ، وهي الفئات التي توفر تطبيق فئة Context التجريدي. فئة Activity . يرث Activity من ContextThemeWrapper ، الذي يرث من ContextWrapper ، والذي يرث من Context ContextWrapper الفئات مفيدة للنظر إلى فهم الأشياء على مستوى أعمق ، ولكن الآن يكفي أن نعرف أن ContextWrapper و ContextWrapper إلى حد كبير ما تقوم بتطبيق العناصر المجردة لفئة Context نفسها من خلال "التفاف" سياق (السياق الفعلي) وتفويض تلك الوظائف إلى هذا السياق. مثال مفيد - في فئة ContextWrapper ، getAssets الأسلوب المجرد من فئة Context يتم تنفيذه على النحو التالي:

@Override
    public AssetManager getAssets() {
        return mBase.getAssets();
    }

mBase هو ببساطة حقل تم تعيينه بواسطة المُنشئ إلى سياق محدد. لذلك يتم التفاف سياق و يفوض ContextWrapper تطبيقه للأسلوب getAssets إلى ذلك السياق. لنعد إلى دراسة فئة Activity التي ترث في النهاية من Context لترى كيف يعمل هذا كله.

من المحتمل أنك تعرف ما هو النشاط ، ولكن لمراجعة - إنه في الأساس أمر واحد يمكن للمستخدم القيام به. ويعتني بتوفير نافذة لوضع واجهة المستخدم بحيث يتفاعل المستخدم مع ". قد يعتقد المطورون المطلعون على واجهات برمجة التطبيقات (APIs) الأخرى وحتى غير المطوِّرين أنها لغة عامية "كشاشة". وهذا غير دقيق تقنيًا ، ولكنه لا يهم أهدافنا. إذن كيف يتفاعل Activity Context وما الذي يحدث بالضبط في علاقة الإرث؟

مرة أخرى ، من المفيد أن ننظر إلى أمثلة محددة. نحن جميعا نعرف كيفية إطلاق الأنشطة. بشرط أن يكون لديك "السياق" الذي تقوم أنت من خلاله ببدء النشاط ، يمكنك ببساطة استدعاء startActivity(intent) ، حيث تصف Intent السياق الذي تبدأ منه نشاطًا والنشاط الذي تريد startActivity(intent) . هذه هي startActivity(this, SomeOtherActivity.class) مألوفة startActivity(this, SomeOtherActivity.class) .

وما this ؟ this هو نشاطك لأن فئة Activity ترث من Context . المجلة الكاملة هي كالتالي: عند استدعاء startActivity ، startActivity فئة Activity في النهاية أمرًا كالتالي:

Instrumentation.ActivityResult ar =
                mInstrumentation.execStartActivity(
                    this, mMainThread.getApplicationThread(), mToken, this,
                    intent, requestCode);

لذلك يستخدم execStartActivity من فئة Instrumentation (بالفعل من فئة داخلية في Instrumentation تسمى ActivityResult ).

في هذه المرحلة ، بدأنا في الحصول على نظرة خاطفة على النظام الداخلي.

هذا هو المكان الذي يعالج فيه نظام التشغيل في الواقع كل شيء. إذن كيف تبدأ أجهزة القياس نشاطها بالضبط؟ حسنا ، هذه المعلمة في طريقة execStartActivity أعلاه هي نشاطك ، أي السياق ، و execStartActivity تستخدم هذا السياق.

نظرة عامة على 30،000 هي: فئة الأجهزة تحافظ على مسارات قائمة الأنشطة التي تقوم بمراقبتها من أجل القيام بعملها. يتم استخدام هذه القائمة لتنسيق جميع الأنشطة والتأكد من أن كل شيء يسير بسلاسة في إدارة تدفق الأنشطة.

هناك بعض العمليات التي لم أكن قد نظرت فيها بشكل كامل في أي موضوع تنسيق ومشاكل عملية. في نهاية المطاف ، يستخدم ActivityResult عملية أصلية - ActivityManagerNative.getDefault().startActivity() الذي يستخدم Context الذي تم تمريره عند استدعاء startActivity . يستخدم السياق الذي تم تمريره للمساعدة في "حل النية" إذا لزم الأمر. نية القرار هي العملية التي يمكن من خلالها أن يحدد النظام هدف النية إذا لم يتم توفيره. (راجع الدليل هنا لمزيد من التفاصيل).

ولكي يتمكن Android من القيام بذلك ، يحتاج إلى الوصول إلى المعلومات التي يوفرها Context . على وجه التحديد ، يحتاج النظام إلى الوصول إلى ContentResolver حتى يتمكن من "تحديد نوع MIME لبيانات الهدف". هذا startActivity الكامل حول كيفية استخدام startActivity للسياق كان معقدًا إلى حد ما ، ولا أفهم تمامًا الجوانب الداخلية. كانت النقطة الرئيسية لتوضيح كيفية الحاجة إلى الوصول إلى الموارد على مستوى التطبيق من أجل تنفيذ العديد من العمليات الأساسية للتطبيق ، Context هو ما يوفر الوصول إلى هذه الموارد ، وقد يكون المثال الأبسط هو المشاهدات. يمكنك إنشاء طريقة عرض مخصصة عن طريق توسيع RelativeLayout أو بعض فئات View الأخرى ، يجب أن توفر منشئًا يأخذ سياقًا كوسيطة ، وعندما تقوم بإنشاء مثيل مخصص لك في السياق ، فلماذا؟ الوصول إلى السمات ، والموارد ، وغيرها من تفاصيل تكوين التكوين ، يعد تكوين طريقة العرض مثالًا رائعًا ، حيث يحتوي كل سياق على معلمات مختلفة (حقول في تطبيقات Context ) يتم تعيينها بواسطة نظام التشغيل نفسه أشياء مثل البعد أو الكثافة للشاشة. من السهل معرفة سبب أهمية هذه المعلومات في إعداد الملفات الشخصية ، وما إلى ذلك.

كلمة أخيرة: لسبب ما ، يبدو أن الأشخاص الجدد على Android (وحتى الأشخاص غير الجدد) ينسون تمامًا البرمجة الكائنية عندما يتعلق الأمر بنظام Android. لسبب ما ، يحاول الناس ثني تطوير Android إلى نماذج مسبقة أو سلوكيات مستفادة.

يحتوي Android على نموذج خاص به ونمط معين ثابت تمامًا في الواقع إذا تركت أفكارك المسبقة وقرأت ببساطة دليل الوثائق والدليل. لكن النقطة الحقيقية ، في حين أن "الحصول على السياق الصحيح" يمكن أن يكون صعباً في بعض الأحيان ، فإن الناس يشعرون بالذعر بلا مبرر لأنهم يواجهون وضعاً حيث يحتاجون إلى السياق ويعتقدون أنه لا يملكونه. مرة أخرى ، Java لغة موجهة للكائنات مع تصميم ميراث.

أنت فقط "تمتلك" السياق داخل نشاطك لأن نشاطك نفسه يرث من السياق. لا يوجد سحر لها (باستثناء كل الأشياء التي يقوم بها نظام التشغيل بنفسه لتعيين معلمات مختلفة ولتكوين سياقك بشكل صحيح). لذا ، وضع مشاكل الذاكرة / الأداء جانبا (على سبيل المثال ، عقد مراجع للسياق عندما لا تحتاج إلى ذلك أو تنفيذه بطريقة لها عواقب سلبية على الذاكرة ، الخ) ، السياق هو كائن مثل أي شيء آخر ويمكن أن ينتقل تماما مثل أي POJO (كائن جافا قديم عادي). في بعض الأحيان قد تحتاج إلى القيام بأشياء ذكية لاسترداد هذا السياق ، ولكن يمكن كتابة أي فئة Java عادية تمتد من شيء آخر غير الكائن نفسه بطريقة الوصول إلى السياق ؛ ببساطة قم بعرض أسلوب عام يأخذ سياقًا ثم استخدمه في تلك الفئة حسب الحاجة. لم يكن المقصود من هذا هو العلاج الشامل على السياق أو الروبوت الداخلي ، ولكن آمل أن يكون مفيدًا في إزالة الغموض عن السياق قليلاً.


Context means component (or application) in various time-period. If I do eat so many food between 1 to 2 pm then my context of that time is used to access all methods (or resources) that I use during that time. Content is an component (application) for particular time. Context of components of application keeps changing based on the underlying lifecycle of the components or application. For instance, inside the onCreate() of an Activity ,

getBaseContext() -- gives the context of the Activity that is set (created) by the constructor of activity. getApplicationContext() -- gives the Context setup (created) during the creation of application.

Note: <application> holds all Android Components.

<application>
    <activity> .. </activity> 

    <service>  .. </service>

    <receiver> .. </receiver>

    <provider> .. </provider>
</application> 

It means, when you call getApplicationContext() from inside whatever component, you are calling the common context of the whole application.

Context keeps being modified by the system based on the lifecycle of components.


Context means current. Context use to do operation for current screen. السابق.
1. getApplicationContext()
2. getContext()

Toast.makeText(getApplicationContext(), "hello", Toast.LENGTH_SHORT).show();

ANDROID AND CONTEXT إذا نظرت عبر واجهات برمجة تطبيقات Android المختلفة ، فستلاحظ أن العديد منها يستخدم كائن android.content.Context كمعلمة. سترى أيضًا أنه يتم استخدام النشاط أو الخدمة عادة كسياق. هذا يعمل لأن كلا من هذه الفئات تمتد من السياق.

ما هو السياق بالضبط؟ وفقًا للوثائق المرجعية لنظام Android ، فهي كيان يمثل بيانات البيئة المختلفة. ويوفر الوصول إلى الملفات المحلية ، وقواعد البيانات ، ورافعات الطبقة المرتبطة بالبيئة ، والخدمات بما في ذلك الخدمات على مستوى النظام ، وأكثر من ذلك. خلال هذا الكتاب وفي التشفير اليومي باستخدام Android ، سترى السياق مرارًا بشكل متكرر. من: كتاب "Android in Practice".


السياق عبارة عن واجهة إلى معلومات عمومية حول بيئة تطبيق. إنها فئة تجريدية يتم توفير تطبيقها بواسطة نظام Android .

يسمح Context بالوصول إلى الموارد والفئات الخاصة بالتطبيقات ، فضلاً عن المكالمات للعمليات على مستوى التطبيقات مثل launching activities, broadcasting and receiving intents, etc.

هنا مثال

 public class MyActivity extends Activity {

      public void Testing() {

      Context actContext = this; /*returns the Activity Context since   Activity extends Context.*/

      Context appContext = getApplicationContext();    /*returns the context of the single, global Application object of the current process. */

      Button BtnShowAct1 = (Button) findViewById(R.id.btnGoToAct1);
      Context BtnContext = BtnShowAct1.getContext();   /*returns the context of the View. */

لمزيد من التفاصيل ، يمكنك زيارة Context


In Java, we say this keyword refers to the state of the current object of the application.
Similarly, in an alternate we have Context in Android Development.

This can be defined either explicitly or implicitly,

Context con = this;

getApplicationContext();

getBaseContext();

getContext();

This attribute declares which activity this layout is associated with by default .





android-context