كيفية استدعاء Activity من تطبيق آخر في Android: دليل كامل لـ Kotlin

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة: لماذا نستدعي Activity من تطبيق آخر؟

\n\n

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

\n\n

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

\n\n

بالمناسبة، أنت على موقع PythonLib، حيث نتحدث غالبًا عن Python، لكن اليوم حالة خاصة. تطوير Android باستخدام Kotlin هو مهارة قوية تتكامل بشكل رائع مع الواجهة الخلفية بلغة Python. هيا بنا!

\n\n

ما هو Intent ولماذا هو المفتاح للحل؟

\n\n

في Android، Intent هو رسالة تخبر النظام: "مرحبًا، أحتاج إلى القيام بشيء ما بهذا الإجراء". لـ تشغيل Activity من تطبيق آخر، يتم استخدام طريقتين:

\n\n
    \n
  • Intent صريح — تعرف بالضبط المكون الذي تريد تشغيله (مثل com.example.target.MainActivity). يعمل فقط إذا كان لديك حق الوصول إلى كود هذا التطبيق.
  • \n
  • Intent ضمني — تصف ما تريد القيام به (مثل "فتح الخريطة بالإحداثيات")، ويقوم النظام نفسه بالعثور على التطبيق المناسب. هذه طريقة أكثر مرونة وأمانًا لـ استدعاء Activity خارجي.
  • \n
\n\n

سنركز على Intents الضمنية، حيث يتم استخدامها غالبًا لـ التفاعل بين العمليات في Android.

\n\n

مثال أساسي: فتح الخريطة بالإحداثيات

\n\n

لنبدأ بمثال بسيط يوضح كيفية تشغيل Activity من تطبيق آخر لعرض خريطة.

\n\n
// Kotlin\nval gmmIntentUri = Uri.parse("geo:55.7558,37.6173?z=15")\nval mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri)\nmapIntent.setPackage("com.google.android.apps.maps")\n\n// نتحقق مما إذا كان هناك تطبيق يمكنه معالجة Intent\nif (mapIntent.resolveActivity(packageManager) != null) {\n    startActivity(mapIntent)\n} else {\n    // نعرض رسالة خطأ للمستخدم\n    Toast.makeText(this, "خرائط Google غير مثبتة", Toast.LENGTH_SHORT).show()\n}
\n\n

ماذا يحدث هنا؟ نقوم بإنشاء Intent مع إجراء ACTION_VIEW وURI يحتوي على الإحداثيات. ثم باستخدام setPackage، نحدد صراحة أننا نريد استخدام خرائط Google (على الرغم من أن هذا ليس إلزاميًا — يمكن للنظام تقديم خيار). الأهم هو التحقق عبر resolveActivity. هذا يحمي من تعطل التطبيق إذا كان التطبيق المطلوب غير موجود على الجهاز.

\n\n

سيناريو: استدعاء الكاميرا والحصول على النتيجة

\n\n

الآن ننتقل إلى حالة أكثر تعقيدًا — تشغيل Activity من تطبيق آخر مع انتظار النتيجة. مثال كلاسيكي: التقاط صورة والحصول عليها في تطبيقك.

\n\n
// Kotlin\nprivate const val REQUEST_IMAGE_CAPTURE = 1\n\nprivate fun dispatchTakePictureIntent() {\n    val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)\n    // نتحقق من أن الكاميرا متاحة\n    if (takePictureIntent.resolveActivity(packageManager) != null) {\n        startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE)\n    } else {\n        // معالجة الخطأ: الكاميرا غير موجودة\n    }\n}\n\noverride fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {\n    super.onActivityResult(requestCode, resultCode, data)\n    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == Activity.RESULT_OK) {\n        val imageBitmap = data?                

المدونات

توصيات الكتب