إرسال بيانات بسيطة إلى تطبيقات أخرى

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

يوفّر Android طريقتَين للمستخدمين لمشاركة البيانات بين التطبيقات:

  • تم تصميم "قائمة مشاركة البيانات" من Android في المقام الأول لإرسال المحتوى خارج تطبيقك و/أو إلى مستخدم آخر مباشرةً. على سبيل المثال، مشاركة عنوان URL مع صديق.
  • يُعد برنامج حل النية بالشراء من Android هو الأنسب لتمرير البيانات إلى المرحلة التالية من مهمة محددة جيدًا. على سبيل المثال، يتم فتح ملف PDF من تطبيقك والسماح للمستخدمين باختيار العارض المفضّل لديهم.

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

مميزات استخدام "قائمة مشاركة البيانات من Android"

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

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

تتضمّن "قائمة مشاركة البيانات" من Android أيضًا العديد من الميزات المفيدة للمطوّرين. على سبيل المثال، يمكنك إجراء ما يلي:

استخدام "قائمة مشاركة البيانات" من Android

بالنسبة إلى جميع أنواع المشاركة، أنشِئ هدفًا واضبط الإجراء على Intent.ACTION_SEND. لعرض "قائمة مشاركة البيانات من Android"، يمكنك استدعاء Intent.createChooser()، وتمرير كائن Intent إليه. ويعرض هذا النموذج نسخة من الغرض الذي يعرض دائمًا "قائمة مشاركة البيانات من Android".

إرسال محتوى نصي

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

Kotlin

val sendIntent: Intent = Intent().apply {
    action = Intent.ACTION_SEND
    putExtra(Intent.EXTRA_TEXT, "This is my text to send.")
    type = "text/plain"
}

val shareIntent = Intent.createChooser(sendIntent, null)
startActivity(shareIntent)

Java

Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send.");
sendIntent.setType("text/plain");

Intent shareIntent = Intent.createChooser(sendIntent, null);
startActivity(shareIntent);

يمكنك اختياريًا إضافة عناصر إضافية لتضمين المزيد من المعلومات، مثل مستلمي الرسالة الإلكترونية (EXTRA_EMAIL وEXTRA_CC وEXTRA_BCC) وموضوع الرسالة الإلكترونية (EXTRA_SUBJECT) وغير ذلك.

ملاحظة: تتوقّع بعض تطبيقات البريد الإلكتروني، مثل Gmail، أن يتوفر String[] على الميزات الإضافية مثل EXTRA_EMAIL وEXTRA_CC. يمكنك استخدام putExtra(String, String[]) لإضافة هذه العناصر إلى هدفك.

إرسال محتوى ثنائي

مشاركة البيانات الثنائية باستخدام الإجراء ACTION_SEND اضبط نوع MIME المناسب وضَع معرّف موارد منتظم (URI) للبيانات في السمة EXTRA_STREAM الإضافية، كما هو موضّح في المثال التالي. ويشيع استخدامه لمشاركة صورة، ولكن يمكن استخدامه لمشاركة أي نوع من المحتوى الثنائي.

Kotlin

val shareIntent: Intent = Intent().apply {
    action = Intent.ACTION_SEND
    // Example: content://com.google.android.apps.photos.contentprovider/...
    putExtra(Intent.EXTRA_STREAM, uriToImage)
    type = "image/jpeg"
}
startActivity(Intent.createChooser(shareIntent, null))

Java

Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
// Example: content://com.google.android.apps.photos.contentprovider/...
shareIntent.putExtra(Intent.EXTRA_STREAM, uriToImage);
shareIntent.setType("image/jpeg");
startActivity(Intent.createChooser(shareIntent, null));

