معرفی فعالیت ها

کلاس Activity یکی از اجزای حیاتی یک برنامه اندروید است و نحوه راه‌اندازی و کنار هم قرار دادن فعالیت‌ها بخشی اساسی از مدل برنامه پلتفرم است. برخلاف پارادایم‌های برنامه‌نویسی که در آن برنامه‌ها با متد main() راه‌اندازی می‌شوند، سیستم اندروید کد را در یک نمونه Activity با فراخوانی روش‌های برگشت تماس خاص که مربوط به مراحل خاصی از چرخه حیات آن است، آغاز می‌کند.

این سند مفهوم فعالیت ها را معرفی می کند و سپس راهنمایی های سبکی را در مورد نحوه کار با آنها ارائه می دهد. برای اطلاعات بیشتر در مورد بهترین شیوه‌ها در معماری برنامه‌تان، به راهنمای معماری برنامه مراجعه کنید.

مفهوم فعالیت ها

تجربه اپلیکیشن موبایل با نمونه دسکتاپ خود متفاوت است زیرا تعامل کاربر با برنامه همیشه از یک مکان شروع نمی شود. در عوض، سفر کاربر اغلب به صورت غیر قطعی آغاز می شود. به عنوان مثال، اگر یک برنامه ایمیل را از صفحه اصلی خود باز کنید، ممکن است لیستی از ایمیل ها را مشاهده کنید. در مقابل، اگر از یک برنامه رسانه اجتماعی استفاده می کنید که سپس برنامه ایمیل شما را راه اندازی می کند، ممکن است برای نوشتن ایمیل مستقیماً به صفحه برنامه ایمیل بروید.

کلاس Activity برای تسهیل این پارادایم طراحی شده است. هنگامی که یک برنامه برنامه دیگری را فراخوانی می کند، برنامه تماس گیرنده به جای برنامه به عنوان یک کل اتمی، فعالیتی را در برنامه دیگر فراخوانی می کند. به این ترتیب، فعالیت به عنوان نقطه ورود برای تعامل برنامه با کاربر عمل می کند. شما یک اکتیویتی را به عنوان زیر کلاس از کلاس Activity پیاده سازی می کنید.

یک اکتیویتی پنجره‌ای را ارائه می‌کند که برنامه رابط کاربری خود را در آن ترسیم می‌کند. این پنجره معمولاً صفحه را پر می کند، اما ممکن است کوچکتر از صفحه نمایش باشد و در بالای پنجره های دیگر شناور باشد. به طور کلی، یک فعالیت یک صفحه را در یک برنامه پیاده سازی می کند. به عنوان مثال، یکی از فعالیت های یک برنامه ممکن است صفحه تنظیمات را پیاده سازی کند، در حالی که فعالیت دیگری یک صفحه انتخاب عکس را پیاده سازی می کند.

اکثر برنامه ها حاوی چندین صفحه هستند، به این معنی که آنها چندین فعالیت را شامل می شوند. به طور معمول، یک فعالیت در یک برنامه به عنوان فعالیت اصلی مشخص می شود، که اولین صفحه ای است که هنگام راه اندازی برنامه توسط کاربر ظاهر می شود. سپس هر اکتیویتی می تواند فعالیت دیگری را برای انجام اقدامات مختلف شروع کند. به عنوان مثال، فعالیت اصلی در یک برنامه ایمیل ساده ممکن است صفحه ای را ارائه دهد که یک صندوق ورودی ایمیل را نشان می دهد. از آنجا، فعالیت اصلی ممکن است فعالیت‌های دیگری را راه‌اندازی کند که صفحه‌هایی را برای کارهایی مانند نوشتن ایمیل‌ها و باز کردن ایمیل‌های فردی فراهم می‌کنند.

