Intent ها و فیلترهای اندروید (Android Intents and Filters )
یک Intent اندرویدی شی ای است که یک intent (مفهوم) را حمل می کند. یک intent پیامی از یک مولفه به یک مولفه ی دیگر در داخل اپلیکیشن یا در خارج از اپلیکیشن است. Intent ها می توانند پیام ها را بین هر کدام از سه مولفه اصلی اپلیکیشن یعنی فعالیت ها، سرویس ها و دریافت کنندگان پیام، منتقل کنند.
خود intent، به عنوان یک شی Intent، یک ساختمان داده غیر فعال(passive) است که شامل یک توصیف انتزاعی از عملی است که باید اجرا شود.
برای نمونه ، بیایید فرض کنیم یک اکیتیویتی داریم که قرار هست یک برنامه ی ایمیل را اجرا کند که توسط آن ایمیلی نیز ارسال شود . برای این هدف ، برنامه ی شما باید اکشنی با نام ACTION_SEND را همراه با انتخابی مناسب، برای انتخاب کننده ی اینتنت اندروید، ارسال کند در این حالت کادری باز میشود و تمام راه های ممکن ارسال ایمیل برای کاربر نمایش داده میشود که بسته به نیاز خود یکی از راهها را انتخاب کند.
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 صادر خواهد کرد.این اینتنت به اندروید شما معرفی خواهد شد و تمام برنامه هایی که قابلیت فراخوانی یک لینک اینترنتی را دارند لیست خواهند شد .
ممکن هست یک url توسط برنامه های دیگری نیز اجرا شود ولی هدف ما در این مثال استفاده از مرورگر وب هست که در اندروید وجود دارد ، کدهای زیر را ببینید :
String q = "tutorialspoint";
Intent intent = new Intent(Intent.ACTION_WEB_SEARCH );
intent.putExtra(SearchManager.QUERY, q);
startActivity(intent);
کدهای بالا همانطور که مشخص هست کلمه ی samenta را جستجو خواهد کرد این کار توسط موتور جستجوی اندروید انجام شده و نتیجه برای آن نمایش داده خواهد شد.
مکانیسم جداگانه ای ، برای تحویل اینتنت ها به کامپوننت ها – اکتیویتی ها ، سرویس ها و برودکست رسیور ها وجود دارد :
ردیف |
متد و توضیحات |
1 |
Context.startActivity() شی اینتنتی که به این متد پاس خواهد شد جهت راه اندازی اکتیویتی جدید ، یا دریافت اکتیویتی در حال اجرا جهت انجام عملیات روی آن هست
|
2 |
Context.startService()
شی اینتنت که به این متد فرستاده میشود جهت کار با سرویس ها هست ، راه اندازی سرویس جدید یا عملیات روی سرویسی که وجود دارد
|
3 |
Context.sendBroadcast()
اینتت ارسالی به این متد نیز مخصوص کار با تامین کننده ی محتواها خواهد بود جهت انتشار پیغامی برای هر Broadcast Reciver که دلتان بخواهد
|
Intent Objects در اندروید
Intent Object بسته ای از اطلاعات هست که توسط کامپوننت های اندرویدی و همچنین سیستم اندروید دریافت و استفاده میشود . هر اینتنت از اجزای زیر تشکیل شده است :
Action
این یک بخش اجباری در شی اینتنت است و یک نام رشته ای از عملی است که باید انجام شود؛ و یا در اعلام کننده ها، اینتنت حاوی گزارش عملی است که انجام شده است؛ مثلا دانلود یک فایل. عملی که قرار است انجام شود و یا انجام شده تا حد زیادی تعیین کننده ی ساختار شی اینتنت است. کلاس اینتنت یک شماره ی ثابت را برای عمل مورد نظر تعریف می کند که با اینتنت های دیگر متفاوت است؛ شما می توانید لیست Android Intend Standard Actions(لینک) را نیز مطالعه کنید.
Data
این قسمت ویژگی و خصوصیت داده را به یک فیلتر اینتنت اضافه می کند. این مشخصات می توانند تنها نوع داده باشند (mimeType)، یا فقط URI باشند، و یا ترکیبی از هر دوی این ها. یک URI به وسیله ی ویژگی های بخش هایش که از یکدیگر مجزا هستند مشخص می شود −
ویژگی هایی که با فرمت URI مشخص می شوند اختیاری هستند، اما وابستگی متقابل دارند −
- اگر هیچ رویه ای را برای فیلتر Intent تعیین نکنیم، تمام مشخصه های دیگر URI نیز نادیده گرفته می شوند.
- اگر هیچ میزبانی برای فیلتر مشخص نشود، ویژگی پورت و تمام ویژگی های مسیر موجود در URI نادیده گرفته می شوند.
متد ()setData تنها URI را مشخص می کند، متد ()setType مشخص کننده ی نوع MIME بوده و متد ()setDataAndType هر دوی آن ها را مشخص می کند. URI با استفاده از متد ()getData و نوع با متد ()getType خوانده می شوند.
برخی از نمونه های action/data در جدول زیر آورده شده است.
شماره |
Action/Data و شرح آنها |
1 |
ACTION_VIEW content://contacts/people/1
اطلاعات مخاطبی که شناسه اش برابر “۱” است را نمایش می دهد. |
2 |
ACTION_DIAL content://contacts/people/1
صفحه شماره گیر را، درحالی که شماره مخاطبی که شناسه اش “۱” است در آن وارد شده، نمایش می دهد. |
3 |
ACTION_VIEW tel:123
صفحه شماره گیر را در حالی که با شماره “۱۲۳” پر شده است نمایش می دهد |
4 |
ACTION_EDIT content://contacts/people/1
صفحه ویرایش اطلاعات را برای مخاطبی که شناسه اش برابر “۱” است نمایش می دهد. |
5 |
ACTION_VIEW content://contacts/people
لیست مخاطبان را نمایش می دهد. |
6 |
ACTION_SET_WALLPAPER
تنظیمات مربوط به انتخاب تصویر زمینه را نمایش می دهد. |
7 |
ACTION_SYNC
موجب همگام سازی داده ها می شود و مقدار ثابت android.intent.action.SYNC را دارد. |
8 |
ACTION_SYSTEM_TUTORIAL
پلت فرم آموزشی که در اولین راه اندازی دستگاه اجرا می شود را آغاز می کند. |
9 |
ACTION_TIMEZONE_CHANGED
تغییر منطقه ی زمانی (time zone) را گزارش می کند. |
10 |
ACTION_UNINSTALL_PACKAGE
حذف کننده ی یک برنامه را اجرا می کند. |
Extras(سایر موارد)
این قسمت شامل اطلاعات اضافی درباره ی Intent می شود و باید به کامپوننتی که با intent در تعامل است تحویل داده شود. این اطلاعات می توانند با متد ()putExtras تعیین و با متد ()getExtrasخوانده شوند. در آدرس Android Intend Standard Extra Data(لینک) لیستی از داده های Extra استاندارد مربوط به Intent اندرویدی ارائه شده است.
Flags(پرچم ها)
این flag ها بخش های اختیاری شی Intent هستند و به سیستم اندرویدی دستور می دهند که چگونه یک فعالیت را راه اندازی کنند و بعد از راه اندازی چگونه در مورد آن عمل کند و غیره.
شماره |
عمل / جفت داده ها و توضیحات |
1 |
ACTION_VIEW content://contacts/people/1
نمایش اطلاعات مربوط به فردی که شناسه آن “۱” است. |
2 |
ACTION_DIAL content://contacts/people/1
نمایش شماره گیر تلفن با شخص پر شده |
3 |
ACTION_VIEW tel:123
نمایش شماره گیر تلفن با شماره داده شده |
4 |
ACTION_DIAL tel:123
نمایش شماره گیر تلفن با شماره داده شده |
5 |
ACTION_EDIT content://contacts/people/1
ویرایش اطلاعات مربوط به فردی که شناسه آن “۱” است. |
6 |
/ACTION_VIEW content://contacts/people
نمایش لیستی از افراد که کاربر می تواند از طریق آن مرور کند. |
7 |
ACTION_SET_WALLPAPER
تنظیمات را برای انتخاب تصویر زمینه نمایش دهید. |
8 |
ACTION_SYNC
این داده ها همگام است، مقدار کنونی android.intent.action.SYNC است. |
9 |
ACTION_SYSTEM_TUTORIAL
این آموزش مبتنی بر پلت فرم را آغاز می کند (آموزش پیش فرض یا آموزش شروع) |
10 |
ACTION_TIMEZONE_CHANGED
زمانی که منطقه زمانی تغییر می کند. |
11 |
ACTION_UNINSTALL_PACKAGE
این مورد برای غیر فعال کردن پیش فرض استفاده می شود. |
Component Name(نام مولفه)
این فیلد اختیاری یک شی ComponentName است و می تواند نماینده ی هر کدام از کلاس های اکتیویتی، سرویس و یا گیرنده های اعلام باشد. در صورت تنظیم بودن این فیلد شی Intent، به نمونه کلاس تعیین شده تحویل داده می شود، در غیر اینصورت سیستم اندروید با استفاده از سایر اطلاعات موجود در شی اینتنت یک موقعیت مناسب را به عنوان مقصد شی تعیین می کند.
نام کامپوننت مقصد می تواند با هر یک از متد های ()setComponent()، setClass یا ()setClassName تنظیم شود و با متد ()getComponent خوانده می شود.
انواع اینتنت ها
در زیر دو نوع اینتنت که سیستم اندروید از آن ها پشتیبانی می کند آورده شده است.