يحتاج التطبيق المستلِم إلى إذن للوصول إلى البيانات التي تشير إليها Uri. هناك طريقتان مقترحتان للقيام بذلك:

  • عليك تخزين البيانات في ContentProvider، مع التأكّد من أنّ التطبيقات الأخرى لديها الإذن الصحيح للوصول إلى موفِّر الخدمة. إنّ الآلية المفضّلة لتوفير إمكانية الوصول هي استخدام أذونات حسب معرّف الموارد المنتظم (URI)، وهي أذونات مؤقتة تمنح التطبيق المستلِم فقط إمكانية الوصول. إحدى الطرق السهلة لإنشاء ContentProvider مثل هذه هي استخدام فئة المساعدة FileProvider.
  • استخدِم النظام MediaStore. إنّ السمة MediaStore مخصّصة بشكل أساسي لأنواع الفيديو والصوت والصور بتنسيق MIME. ومع ذلك، بدءًا من Android 3.0 (المستوى 11 من واجهة برمجة التطبيقات)، يمكن أيضًا تخزين الأنواع بخلاف الوسائط. لمزيد من المعلومات، يُرجى الاطّلاع على MediaStore.Files. يمكن إدراج الملفات في MediaStore باستخدام scanFile()، وبعد ذلك، يتم تمرير Uri النمط content:// المناسب للمشاركة إلى onScanCompleted() معاودة الاتصال المقدَّمة. يُرجى العِلم بأنّه بعد إضافة المحتوى إلى النظام MediaStore، يمكن لأي تطبيق على الجهاز الوصول إليه.

استخدام نوع MIME الصحيح

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

تسجيل المستلمين لـ يرسل المرسلون
text/*
  • text/plain
  • text/rtf
  • text/html
  • text/json
`image/*`
  • image/jpg
  • image/png
  • image/gif
video/*
  • video/mp4
  • video/3gp
امتدادات الملفات المتوافقة application/pdf

لمزيد من المعلومات حول أنواع MIME، يُرجى الاطّلاع على السجلّ الرسمي لأنواع وسائط MIME في IANA.

قد تعرض "قائمة المشاركة في Android" معاينة للمحتوى، استنادًا إلى نوع MIME الذي تم تقديمه. لا تتوفّر بعض ميزات المعاينة إلا لأنواع معيّنة.

مشاركة عدة أجزاء من المحتوى

لمشاركة عدة أجزاء من المحتوى، استخدِم إجراء ACTION_SEND_MULTIPLE مع قائمة معرّفات الموارد المنتظمة (URI) التي تشير إلى المحتوى. يختلف نوع MIME وفقًا لمزيج المحتوى الذي تشاركه. على سبيل المثال، إذا شاركت ثلاث صور بتنسيق JPEG، يمكنك استخدام النوع "image/jpg". بالنسبة إلى مزيج من أنواع الصور، استخدِم "image/*" لمطابقة نشاط يعالج أي نوع من الصور. وعلى الرغم من أنّه من الممكن مشاركة مزيج من الأنواع، لا ننصح بذلك بشدة لأنّه لا يكون واضحًا للمستلِم ما تريد إرساله. إذا كان من الضروري إرسال عدة أنواع، استخدِم "*/*". إن الأمر متروك لتطبيق الاستلام لتحليل البيانات ومعالجتها. إليك مثال على ذلك:

Kotlin

val imageUris: ArrayList<Uri> = arrayListOf(
        // Add your image URIs here
        imageUri1,
        imageUri2
)

val shareIntent = Intent().apply {
    action = Intent.ACTION_SEND_MULTIPLE
    putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris)
    type = "image/*"
}
startActivity(Intent.createChooser(shareIntent, null))

Java

ArrayList<Uri> imageUris = new ArrayList<Uri>();
imageUris.add(imageUri1); // Add your image URIs here
imageUris.add(imageUri2);

Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND_MULTIPLE);
shareIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris);
shareIntent.setType("image/*");
startActivity(Intent.createChooser(shareIntent, null));

تأكَّد من أنّ عناصر Uri المقدّمة تشير إلى البيانات التي يمكن لتطبيق مستلِم الوصول إليها.

إضافة محتوى وافٍ إلى معاينات النص

بدءًا من نظام التشغيل Android 10 (المستوى 29 من واجهة برمجة التطبيقات)، تعرض "قائمة مشاركة البيانات" في Android معاينة للنص الذي تتم مشاركته. في بعض الحالات، قد يكون من الصعب فهم النص الذي تتم مشاركته. يمكنك مشاركة عنوان URL معقّد، مثل https://www.google.com/search?ei=2rRVXcLkJajM0PEPoLy7oA4. يمكن للمعاينة الأكثر فائدة طمأنة المستخدمين بما تتم مشاركته.

إذا كنت تعاين النص، يمكنك ضبط عنوان أو صورة مصغّرة أو كليهما. يُرجى إضافة وصف إلى "Intent.EXTRA_TITLE" قبل طلب الرقم Intent.createChooser()، وإضافة صورة مصغّرة ذات صلة باستخدام ClipData.