اگرچه فعالیت‌ها با هم کار می‌کنند تا یک تجربه کاربری منسجم را در یک برنامه ایجاد کنند، هر فعالیت فقط به فعالیت‌های دیگر محدود است. معمولاً حداقل وابستگی در بین فعالیت های یک برنامه وجود دارد. در واقع، فعالیت‌ها اغلب فعالیت‌های متعلق به برنامه‌های دیگر را راه‌اندازی می‌کنند. به عنوان مثال، یک برنامه مرورگر ممکن است فعالیت اشتراک گذاری یک برنامه رسانه اجتماعی را راه اندازی کند.

برای استفاده از فعالیت‌ها در برنامه‌تان، باید اطلاعات مربوط به آن‌ها را در مانیفست برنامه ثبت کنید، و باید چرخه‌های حیات فعالیت را به درستی مدیریت کنید. ادامه این سند به معرفی این موضوعات می پردازد.

پیکربندی مانیفست

برای اینکه برنامه شما بتواند از فعالیت‌ها استفاده کند، باید فعالیت‌ها و برخی ویژگی‌های آن‌ها را در مانیفست اعلام کنید.

فعالیت ها را اعلام کنید

برای اعلام فعالیت خود، فایل مانیفست خود را باز کنید و یک عنصر <activity> را به عنوان فرزند عنصر <application> اضافه کنید. به عنوان مثال:

<manifest ... >
  <application ... >
      <activity android:name=".ExampleActivity" />
      ...
  </application ... >
  ...
</manifest >

تنها ویژگی مورد نیاز برای این عنصر android:name است که نام کلاس فعالیت را مشخص می کند. همچنین می‌توانید ویژگی‌هایی اضافه کنید که ویژگی‌های فعالیت مانند برچسب، نماد یا موضوع رابط کاربری را تعریف می‌کنند. برای اطلاعات بیشتر در مورد این ویژگی ها و سایر ویژگی ها، به مستندات مرجع عنصر <activity> مراجعه کنید.

توجه: پس از انتشار برنامه خود، نباید نام فعالیت را تغییر دهید. اگر این کار را انجام دهید، ممکن است برخی از عملکردها مانند میانبرهای برنامه را خراب کنید. برای اطلاعات بیشتر در مورد تغییراتی که پس از انتشار باید از آنها اجتناب کنید، به مواردی که نمی توانند تغییر کنند مراجعه کنید.

فیلترهای قصد را اعلام کنید

فیلترهای هدف یکی از ویژگی های بسیار قدرتمند پلتفرم اندروید هستند. آنها توانایی راه اندازی یک فعالیت را نه تنها بر اساس یک درخواست صریح ، بلکه یک درخواست ضمنی نیز فراهم می کنند. به عنوان مثال، یک درخواست صریح ممکن است به سیستم بگوید «فعالیت ارسال ایمیل را در برنامه Gmail شروع کنید». در مقابل، یک درخواست ضمنی به سیستم می‌گوید «در هر فعالیتی که می‌تواند کار را انجام دهد، صفحه ارسال ایمیل را شروع کنید». وقتی رابط کاربری سیستم از کاربر می‌پرسد که از کدام برنامه برای انجام یک کار استفاده کند، این یک فیلتر قصد در کار است.

شما می توانید با اعلام یک ویژگی <intent-filter> در عنصر <activity> از این ویژگی استفاده کنید. تعریف این عنصر شامل یک عنصر <action> و به صورت اختیاری، یک عنصر <category> و/یا یک عنصر <data> است. این عناصر ترکیب می شوند تا نوع قصدی را که فعالیت شما می تواند به آن پاسخ دهد را مشخص می کند. به عنوان مثال، قطعه کد زیر نحوه پیکربندی فعالیتی را نشان می دهد که داده های متنی را ارسال می کند و درخواست هایی را از سایر فعالیت ها برای انجام این کار دریافت می کند:

<activity android:name=".ExampleActivity" android:icon="@drawable/app_icon">
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="text/plain" />
    </intent-filter>
</activity>