Explicit Intents(اینتنت های صریح)
اینتنت های صریح برای برقراری ارتباط بین قسمت های داخلی یک نرم افزار استفاده می شوند. مثلا فرض کنید می خواهید از یک اکتیویتی با اکتویتی دیگری ارتباط برقرار کنید، ما می توانیم این ارتباط را با یک اینتنت صریح انجام دهیم. تصویر زیر ارتباط بین اکتیویتی اول با اکتیویتی دوم را پس از کلیک کردن روی دکمه نشان می دهد.

این اینتنت ها، کامپوننت هدف را با نام تعیین می کنند و معمولا برای ارتباط بین کامپوننت های داخلی نرم افزار استفاده می شوند. مانند یک اکتیویتی که می تواند یک سرویس تابعه و یا یک اکتیویتی خواهر را با استفاده از اینتنت های صریح شروع کند. به عنوان مثال:
// Explicit Intent by specifying its class name
Intent i = new Intent(FirstActivity.this, SecondActivity.class);
// Starts TargetActivity
startActivity(i);
Implicit Intents(
اینتنت های ضمنی
)
این اینتنت ها هدف خود را با نام مشخص نمی کنند و فیلد مشخص کننده ی مقصد در آن ها خالی است. به همین دلیل به آن ها 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 را در راه اندازی کامپوننت های سایر نرم افزارها نشان می دهد. حال انجام مثال را طبق مراحل جدول زیر دنبال می کنیم .
مرحله |
توضیحات |
1 |
با استفاده از اندروید استودیو یک پروژه ی جدید با نام Android Intents تحت بسته ی com.example.android.intents ایجاد کنید. |
2 |
محتوای فایل java/com.example.android.intents/MainActivity.java را مانند آنچه در ادامه آمده تغییر دهید. |
3 |
محتوای فایل res/layout/activity_main.xml را با افزودن دو دکمه تغییر دهید. |
4 |
ثابت های رشته ای مورد نیاز را در فایل res/values/strings.xml تعریف کنید. |
5 |
نرم افزار را با شبیه ساز اندروید اجرا کنید و نتیجه را مورد بررسی قرار دهید. |
در زیر محتوای تغییر یافته ی فایل 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>
Following will be the content of res/values/strings.xml to define two new constants −
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">My Applicaiton</string>
</resources>
در زیر محتوای فایل res/values/strings.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>
حال نوبت آن رسیده تا با استفاده از اندروید استودیو برنامه را اجرا کنیم. برای این منظور روی آیکون Run
که در نوار ابزار قرار دارد کلیک کنید.اگر همه چیز بدون مشکل پیش برود پنجره ی شبیه ساز شما مانند تصویر زیر خواهد بود.