ملاحظة: يتم توفير معرِّف الموارد المنتظم (URI) الخاص بمحتوى الصورة من FileProvider، ويكون عادةً من <cache-path> تم ضبطه. لمزيد من المعلومات، يُرجى الاطّلاع على مشاركة الملفات. تأكد من منح منصة Sharesheet الأذونات المناسبة لقراءة أي صورة تريد استخدامها كصورة مصغّرة. لمزيد من المعلومات، يُرجى الاطّلاع على Intent.FLAG_GRANT_READ_URI_PERMISSION.

إليك مثال على ذلك:

Kotlin

 val share = Intent.createChooser(Intent().apply {
      action = Intent.ACTION_SEND
      putExtra(Intent.EXTRA_TEXT, "https://developer.android.com/training/sharing/")

      // (Optional) Here you're setting the title of the content
      putExtra(Intent.EXTRA_TITLE, "Introducing content previews")

      // (Optional) Here you're passing a content URI to an image to be displayed
      data = contentUri
      flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
  }, null)
  startActivity(share)

Java

Intent sendIntent = new Intent(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, "https://developer.android.com/training/sharing/");

// (Optional) Here you're setting the title of the content
sendIntent.putExtra(Intent.EXTRA_TITLE, "Introducing content previews");

// (Optional) Here you're passing a content URI to an image to be displayed
sendIntent.setData(contentUri);
sendIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

// Show the Sharesheet
startActivity(Intent.createChooser(sendIntent, null));

تبدو المعاينة كما يلي:

إضافة إجراءات مخصصة إلى ورقة المشاركة

لقطة شاشة للإجراءات المخصّصة في "قائمة مشاركة البيانات" من Android.

في نظام التشغيل Android 14 (المستوى 34 لواجهة برمجة التطبيقات) والإصدارات الأحدث، يمكن للتطبيقات إضافة إجراءات مخصَّصة إلى "قائمة مشاركة البيانات" من Android. وتظهر الإجراءات المخصّصة على شكل رموز إجراءات صغيرة أعلى "قائمة مشاركة البيانات" في Android، ويمكن للتطبيقات تحديد أي Intent كإجراء تم استدعاؤه عند النقر على الرمز.

لإضافة إجراءات مخصّصة في "قائمة مشاركة البيانات" في Android، عليك أولاً إنشاء ChooserAction باستخدام ChooserAction.Builder. ويمكنك تحديد "PendingIntent" كالإجراء الذي تم استدعاءه عند النقر على الرمز. أنشِئ مصفوفة تتضمّن جميع إجراءاتك المخصَّصة وحدِّدها على أنّها EXTRA_CHOOSER_CUSTOM_ACTIONS للمشاركة Intent.

Kotlin

val sendIntent = Intent(Intent.ACTION_SEND)
    .setType("text/plain")
    .putExtra(Intent.EXTRA_TEXT, text)
val shareIntent = Intent.createChooser(sendIntent, null)
val customActions = arrayOf(
    ChooserAction.Builder(
        Icon.createWithResource(context, R.drawable.ic_custom_action),
        "Custom",
        PendingIntent.getBroadcast(
            context,
            1,
            Intent(Intent.ACTION_VIEW),
            PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_CANCEL_CURRENT
        )
    ).build()
)
shareIntent.putExtra(Intent.EXTRA_CHOOSER_CUSTOM_ACTIONS, customActions)
context.startActivity(shareIntent)

Java

Intent sendIntent = new Intent(Intent.ACTION_SEND)
        .setType("text.plain")
        .putExtra(Intent.EXTRA_TEXT, text);
Intent shareIntent = Intent.createChooser(sendIntent, null);
ChooserAction[] actions = new ChooserAction[]{
        new ChooserAction.Builder(
                Icon.createWithResource(context, R.drawable.ic_custom_action),
                "Custom",
                PendingIntent.getBroadcast(
                        context,
                        1,
                        new Intent(Intent.ACTION_VIEW),
                        PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_CANCEL_CURRENT
                )
        ).build()
};
shareIntent.putExtra(Intent.EXTRA_CHOOSER_CUSTOM_ACTIONS, actions);
context.startActivity(shareIntent);

إضافة استهدافات مخصّصة

