نقل البيانات بين أنشطة أندرويد. التواصل بين النشاط والخدمة. من قام بتأطير القطة فاسكا - نستعيد النتيجة

13.04.2022

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

يقوم MainActivity من الفئة العامة بتوسيع AppCompatActivity

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

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

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

لنقم بإنشاء ملف ترميز XML جديد Activity_about.xmlفي مجلد الدقة/التخطيط. انقر بزر الماوس الأيمن على المجلد تَخطِيطواختر من قائمة السياق جديد | ملف تخطيط الموارد. سيظهر مربع حوار. في الحقل الأول، أدخل اسم الملف Activity_about. في الثانية، تحتاج إلى إدخال العنصر الجذر. بشكل افتراضي هناك تخطيط القيد. امسح النص وأدخل عرض التمرير. إدخال بضعة أحرف يكفي للاستوديو لاقتراح خيارات جاهزة؛ يمكنك الضغط على Enter على الفور دون انتظار إدخال الكلمة كاملة:

سوف تحصل على الفراغ المقابل الذي سنقوم بإدراج العنصر فيه عرض النص.

سيتم استرداد المعلومات من الموارد، وهي مورد السلسلة about_text. الآن تم تمييزه باللون الأحمر، مما يشير إلى غياب المعلومات. كان من الممكن الضغط البديل + أدخلوأدخل النص في مربع الحوار. لكن بالنسبة لمثالنا، لن تعمل هذه الطريقة، نظرًا لأن النص سيكون متعدد الأسطر باستخدام أحرف التحكم. لذلك دعونا نفعل ذلك بشكل مختلف. دعونا نفتح الملف الدقة/القيم/strings.xmlوأدخل النص التالي يدويًا:

هناك بلوط أخضر بالقرب من Lukomorye؛\n هناك سلسلة ذهبية على تلك البلوط:\n ليلاً ونهارًا قطة عالمة\nكل شيء يدور في سلسلة؛\nيسير يمين- تبدأ الأغنية،\n غادر- يروي حكاية خرافية.

استخدمنا أبسط علامات تنسيق نص HTML مثل , , . على سبيل المثال، يكفي تسليط الضوء بالخط العريض على الكلمات التي تتعلق بالقطة واتجاه الحركة. لترجمة النص إلى خط جديداستخدام الرموز \n. دعونا نضيف مورد سلسلة آخر لعنوان الشاشة الجديدة:

حول البرنامج

لقد اكتشفنا العلامات. بعد ذلك تحتاج إلى إنشاء فئة للنافذة AboutActivity.java. اختر من القائمة ملف | جديد | فئة جافاواملأ الحقول المطلوبة. في البداية، يكفي الإشارة إلى الاسم فقط. ثم سوف تتعامل مع المجالات الأخرى.

دعونا نحصل على الفراغ.

الآن الفصل فارغ تقريبًا. دعونا نضيف الكود يدويا. يجب أن يرث الفصل من فئة مجردة نشاطأو أقاربه مثل نشاط التجزئة, AppCompatActivityإلخ. دعونا نضيف يمتد النشاط. يجب أن يكون لفئة النشاط طريقة عند الإنشاء (). ضع مؤشر الفأرة داخل الفصل واختر من القائمة الكود | طرق التجاوز(السيطرة+O). في مربع الحوار نبحث عن الفئة المطلوبة، يمكنك كتابة الأحرف الأولى على لوحة المفاتيح للبحث السريع. في الطريقة التي تم إنشاؤها تحتاج إلى استدعاء الطريقة setContentView()، والذي سيقوم بتحميل العلامة المعدة على الشاشة. سيكون لدينا هذا الخيار.

حزمة ru.alexanderklimov.helloworld; import android.app.Activity; استيراد android.os.Bundle؛ /** * أنشأه ألكسندر كليموف بتاريخ 2014/01/12.

*/ فئة عامة AboutActivity توسع النشاط ( @Override protected void onCreate(Bundle saveInstanceState) ( super.onCreate(savedInstanceState); setContentView(R.layout.activity_about); ) ) النشاط الرئيسيالآن يأتي الجزء الأكثر أهمية. مهمتنا هي الانتقال إلى شاشة جديدة عندما نضغط على الزر الموجود على الشاشة الأولى. دعونا نعود إلى الفصل

. لنكتب معالج النقر على الزر:

الفراغ العام عند النقر (عرض العرض) ( Intent Intent = new Intent(MainActivity.this, AboutActivity.class); startActivity(intent);)

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

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

هذا هو المكان الذي يكون فيه مورد السلسلة مفيدًا about_title. نقوم بتشغيل التطبيق، انقر فوق الزر والحصول على نافذة حول البرنامج. وهكذا تعلمنا كيفية إنشاء نافذة جديدة واستدعائها بالنقر فوق الزر. ولدينا الآن برنامج مريح للغاية تحت تصرفنا - الآن سيكون لدينا دائمًا في متناول اليد تلميح لما تفعله القطة عندما تتجه يسارًا.

مرة أخرى، يرجى ملاحظة أن فئة النشاط الثانية التي تم إنشاؤها يجب أن ترث من الفئة نشاطأو ما شابه ذلك ( نشاط القائمةوما إلى ذلك)، لديك ملف ترميز XML (إذا لزم الأمر) ويتم تحديده في البيان.

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

إنشاء شاشة ثالثة - طريقة للكسالى

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

في هذه الحالة، اختر من القائمة ملف | جديد | النشاط | النشاط الأساسي(أو قالب آخر). بعد ذلك، ستظهر النافذة المألوفة لإنشاء نشاط جديد. املأ الحقول المطلوبة.

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

