Android Intent | Intent Filter

از حرکت بین صفحات اپلیکیشن خودتان تا استفاده از صفحات اپلیکیشن‌های دیگر نصب شده بر روی گوشی کاربر، با یادگیری دو مفهوم Intent و Intent Filter می‌توانید از Activity های دیگر اپلیکیشن‌ها از جمله جیمیل، تلگرام، دوربین و ... در درون اپلیکیشن خود استفاده کنید.مفهوم Intent چیست؟یک پاکت نامه را در نظر بگیرید، شما از این پاکت نامه برای ارسال اطلاعات به شخص دیگری در هر جای دنیا می‌توانید استفاده کنید. Intent هم پاکت نامه‌ای است که آن را به سیستم عامل می‌دهید تا Component مورد نظر شما را اجرا کند.val intent = Intent(context, SomeOtherActivity::class.java)منظور از Component چیست؟اندروید بر پایه چهار جز (Component) اصلی با نام‌های زیر تشکیل شده است:ActivityServiceBroadcast ReceiverContent Providerبه جز Content Provider برای شروع و ارتباط با سه Component دیگر از Intent استفاده می‌کنیم.انوع Intentدو نوع پیغام در اندروید می‌توانیم ارسال کنیم:Explicit (صریح)Implicit (ناواضح)پیغام Explicit چیست؟پیغامی است که در آن گیرنده کاملا مشخص است. باز کردن صفحات دیگر اپلیکیشن خودتان از این نوع Intent می‌باشد:val intent = Intent(context, SomeOtherActivity::class.java) startActivity(intent)پیغام Implicit چیست؟هنگامی که شما به سیستم‌عامل اندروید درخواست می‌دهید تمامی Componentهایی که توانایی کمک به انجام عمل خاص شما را دارند معرفی کند. https://gist.github.com/d9666461f627e8df17e066f7bcad3339#file-sample-kt دیالوگ انتخاب اپلیکیشندر اینجا Action چیست؟در واقع Action عملیاتی است که یک Activity توانایی اجرای آن را دارد. در اینجا به سیستم عامل اندروید می‌گویید به من Activityهایی را نمایش بده که توانایی ارسال (از هر نوعی) دارند.منظور از Type چیست؟نوع یا همان MIME Type می‌باشد. اولین بار MIME Typeها در مبحث وب مورد استفاده قرار گرفتند و نشان‌دهنده نوع اطلاعات بودند. در اندروید هم ما از MIME Type برای مشخص کردن نوع اطلاعات استفاده می‌کنیم. در اینجا می‌گوییم تمام Activityهایی را برای من نمایش بده که قابلیت ارسال نوشته (Text) و از نوع ساده (Plain) را دارند.مثال:text/plain = نوشته سادهimage/jpeg = عکس از فرمت جی‌پگimage/* = عکس از هر نوعی منظور از Plain این می‌باشد که نوشته عادی می‌باشد و هیچ مفهوم دیگری ندارد، مثلا HTML یا CSS نیست.دلیل استفاده از فانکشن putExtra چیست؟برای ارسال اطلاعات مورد نظرمان می‌توانیم از Extra های از پیش تعیین شده استفاده کنیم. در اینجا Text کلیدی است که برای ارسال اطلاعات به گیرنده ارسال می‌شود.هر Action ای با هر Extra ای سازگار نیست! و بستگی به توسعه‌دهنده اپلیکیشن گیرنده دارد.دلیل استفاده از Intent.createChooser چیست؟این فانکشن هر بار برای کاربر یک دیالوگ برای انتخاب اپلیکیشن مورد نظر نمایش می‌دهد. اگر در نسخه‌های جدید اندروید از این فانکشن استفاده نکنید دیالوگ کوچک دیگری نمایش داده می‌شود و کاربر حق انتخاب از بین اپلیکیشن‌ها را دارد، اگر گزینه به یاد بسپار را کلیک کند دیگر این دیالوگ نمایش داده نمی‌شود.چگونه اندروید Activity ها را فیلتر می‌کند؟با استفاده از intent-filter هایی که در AndroidManifest.xml تعریف می‌شود سیستم‌عامل Activity ها را شناسایی و به سایرین معرفی می‌کند.به Activity اصلی اپلیکیشن خود در AndroidManifest.xml نگاهی بندازید:<activity android:name=&quot.MainActivity&quot> <intent-filter> <action android:name=&quotandroid.intent.action.MAIN&quot /> <category android:name=&quotandroid.intent.category.LAUNCHER&quot /> </intent-filter> </activity>در اینجا صفحه‌اصلی برنامه Action یا عمکرد اصلی خود را به عنوان Main یا شروع‌کننده معرفی می‌کند و همچنین خود را در دسته‌بندی شروع کننده اپلیکیشن یا Launcher قرار می‌دهد.برای مثال‌های قبلی چه نوع Intent Filter ای لازم هست؟<activity android:name=&quot.SenderActivity&quot> <intent-filter> <action android:name=&quotandroid.intent.action.SEND&quot/> <category android:name=&quotandroid.intent.category.DEFAULT&quot/> <data android:mimeType=&quottext/plain&quot/> </intent-filter> </activity>چرا Category در اینجا Default می‌باشد؟در Intent هایی که می‌خواهید implicit باشند Category را بر روی DEFAULT قرار دهید که معنای قابل شناسایی توسط اندروید را می‌دهد تداعی می‌کند. بدون این خط برنامه شما در لیست نمایش داده نمی‌شود.شروع کردن یک اپلیکیشن خاصبرای مثال اپلیکیشن واتس‌اپ را می‌خواهیم شروع کرده و پیغامی ارسال کنیم: https://gist.github.com/48cb72b09b20b50e42e9c03c991c0681#file-sample-kt دلیل استفاده از resolveActivity چیست؟در اینجا به دنبال آن می‌گردیم آیا اپلیکیشنی با مشخصات داده شده وجود دارد یا خیر؟ اگر مقدار null باشد اپلیکیشن با خطا همراه خواهد شد که ما در بلاک let از آن جلوگیری کرده‌ایم.