تتيح لك "قائمة المشاركة في Android" تحديد ما يصل إلى عنصرَين ChooserTarget يتم عرضهما قبل اختصارات المشاركة وأهداف أداة الاختيار المحمَّلة من ChooserTargetServices. يمكنك أيضًا تحديد ما يصل إلى هدفين يشيران إلى الأنشطة المدرجة قبل اقتراحات التطبيق:

إضافة Intent.EXTRA_CHOOSER_TARGETS وIntent.EXTRA_INITIAL_INTENTS إلى هدف المشاركة بعد الاتصال Intent.createChooser():

Kotlin

val share = Intent.createChooser(myShareIntent, null).apply {
    putExtra(Intent.EXTRA_CHOOSER_TARGETS, myChooserTargetArray)
    putExtra(Intent.EXTRA_INITIAL_INTENTS, myInitialIntentArray)
}

Java

Intent shareIntent = Intent.createChooser(sendIntent, null);
share.putExtra(Intent.EXTRA_CHOOSER_TARGETS, myChooserTargetArray);
share.putExtra(Intent.EXTRA_INITIAL_INTENTS, myInitialIntentArray);

يُرجى استخدام هذه الميزة بحرص. وتقلل كل Intent وChooserTarget مخصّصة تضيفها من العدد الذي يقترحه النظام. ونحن لا ننصح عمومًا بإضافة استهدافات مخصّصة ومن الأمثلة الشائعة المناسبة لإضافة السمة Intent.EXTRA_INITIAL_INTENTS هي تقديم إجراءات إضافية يمكن للمستخدمين اتّخاذها بشأن المحتوى المشترَك. على سبيل المثال، يشارك المستخدم الصور ويُستخدَم Intent.EXTRA_INITIAL_INTENTS للسماح له بإرسال رابط بدلاً من ذلك. ومن الأمثلة الشائعة المناسبة لإضافة Intent.EXTRA_CHOOSER_TARGETS عرض الأشخاص أو الأجهزة ذات الصلة التي يوفّرها تطبيقك.

استبعاد أهداف معينة حسب المكون

يمكنك استبعاد استهدافات معيّنة من خلال تقديم Intent.EXTRA_EXCLUDE_COMPONENTS. لا تنفِّذ هذا الإجراء إلا لإزالة الأهداف التي يمكنك التحكّم فيها. تتمثل إحدى حالات الاستخدام الشائعة في إخفاء أهداف مشاركة التطبيق عندما يشارك المستخدمون من داخل التطبيق، حيث يُحتمل أن تتم مشاركته خارج التطبيق.

إضافة Intent.EXTRA_EXCLUDE_COMPONENTS إلى هدفك بعد الاتصال بالرقم Intent.createChooser():

Kotlin

  val share = Intent.createChooser(Intent(), null).apply {
    // Only use for components you have control over
    val excludedComponentNames = arrayOf(ComponentName("com.example.android", "ExampleClass"))
    putExtra(Intent.EXTRA_EXCLUDE_COMPONENTS, excludedComponentNames)
  }

Java

  Intent shareIntent = Intent.createChooser(new Intent(), null);
  // Only use for components you have control over
  ComponentName[] excludedComponentNames = {
          new ComponentName("com.example.android", "ExampleClass")
  };
  shareIntent.putExtra(Intent.EXTRA_EXCLUDE_COMPONENTS, excludedComponentNames);

الحصول على معلومات حول المشاركة

قد يكون من المفيد معرفة الوقت الذي يشارك فيه المستخدمون المحتوى والهدف الذي يختارونه. تتيح لك "قائمة مشاركة البيانات من Android" الحصول على هذه المعلومات من خلال توفير ComponentName للأهداف التي يختارها المستخدمون باستخدام IntentSender.

عليك أولاً إنشاء PendingIntent لـ "BroadcastReceiver" وتوفير IntentSender الخاص بها في "Intent.createChooser()":

Kotlin

var share = Intent(Intent.ACTION_SEND)
// ...
val pi = PendingIntent.getBroadcast(
    myContext, requestCode,
    Intent(myContext, MyBroadcastReceiver::class.java),
    PendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
)
share = Intent.createChooser(share, null, pi.intentSender)

Java