أضف زرًا جديدًا إلى شاشة النشاط الرئيسية بنفسك واكتب رمزًا للتبديل إلى النشاط الذي تم إنشاؤه.

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

تمرير البيانات بين الأنشطة

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

منطقة extraDataهي قائمة الأزواج المفتاح/القيمة، والذي ينتقل مع النية. تُستخدم السلاسل كمفاتيح، ويمكن استخدام أي أنواع بيانات أولية ومصفوفات من الأوليات وكائنات فئة للقيم باقةإلخ.

لنقل البيانات إلى نشاط آخر، استخدم الطريقة وضع اكسترا ():

Intent.putExtra("Key", "Value");

يجب أن يستدعي نشاط الاستلام بعض الطرق المناسبة: getIntExtra(), getStringExtra ()إلخ.:

Int count = getIntent().getIntExtra("name", 0);

دعونا نعيد المثال السابق. لدينا بالفعل ثلاثة أنشطة. سيحتوي النشاط الأول على حقلين نصيين وزر. قد يكون المظهر على النحو التالي:

في النشاط الثاني النشاط الثانيتعيين العنصر عرض النصحيث سنعرض النص الوارد من النشاط الأول. لنكتب الكود التالي للطريقة عند الإنشاء ()في النشاط الثاني

@Override protected void onCreate(Bundle saveInstanceState) ( super.onCreate(savedInstanceState); setContentView(R.layout.activity_ Second); String user = "Animal"; String gift = "Donut Hole"; TextView infoTextView = (TextView)findViewById( R .id.textViewInfo); infoTextView.setText(user + "، لقد تم إعطاؤك" + gift);

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

دعونا نصحح الوضع. أضف الكود للنشاط الأول:

الفراغ العام onClick(عرض العرض) ( EditText userEditText = (EditText) findViewById(R.id.editTextUser); EditText giftEditText = (EditText) findViewById(R.id.editTextGift); Intentint = new Intent(MainActivity.this, SecondActivity. class)؛ // ادفع النص من حقل النص الأول إلى مفتاح اسم المستخدمint.putExtra("username"، userEditText.getText().toString()); // ادفع النص من حقل النص الثاني إلى مفتاح الهدية intent.putExtra("gift" ", giftEditText.getText().toString()); startActivity(intent); )

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

يجب أن يكون النشاط الثاني جاهزًا لاستقبال الرسائل بحرارة على النحو التالي (بالخط العريض).

// القيم الافتراضية String user = "Animal"; هدية سلسلة = "ثقب الدونات"؛ user = getIntent().getExtras().getString("اسم المستخدم"); gift = getIntent().getExtras().getString("gift"); TextView infoTextView = (TextView)findViewById(R.id.textViewInfo); infoTextView.setText(user + "، لقد تم إعطاؤك" + gift);

الآن تبدو الرسالة أقل هجومًا، بل وممتعة بالنسبة للبعض. في الأمثلة المعقدة، يُنصح بإضافة علامة اختيار عند معالجة البيانات. قد تكون هناك مواقف حيث تقوم بتشغيل نشاط ثانٍ ببيانات فارغة من النوع باطل، مما قد يتسبب في تعطل التطبيق.

في حالتنا، نعلم أننا نتوقع قيمة سلسلة، لذلك يمكن إعادة كتابة الكود على النحو التالي:

نية النية = getIntent(); user =intent.getStringExtra("اسم المستخدم");

المستخدم = getIntent().getStringExtra("اسم المستخدم");

البرنامج له عيب - ليس من الواضح ممن نتلقى التحيات. لن يقبل أي قرد ذو تربية جيدة هدية من مصدر مجهول. لذلك، كواجب منزلي، قم بإضافة حقل نصي آخر لإدخال اسم المستخدم الذي يرسل الرسالة.

توصي Google باستخدام التنسيق التالي للمفاتيح: اسم الحزمة الخاصة بك كبادئة، متبوعًا بالمفتاح نفسه. في هذه الحالة، يمكنك التأكد من تفرد المفتاح عند التفاعل مع التطبيقات الأخرى. شيء من هذا القبيل:

السلسلة الثابتة النهائية العامة USER = "ru.alexanderklimov.myapp.USER"؛

من قام بتأطير القطة فاسكا - نستعيد النتيجة

لا يكفي دائمًا تمرير البيانات إلى نشاط آخر. في بعض الأحيان تحتاج إلى استعادة المعلومات من نشاط آخر عند إغلاقه. إذا استخدمنا الطريقة في وقت سابق startActivity (نية النية)، ثم هناك طريقة ذات صلة startActivityForResult (نية النية، رمز الطلب int). الفرق بين الطرق هو المعلمة الإضافية رمز الطلب. إنه في الأساس مجرد رقم صحيح يمكنك التوصل إليه بنفسك. إنه ضروري للتمييز ممن جاءت النتيجة. لنفترض أن لديك خمس شاشات إضافية وقمت بتعيين قيم من 1 إلى 5 لها، وباستخدام هذا الرمز يمكنك تحديد النتيجة التي تريد معالجتها. يمكنك استخدام القيمة -1، وستكون مماثلة لاستدعاء الطريقة . بعد هذا يتم استدعاء الطريقة، أي. لن نحصل على أي نتائج.

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

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

قدم أحد الزوار سلسلة من الصور من جهاز iPhone الخاص به:


وهناك أيضاً شهادة من شاهد آخر: وفاسكا يستمع ويأكل.

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