Intent در اندروید
Intent در اندروید توصیفی انتراعی از عملیاتی است که می خواهد انجام شود. intent می تواند با متد های startActivity اکتیویتی را راه اندازی کند. broadcastIntent می تواند Intent را در اندروید به گیرنده های اعلام (BroadcastReceiver) ارسال کند . (startService(Intent یا (bindService(Intent, ServiceConnection, int برای برقراری ارتباط با سرویسی که در پس زمینه در حال اجرا شدن است استفاده می شود.
به عنوان مثال، فرض کنید که یک اکتیویتی دارید که باید سرویس ایمیل را راه اندازی کرده و با استفاده از دستگاه اندروید یک ایمیل بفرستد. اکتیویتی باید برای انجام این عمل یک ACTION_SEND را همراه انتخابگر مناسب به تحلیلگر Intent های اندروید ارسال کند. پس از آن انتخابگر یک رابط کاربری را برای انتخاب کامپوننت ارسال ایمیل، به کاربر نمایش می دهد.
Intent email = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:")); email.putExtra(Intent.EXTRA_EMAIL, recipients); email.putExtra(Intent.EXTRA_SUBJECT, subject.getText().toString()); email.putExtra(Intent.EXTRA_TEXT, body.getText().toString()); startActivity(Intent.createChooser(email, "Choose an email client from..."));
در بالا نحوه فراخوانی متد startActivity برای شروع فرآیند اریال ایمیل است و نتیجه همانند تصویر زیر است:
به عنوان یک مثال دیگر فرض کنید اکتیویتی دیگری نیاز دارد لینکی را با یکی از مرورگرهای موجود در سیستم اندروید باز کند. به این منظور اکتیویتی باید یک ACTION_WEB_SEARCH را که یک شی Intent است، به تحلیلگر Intent در اندروید ارسال کند. تحلیلگر Intentها برای انتخاب یک اکتیویتی که بیشترین مطابقت را با Intent ارسالی داشته باشد به تجزیه و بررسی لیست تمام اکتیویتی ها می پردازد؛ که در این جا هدف برای ما اکتیویتی مرورگر وب است. پس از آن تحلیلگر Intent در اندروید ، لینک ما را به مرورگر وب ارسال می کند که باعث شروع اکتیویتی مرورگر نیز خواهد شد.
String q = "tutorialspoint"; Intent intent = new Intent(Intent.ACTION_WEB_SEARCH ); intent.putExtra(SearchManager.QUERY, q); startActivity(intent);
مطلب پیشنهادی: آموزش برنامه نویس اندروید – acitivities
مثال فوق tutorialspoint را در موتور جستجوی اندروید جستجو می کند و نتیجه ی اکتیویتی tutorialspoint را اعلام خواهد کرد.
مکانیزم های جداگانه ای برای ارائه Intents به هر نوع کمپوننت نظیر اکتیویتی ها، سرویس ها و یا گیرنده های اعلام وجود دارد.
متد و توضیحات | |
۱ | Context.startActivity()
شئ Intent برای راه اندازی یک اکتیویتی جدید، و یا دستور انجام کار جدید توسط یک اکتیویتی مجود، با این متد ارسال می شود. |
۲ | Context.startService()
شی Intent برای شروع یک سرویس، و یا تحویل دستورالعمل جدید به یک سرویس در حال فعالیت با این متد ارسال می شود. |
۳ | Context.sendBroadcast()
شی Intent توسط این متد به گیرنده های اعلام ارسال می شود. |
شئ های Intent
یک شی Intent در اندروید یک بسته ی اطلاعاتی است که کامپوننت دریافت کننده ی آن و همچنین سیستم اندروید، از اطلاعات موجود در آن استفاده می کنند.
یک شی Intent در اندروید بر اساس ارتباطی که برقرار می کند و یا کاری که قصد انجام آن را دارد می تواند شامل قسمت های زیر باشد:
Action
این یک بخش اجباری در شی Intent است و یک نام رشته ای از عملی است که باید انجام شود؛ و یا در اعلام کننده ها، Intent حاوی گزارش عملی است که انجام شده است؛ مثلا دانلود یک فایل. عملی که قرار است انجام شود و یا انجام شده تا حد زیادی تعیین کننده ی ساختار شی Intent است. کلاس Intent یک شماره ی ثابت را برای عمل مورد نظر تعریف می کند که با Intentهای دیگر متفاوت است؛
Action در یک شی Intent با متد ()setAction تعیین و با متد ()getAction خوانده می شود.
Data
این قسمت ویژگی و خصوصیت داده را به یک فیلتر intent اضافه می کند. این مشخصات می توانند تنها نوع داده باشند (the mimeType attribute)، یا فقط URI باشند، و یا ترکیبی از هر دوی این ها. یک URI به وسیله ی ویژگی های بخش هایش که از یکدیگر مجزا هستند مشخص می شود.
ویژگی هایی که با فرمت URI مشخص می شوند اختیاری هستند، اما وابستگی متقابل دارند:
- اگر هیچ رویه ای را برای فیلتر Intent تعیین نکنیم، تمام مشخصه های دیگر URI نیز نادیده گرفته می شوند.
- اگر هیچ میزبانی برای فیلتر مشخص نشود، ویژگی پورت و تمام ویژگی های مسیر موجود در URI نادیده گرفته می شوند.
متد ()setData تنها URI را مشخص می کند، متد ()setType مشخص کننده ی نوع MIME بوده و متد ()setDataAndType هر دوی آن ها را مشخص می کند. URI با استفاده از متد ()getData و نوع با متد ()getType خوانده می شوند.
مطلب پیشنهادی: سازماندهی و دسترسی به منابع اندروید
برخی از نمونه های action/data در جدول زیر آورده شده است:
Sr.No. | Action/Data Pair & Description |
۱ | ACTION_VIEW content://contacts/people/1
اطلاعات مربوط به فردی که شناسه آن “۱” است را نشان می دهد. |
۲ | ACTION_DIAL content://contacts/people/1
شماره گیر تلفن شماره شخص مورد نظر را نمایش دهید. |
۳ | ACTION_VIEW tel:123
صفحه ی شماره گیر را در حالی که با شماره ی “۱۲۳” پر شده است نمایش می دهد. |
۴ | ACTION_DIAL tel:123
شماره داده شده را در شماره گیر تلفن نمایش می دهد. |
۵ | ACTION_EDIT content://contacts/people/1
صفحه ویرایش اطلاعات مربوط به مخاطبی که شناسه آن “۱” است را نشان می دهد. |
۶ | ACTION_VIEW content://contacts/people/
لیست مخاطبان را نمایش می دهد. |
۷ | ACTION_SET_WALLPAPER
تنظیمات را برای انتخاب تصویر زمینه نمایش می دهد. |
۸ | ACTION_SYNC
موجب همگام سازی داده ها می شود و مقدار ثابت android.intent.action.SYNCرا دارد |
۹ | ACTION_SYSTEM_TUTORIAL
پلت فرم آموزشی که در اولین راه اندازی دستگاه اجرا می شود را آغاز می کند. |
۱۰ | ACTION_TIMEZONE_CHANGED
زمانی که منطقه زمانی تغییر می کند را گزارش می دهد. |
۱۱ | ACTION_UNINSTALL_PACKAGE
حذف کننده ی یک برنامه را اجرا می کند. |
دسته
دسته یک بخش اختیاری از شی Intent است و حاوی اطلاعات اضافی، درباره ی نوع کامپوننتی که باید به intent رسیدگی کند می شود. متد ()addCategory یک دسته را برای شی intent تعیین می کند، متد ()removeCategory دسته ای را که قبلا اضافه شده است حذف کرده و ()getCategories نیز دسته هایی را که برای شی intent تعیین شده اند برمی گرداند
در قسمت Intent Filters که در ادامه آمده است می توانید نحوه ی انتخاب و استفاده از یک دسته، که مناسب فعالیت یک Intent باشد را مورد بررسی قرار دهید.
سایر موارد
این قسمت شامل اطلاعات اضافی درباره ی Intent می شود و باید به کامپوننتی که با intent در تعامل است تحویل داده شود. این اطلاعات می توانند با متد ()putExtras تعیین و با متد ()getExtrasخوانده شوند.
پرچم ها
پرچم ها نیز یک بخش اختیاری در شی Intent در اندروید هستند و برای سیستم مشخص می کنند که یک اکتیویتی را چگونه راه اندازی و پس از آن اداره کند؛ و کاربرد هایی از این قبیل.
پرچم و توضیحات | |
۱ | FLAG_ACTIVITY_CLEAR_TASK
اگر این پرچم با استفاده از متد Context.startActivity() برای یک Intent تعیین شود، باعث خواهد شد قبل از شروع اکتیویتی، تمام واحد های سیستمی که تا قبل از تعیین پرچم مشغول پردازش این نوع اکتیویتی بوده اند آزاد شوند؛ سپس برای اکتیویتی یک واحد سیستمی جدید اختصاص داده می شود و اگر تمام واحد ها مشغول باشند، یک واحد خالی شده و نهایتا تمام اکتیویتی های قدیمی مرتبط پایان می یابند. این پرچم باید همراه با پرچم FLAG_ACTIVITY_NEW_TASK استفاده شود. |
۲ | FLAG_ACTIVITY_CLEAR_TOP
در صورت استفاده از این پرچم، هنگام شروع اکتیویتی، اگر یک واحد سیستمی مشغول پردازش این نوع اکتیویتی باشد، به جای راه اندازی یک نمونه ی جدید در یک واحد سیستمی دیگر، تمام اکتیویتی های موجود که قبل از این بوده اند بسته می شوند و این Intent به عنوان یک Intent جدید به آن ها واگذار می شود. |
۳ | FLAG_ACTIVITY_NEW_TASK
به طور کلی این پرچم به صورت پیش فرض توسط اکتیویتی هایی که می خواهند راه اندازی شوند استفاده می شود. |
Component Name
این فیلد اختیاری یک شی ComponentName است و می تواند نماینده ی هر کدام از کلاس های اکتیویتی، سرویس و یا گیرنده های اعلام باشد. در صورت تنظیم بودن این فیلد شی Intent، به نمونه کلاس تعیین شده تحویل داده می شود، در غیر اینصورت سیستم اندروید با استفاده از سایر اطلاعات موجود در شی Intent یک موقعیت مناسب را به عنوان مقصد شی تعیین می کند.
نام کامپوننت مقصد می تواند با هر یک از متد های setComponent(), setClass(), or setClassName() تنظیم شود و با متد getComponent() خوانده می شود.
انواع Intent در اندروید
در زیر دو نوع intent در اندروید که آن ها پشتیبانی می شود آورده شده است
Explicit Intents
Intentهای صریح برای برقراری ارتباط بین قسمت های داخلی یک نرم افزار استفاده می شوند. مثلا فرض کنید می خواهید از یک اکتیویتی با اکتویتی دیگری ارتباط برقرار کنید، ما می توانیم این ارتباط را با یک Intent صریح انجام دهیم. تصویر زیر ارتباط بین اکتیویتی اول با اکتیویتی دوم را پس از کلیک کردن روی دکمه نشان می دهد.
این Intentها، کامپوننت هدف را با نام تعیین می کنند و معمولا برای ارتباط بین کامپوننت های داخلی نرم افزار استفاده می شوند. مانند یک اکتیویتی که می تواند یک سرویس تابعه و یا یک اکتیویتی خواهر را با استفاده از Intentهای صریح شروع کند. به عنوان مثال:
// Explicit Intent by specifying its class name Intent i = new Intent(FirstActivity.this, SecondActivity.class); // Starts TargetActivity startActivity(i);
Implicit Intents
این Intent ها هدف خود را با نام مشخص نمی کنند و فیلد مشخص کننده ی مقصد در آن ها خالی است. به همین دلیل به آن ها Intent ضمنی می گویند و معمولا برای فعال کردن کامپوننت های سایر نرم افزار ها استفاده می شود. به عنوان مثال:
Intent read1=new Intent(); read1.setAction(android.content.Intent.ACTION_VIEW); read1.setData(ContactsContract.Contacts.CONTENT_URI); startActivity(read1);
کد بالا تصویر زیر را نتیجه می دهد.
کامپوننت مقصد که دریافت کننده ی Intent است می تواند برای دریافت داده های اضافیِ ارسال شده توسط کامپوننت منبع از متد ()getExtras استفاده کند. به عنوان مثال:
// Get bundle object at appropriate place in your code Bundle extras = getIntent().getExtras(); // Extract data using passed keys String value1 = extras.getString("Key1"); String value2 = extras.getString("Key2");
مثال
مثال زیر قابلیت های یک Intent را در راه اندازی کامپوننت های سایر نرم افزارها نشان می دهد.
مرحله | توضیحات |
۱ | با استفاده از Android Studio IDE یک برنامه اندروید ایجاد کنید و به عنوانMy Application تحت بسته com.example.saira_000.myapplication نامگذاری کنید. |
۲ | محتوای فایل src/main/java/MainActivity.java را مانند آنچه در ادامه آمده تغییر دهید. و دو دکمه به نام های Start Browser و Start Phone ایجاد کنید. |
۳ | XML فایل res/layout/activity_main.xml برای اضافه کردن سه دکمه در طرح خطی تغییر دهید. |
۴ | نرم افزار را با شبیه ساز اندروید اجرا کنید و نتیجه را مورد بررسی قرار دهید. |
در زیر محتوای تغییر یافته ی فایل src/com.example.My Application/MainActivity.java قرار دارد.
package com.example.saira_000.myapplication; import android.content.Intent; import android.net.Uri; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; public class MainActivity extends AppCompatActivity { Button b1,b2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); b1=(Button)findViewById(R.id.button); b1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent i = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse("http://www.example.com")); startActivity(i); } }); b2=(Button)findViewById(R.id.button2); b2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent i = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse("tel:9510300000")); startActivity(i); } }); } }
و در ادامه محتوای فایل res/layout/activity_main.xml قرار دارد.
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Intent Example" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:textSize="30dp" /> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Tutorials point" android:textColor="#ff87ff09" android:textSize="30dp" android:layout_below="@+id/textView1" android:layout_centerHorizontal="true" /> <ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/imageButton" android:src="@drawable/abc" android:layout_below="@+id/textView2" android:layout_centerHorizontal="true" /> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/editText" android:layout_below="@+id/imageButton" android:layout_alignRight="@+id/imageButton" android:layout_alignEnd="@+id/imageButton" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Start Browser" android:id="@+id/button" android:layout_alignTop="@+id/editText" android:layout_alignRight="@+id/textView1" android:layout_alignEnd="@+id/textView1" android:layout_alignLeft="@+id/imageButton" android:layout_alignStart="@+id/imageButton" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Start Phone" android:id="@+id/button2" android:layout_below="@+id/button" android:layout_alignLeft="@+id/button" android:layout_alignStart="@+id/button" android:layout_alignRight="@+id/textView2" android:layout_alignEnd="@+id/textView2" /> </RelativeLayout>
و در ادامه محتویات فایل res/values/stringings.xml برای تعریف دو ثابت جدید قرار دارد.
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">My Applicaiton</string> </resources>
و در زیر محتوای پیش فرض AndroidManifest.xml قرار دارد.
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.saira_000.myapplication"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
الان برنامه My Application را اجرا کنید. فرض میکنم AVD را در حین انجام تنظیمات محیط ایجاد کرده اید. برای اجرای برنامه از Android Studio، یکی از فایل های اکتیویتی پروژه خود را باز کنید و روی آیکون اجرا در نوار ابزار کلیک کنید. Android Studio این برنامه را در AVD خود نصب می کند و آن را اجرا می کند و اگر همه چیز تنظیم باشد و برنامه شما مشکلی نداشته باشد، پنجره Emulator همانند تصویر زیر است.
حالا روی دکمه Start Browser کلیک کنید، تا مرورگر به آدرس http://www.example.com برود. همانند تصویر زیر:
به روش مشابه می توانید صفحه ی شماره گیر قسمت تماس ها را با فشردن دکمه ی Start Phone اجرا کنید.
منبع: tutorialspoint