Intent share = new Intent(ACTION_SEND);
...
PendingIntent pi = PendingIntent.getBroadcast(myContext, requestCode,
        new Intent(myContext, MyBroadcastReceiver.class),
        PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_UPDATE_CURRENT);
share = Intent.createChooser(share, null, pi.getIntentSender());

يمكنك تلقّي معاودة الاتصال خلال MyBroadcastReceiver والاطّلاع على Intent.EXTRA_CHOSEN_COMPONENT:

Kotlin

override fun onReceive(context: Context, intent: Intent) {
  ...
  val clickedComponent : ComponentName = intent.getParcelableExtra(EXTRA_CHOSEN_COMPONENT);
}

Java

@Override public void onReceive(Context context, Intent intent) {
  ...
  ComponentName clickedComponent = intent.getParcelableExtra(EXTRA_CHOSEN_COMPONENT);
}

إضافة إجراءات مخصصة إلى ورقة المشاركة

في نظام التشغيل Android 14 (المستوى 34 لواجهة برمجة التطبيقات) والإصدارات الأحدث، يمكن للتطبيقات إضافة إجراءات مخصَّصة إلى "قائمة مشاركة البيانات" من Android. إنشاء ChooserAction باستخدام ChooserAction.Builder. ويمكنك تحديد "PendingIntent" كالإجراء الذي تم استدعاءه عند النقر على الرمز. أنشِئ مصفوفة تتضمّن جميع إجراءاتك المخصَّصة وحدِّدها على أنّها EXTRA_CHOOSER_CUSTOM_ACTIONS للمشاركة Intent.

Kotlin

val sendIntent = Intent(Intent.ACTION_SEND)
    .setType("text/plain")
    .putExtra(Intent.EXTRA_TEXT, text)
val shareIntent = Intent.createChooser(sendIntent, null)
val customActions = arrayOf(
    ChooserAction.Builder(
        Icon.createWithResource(context, R.drawable.ic_custom_action),
        "Custom",
        PendingIntent.getBroadcast(
            context,
            1,
            Intent(Intent.ACTION_VIEW),
            PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_CANCEL_CURRENT
        )
    ).build()
)
shareIntent.putExtra(Intent.EXTRA_CHOOSER_CUSTOM_ACTIONS, customActions)
context.startActivity(shareIntent)

Java

Intent sendIntent = new Intent(Intent.ACTION_SEND)
        .setType("text.plain")
        .putExtra(Intent.EXTRA_TEXT, text);
Intent shareIntent = Intent.createChooser(sendIntent, null);
ChooserAction[] actions = new ChooserAction[]{
        new ChooserAction.Builder(
                Icon.createWithResource(context, R.drawable.ic_custom_action),
                "Custom",
                PendingIntent.getBroadcast(
                        context,
                        1,
                        new Intent(Intent.ACTION_VIEW),
                        PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_CANCEL_CURRENT
                )
        ).build()
};
shareIntent.putExtra(Intent.EXTRA_CHOOSER_CUSTOM_ACTIONS, actions);
context.startActivity(shareIntent);

استخدام برنامج تحديد الأهداف في Android

لقطة شاشة لأداة حلّ الأهداف "ACTION_SEND"

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

لاستخدام أداة حل الأهداف في Android، أنشِئ هدفًا وأضِف عناصر إضافية كما تفعل في "قائمة مشاركة البيانات" في Android. ومع ذلك، لا تتصل بـ Intent.createChooser().

إذا كانت هناك عدة تطبيقات مثبَّتة تحتوي على فلاتر تتطابق مع ACTION_SEND مع نوع MIME، سيعرض النظام مربّع حوار لتوضيح المعلومات باسم برنامج حل النية الذي يتيح للمستخدم اختيار هدف للمشاركة معه. وفي حال تطابق تطبيق واحد، يتم تشغيله.

في ما يلي مثال على كيفية استخدام برنامج تحديد الأهداف في Android لإرسال رسالة نصية:

Kotlin

val sendIntent: Intent = Intent().apply {
    action = Intent.ACTION_SEND
    putExtra(Intent.EXTRA_TEXT, "This is my text to send.")
    type = "text/plain"
}
startActivity(sendIntent)

Java

Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send.");
sendIntent.setType("text/plain");
startActivity(sendIntent);

مزيد من المعلومات

لمزيد من المعلومات حول إرسال البيانات، راجع فلاتر الأهداف وفلاتر الأهداف.