حال روی دکمه ی شروع مرورگر کلیک کنید که در اثر آن مرورگر در حالی که به آدرس http://www.example.comرفته است مانند تصویر زیر نمایش داده می شود.

به روش مشابه می توانید صفحه ی شماره گیر قسمت تماس ها را با فشردن دکمه ی شروع تماس اجرا کنید.
Intent Filters
تا اینجا دیدید که چطور با استفاده از اینتنت یک اکتیویتی را از یک برنامه ی دیگر فراخوانی کردیم. سیستم عامل اندروید با استفاده از فیلتر ها می تواند مجموعه ای از اکتیویتی ها، سرویس ها و گیرنده های اعلام را مشخص کند تا با کمک action، categories و data scheme ی مرتبط با یک اینتنت تعامل برقرار کنند. با استفاده از تگ <intent-filter> در فایل مانیفست می توانید لیستی از actionها، categoryها و نوع dataهایی که با هر کدام از کامپوننت های اکتیویتی، سرویس یا گیرنده ی اعلام مرتبط هستند را تعریف کنید.
برای مثال قسمتی از یک فایل مانیفست در زیر آورده شده که در آن با استفاده از action یک اکتیویتی تعیین شده است که می تواند با هر دو روش صریح و ضمنی مورد دستیابی قرار بگیرد و یک category و نوع data نیز در آن تعریف گردیده.
<activity android:name=".CustomActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:name="com.example.My Application.LAUNCH" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="http" />
</intent-filter>
</activity>
هنگامی که برای یک اکتیویتی مانند قطعه کد بالا فیلتر تعریف شود، اکتیویتی های دیگری که category آن ها android.intent.category.DEFAULT تعریف شده باشد، می توانند با استفاده از android.intent.action.VIEW یا com.example.ApplicationName.LAUNCH این اکتیویتی را فراخوانی کنند.
تگ <data> نیز نوع داده هایی را که اکتیویتی انتظار دارد آن ها را دریافت کند مشخص می کند که در قطعه کد بالا اکتیویتی سفارشی (custom) ما انتظار دارد داده هایی که دریافت می کند با “://http” آغاز شوند؛ یعنی یک آدرس وب.
ممکن است در وضعیتی که ارائه ی یک اینتنت با فیلترهای بیش از یک اکتیویتی یا سرویس هم خوانی پیدا کند، از کاربر پرسیده شود که مایل است کارش با کامپوننت کدام برنامه که فیلترش با این Intent هم خوانی داشته انجام شود. یک استثنا نیز وجود دارد و آن زمانی است که Intent نتواند هیچ فیلتر مناسبی را پیدا کند.
در زیر لیست بررسی های انجام شده توسط اندروید، قبل از فراخوانی یک اکتیویتی آورده شده است.
• ممکن است یک تگ <intent-filter> مانند مثال بالا بیشتر از یک action را در داخل لیست خود بیاورد، اما این لیست نمی تواند خالی باشد؛ یک فیلتر حداقل باید یک تگ <action> را در لیست خود داشته باشد، در غیر این صورت تمام اینتنت های دیگر را نیز مسدود خواهد کرد. اگر بیش از یک action در لیست داخل <intent-filter> ذکر شود، سیستم اندروید قبل از فراخوانی اکتیویتی برای مطابقت دادن یکی از آن ها تلاش خواهد کرد.
• ممکن است یک تگ <intent-filter> صفر، یک یا بیشتر از یک catgory را در خود لیست کند. اگر هیچ category ذکر نشده باشد سیستم اندروید به طور پیش فرض تطابق این category را موفقیت آمیز در نظر خواهد گرفت، اما اگر بیش از یک category ذکر شده باشد، سیستم اندروید تک تک آن ها را تست کرده و باید هر category در شی Intent با یک category در فیلتر مطابقت داشته باشد.
• هر تگ <data> می تواند یک URI و یک نوع داده(MIME media type) را مشخص کند. ویژگی های مجزایی نیز شبیه scheme، host، port و path برای هر قسمت از URI وجود دارد. یک شی اینتنت که شامل هر دو بخش URI و نوع داده می شود، در صورتی آزمون تطابق را قبول می شود که نوع داده اش با یکی از داده های ذکر شده در فیلتر مطابقت داشته باشد.
مثال
در این مثال می بینیم که سیستم اندروید چگونه تعارض تطابق یک اینتنت با دو اکتیوی را حل می کند؛ و پس از آن چطور یک اکتیویتی سفارشی را با یک فیلتر فراخوانی می کند و در نهایت به سراغ مورد استثنا می رویم، هنگامی که هیچ اکتیوتی مناسبی برای اینتنت تعریف نشده باشد.
مرحله |
توضیحات |
1 |
با استفاده از اندروید استودیو یک پروژه ی جدید با نام Android Filters تحت بسته ی com.example.android.filters ایجاد کنید. |
2 |
فایل src/Main/Java/MainActivity.java را با افزودن گیرنده های تلنگر برای سه دکمه تغییر دهید. |
3 |
فایل src/Main/Java/CustomActivity.java را برای تعریف یک اکتیویتی که توسط intetnهای مختلف اجرا خواهد شد، ایجاد کنید. |
4 |
فایل res/layout/activity_main.xml را با افزودن سه دکمه و دو متن تغییر دهید. |
5 |
فایل لایه ای res/layout/custom_view.xml را با یک <TextView> ایجاد کنید که نشان دهنده ی اطلاعات ارسال شده از طریق intent خواهد بود. |
6 |
محتوای فایل AndroidManifest.xml را با افزودن تگ <intent-filter> که معرف intent شما در اجرای اکتیویتی سفارشی است، تغییر دهید. |
7 |
نرم افزار را با استفاده از شبیه ساز سیستم اندروید اجرا و نتیجه را بررسی نمایید. |
در زیر محتوای تغییر یافته ی فایل src/MainActivity.java آورده شده است.
package com.example.tutorialspoint7.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,b3;
@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("com.example.
tutorialspoint7.myapplication.
LAUNCH",Uri.parse("http://www.example.com"));
startActivity(i);
}
});
b3 = (Button)findViewById(R.id.button3);
b3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent("com.example.
My Application.LAUNCH",
Uri.parse("https://www.example.com"));
startActivity(i);
}
});
}
}
در زیر محتوای فایل src/com.example.My Application/CustomActivity.java آورده شده است.
package com.example.tutorialspoint7.myapplication;
import android.app.Activity;
import android.net.Uri;
import android.os.Bundle;
import android.widget.TextView;
/**
* Created by TutorialsPoint7 on 8/23/2016.
*/
public class CustomActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.custom_view);
TextView label = (TextView) findViewById(R.id.show_data);
Uri url = getIntent().getData();
label.setText(url.toString());
}
}
در زبر محتوای فایل 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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.tutorialspoint7.myapplication.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_alignLeft="@+id/imageButton"
android:layout_alignStart="@+id/imageButton"
android:layout_alignEnd="@+id/imageButton" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Start browsing with launch action"
android:id="@+id/button2"
android:layout_below="@+id/button"
android:layout_alignLeft="@+id/button"
android:layout_alignStart="@+id/button"
android:layout_alignEnd="@+id/button" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Exceptional condition"
android:id="@+id/button3"
android:layout_below="@+id/button2"
android:layout_alignLeft="@+id/button2"
android:layout_alignStart="@+id/button2"
android:layout_toStartOf="@+id/editText"
android:layout_alignParentEnd="true" />
</RelativeLayout>
در زیر محتوای فایل res/layout/custom_view.xml آورده شده است.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView android:id="@+id/show_data"
android:layout_width="fill_parent"
android:layout_height="400dp"/>
</LinearLayout>
در زیر محتوای تغییر یافته ی فایل res/values/strings.xml را مشاهد می کنید.
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">My Application</string>
</resources>
و اما در نهایت محتوای فایل AndroidManifest.xml به شرح زیر است.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.tutorialspoint7.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>
<activity android:name="com.example.tutorialspoint7.myapplication.CustomActivity">
<intent-filter>
<action android:name = "android.intent.action.VIEW" />
<action android:name = "com.example.tutorialspoint7.myapplication.LAUNCH" />
<category android:name = "android.intent.category.DEFAULT" />
<data android:scheme = "http" />
</intent-filter>
</activity>
</application>
</manifest>
حال نوبت آن رسیده تا با استفاده از اندروید استودیو برنامه را اجرا کنیم. برای این منظور روی آیکون Run
که در نوار ابزار قرار دارد کلیک کنید.اگر همه چیز بدون مشکل پیش برود پنجره ی شبیه ساز شما مانند تصویر زیر خواهد بود.