در این مثال، عنصر <action> مشخص می کند که این فعالیت داده ها را ارسال می کند. اعلام عنصر <category> به‌عنوان DEFAULT فعالیت را قادر می‌سازد تا درخواست‌های راه‌اندازی را دریافت کند. عنصر <data> نوع داده ای را که این فعالیت می تواند ارسال کند را مشخص می کند. قطعه کد زیر نحوه فراخوانی فعالیت توضیح داده شده در بالا را نشان می دهد:

کاتلین
val sendIntent = Intent().apply {
    action = Intent.ACTION_SEND
    type = "text/plain"
    putExtra(Intent.EXTRA_TEXT, textMessage)
}
startActivity(sendIntent)
جاوا
// Create the text message with a string
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.setType("text/plain");
sendIntent.putExtra(Intent.EXTRA_TEXT, textMessage);
// Start the activity
startActivity(sendIntent);
اگر می‌خواهید برنامه‌تان مستقل باشد و به برنامه‌های دیگر اجازه فعال کردن فعالیت‌های آن را ندهید، به فیلترهای قصد دیگری نیاز ندارید. فعالیت‌هایی که نمی‌خواهید در دسترس سایر برنامه‌ها قرار دهید، نباید فیلتر قصد داشته باشند، و می‌توانید خودتان آنها را با استفاده از مقاصد صریح شروع کنید. برای اطلاعات بیشتر در مورد اینکه چگونه فعالیت‌های شما می‌توانند به مقاصد پاسخ دهند، به Intent و Intent Filters مراجعه کنید. مجوزها را اعلام کنید

می‌توانید از تگ <activity> مانیفست برای کنترل برنامه‌هایی که می‌توانند یک فعالیت خاص را شروع کنند استفاده کنید. یک فعالیت والدین نمی‌تواند فعالیت فرزند را راه‌اندازی کند، مگر اینکه هر دو فعالیت مجوزهای یکسانی در مانیفست خود داشته باشند. اگر عنصر <uses-permission> را برای یک فعالیت والد اعلام کنید، هر فعالیت فرزند باید یک عنصر مطابق <uses-permission> داشته باشد.

به عنوان مثال، اگر برنامه شما بخواهد از یک برنامه فرضی به نام SocialApp برای به اشتراک گذاشتن یک پست در رسانه های اجتماعی استفاده کند، خود SocialApp باید مجوزی را که برنامه فراخوانی آن باید داشته باشد را تعیین کند:

<manifest>
<activity android:name="...."
   android:permission=”com.google.socialapp.permission.SHARE_POST”

/>

سپس، برای اینکه اجازه تماس با SocialApp را داشته باشید، برنامه شما باید با مجوز تنظیم شده در مانیفست SocialApp مطابقت داشته باشد:

<manifest>
   <uses-permission android:name="com.google.socialapp.permission.SHARE_POST" />
</manifest>

برای اطلاعات بیشتر در مورد مجوزها و امنیت به طور کلی، به امنیت و مجوزها مراجعه کنید.

مدیریت چرخه حیات فعالیت

یک فعالیت در طول عمر خود از چندین حالت عبور می کند. شما از یک سری تماس‌های برگشتی برای مدیریت انتقال بین حالت‌ها استفاده می‌کنید. بخش های بعدی به معرفی این تماس ها می پردازند.

onCreate()

شما باید این callback را پیاده سازی کنید که زمانی که سیستم فعالیت شما را ایجاد می کند فعال می شود. پیاده سازی شما باید مؤلفه های ضروری فعالیت شما را مقداردهی اولیه کند: برای مثال، برنامه شما باید نماها را ایجاد کند و داده ها را در اینجا به لیست ها متصل کند. مهمتر از همه، اینجاست که باید setContentView() را فراخوانی کنید تا چیدمان رابط کاربری اکتیویتی را تعریف کنید.

وقتی onCreate() تمام شد، تماس بعدی همیشه onStart() است.

onStart()

با خروج onCreate() اکتیویتی وارد حالت Started می شود و فعالیت برای کاربر قابل مشاهده می شود. این فراخوان شامل آنچه که به آمادگی نهایی فعالیت برای حضور در پیش‌زمینه و تعاملی شدن می‌رسد می‌باشد.