اجازه دهید با اولین دکمه یعنی “شروع مرورگر با ACTION VIEW” کار را آغاز کنیم. در اینجا ما اکتیویتی سفارشی خودمان را با فیلتر ” android.intent.action.VIEW” تعریف کرده ایم، اما برای “ACTION_VIEW” یک اکتیویتی دیگر نیز به صورت پیش فرض توسط سیستم اندروید تعریف شده است که باعث راه اندازی مرورگر می شود. بنابراین اندروید با استفاده از قاب زیر از ما می خواهد یک اکتیویتی را برای اجرا شدن انتخاب کنیم.

حال اگر مرورگر را انتخاب کنیم، اندروید مرورگر وب را راه اندازی و سایت example.com را باز خواهد کرد؛ اما اگر IndentDemo را انتخاب کنید اندروید CustomActivity را راه اندازی خواهد کرد که تنها داده ارسالی را دریافت و مانند تصویر زیر نمایش خواهد داد.

حال با استفاده از دکمه ی بازگشت به عقب بر می گردیم و روی دکمه ی “شروع مرورگر با LAUNCH” کلیک می کنیم، در اینجا سیستم اندرود فیلتری را که برای انتخاب اکتیویتی تعریف شده است تطابق می دهد و در نتیجه اکتیویتی سفارشیِ ما راه اندازی می شود.
دوباره با استفاده از دکمه ی بازگشت به عقب برگردید و روی دکمه ی “شرایط استثنا” کلیک کنید. در اینجا سیستم اندروید سعی می کند یک فیلتر معتبر برای اینتنت داده شده پیدا کند که موفق نمی شود؛ زیرا به جای استفاده از داده ی http از https استفاده کرده ایم؛ با این وجود اکتیویتی ما درست است، بنابراین سیستم اندروید آن را یک استثنا در نظر گرفته و پیام زیر را نمایش می دهد.