onResume()

سیستم درست قبل از شروع تعامل با کاربر، این تماس را فراخوانی می کند. در این مرحله، اکتیویتی در بالای پشته اکتیویتی قرار دارد و تمام ورودی های کاربر را می گیرد. اکثر عملکردهای اصلی یک برنامه در متد onResume() پیاده سازی می شوند.

فراخوانی onPause() همیشه از onResume() پیروی می کند.

onPause()

هنگامی که فعالیت تمرکز خود را از دست داده و وارد حالت Paused می شود، سیستم onPause() را فرا می خواند. این حالت زمانی اتفاق می‌افتد که برای مثال کاربر روی دکمه بازگشت یا اخیرا ضربه می‌زند. هنگامی که سیستم onPause() برای فعالیت شما فراخوانی می‌کند، از نظر فنی به این معنی است که فعالیت شما هنوز تا حدی قابل مشاهده است، اما اغلب نشان‌دهنده این است که کاربر فعالیت را ترک می‌کند و فعالیت به زودی به حالت توقف یا از سر گرفته می‌شود.

اگر کاربر انتظار دارد رابط کاربری به‌روزرسانی شود، ممکن است یک فعالیت در حالت توقف موقت به به‌روزرسانی رابط کاربری ادامه دهد. نمونه‌هایی از چنین فعالیت‌هایی شامل نمایش یک صفحه نقشه ناوبری یا پخش‌کننده رسانه در حال پخش است. حتی اگر چنین فعالیت‌هایی تمرکز خود را از دست بدهند، کاربر انتظار دارد که رابط کاربری خود به به‌روزرسانی ادامه دهد.

شما نباید از onPause() برای ذخیره داده های برنامه یا کاربر، برقراری تماس های شبکه یا اجرای تراکنش های پایگاه داده استفاده کنید. برای اطلاعات در مورد ذخیره داده ها، به ذخیره و بازیابی وضعیت فعالیت مراجعه کنید.

پس از اتمام اجرا onPause() ، بسته به اینکه پس از وارد شدن اکتیویتی به حالت Paused چه اتفاقی می افتد، فراخوان بعدی یا onStop() یا onResume() است.

onStop()

زمانی که فعالیت دیگر برای کاربر قابل مشاهده نباشد، سیستم onStop() فراخوانی می کند. این ممکن است به این دلیل اتفاق بیفتد که فعالیت در حال از بین رفتن است، یک فعالیت جدید شروع می شود، یا یک فعالیت موجود وارد حالت Resumed شده و فعالیت متوقف شده را پوشش می دهد. در تمام این موارد، فعالیت متوقف شده دیگر به هیچ وجه قابل مشاهده نیست.

تماس بعدی که سیستم فراخوانی می‌کند یا onRestart() است، در صورتی که فعالیت برای تعامل با کاربر برمی‌گردد، یا در صورتی که این اکتیویتی کاملاً خاتمه می‌یابد توسط onDestroy() است.

onRestart()

هنگامی که یک فعالیت در حالت Stop در شرف راه اندازی مجدد است، سیستم این تماس را فراخوانی می کند. onRestart() وضعیت اکتیویتی را از زمانی که متوقف شد بازیابی می کند.

این فراخوان همیشه با onStart() دنبال می شود.

onDestroy()

سیستم قبل از اینکه یک فعالیت از بین برود این تماس را فراخوانی می کند.

این تماس نهایی آخرین تماسی است که فعالیت دریافت می کند. onDestroy() معمولاً برای اطمینان از اینکه تمام منابع یک اکتیویتی با از بین رفتن اکتیویتی یا فرآیند حاوی آن آزاد می شوند پیاده سازی می شود.

این بخش فقط مقدمه ای برای این موضوع ارائه می دهد. برای بررسی دقیق‌تر چرخه عمر فعالیت و تماس‌های آن، به چرخه حیات فعالیت مراجعه کنید.