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

 حذف کننده ی یک برنامه را اجرا می کند.

Category(رده)

Category یک بخش اختیاری از شی Intent است و رشته ای است که شامل اطلاعات اضافی در مورد نوع مولفه ای است که باید توسط Intent اداره شود. متد addCategory() یک Category را به یک شی Intentاضافه می کند.removeCategory() ، طبقه بندی ای (category) که قبلا اضافه شده را حذف می کند. و getCategories() مجموعه همه طبقه بندی هایی (category) که در حال حاضر در شی موجود است را بر میگرداند. در   Android Intend Standard Categories(لینک) میتوانید لیست دسته ها را مطالعه کنید.

در قسمت Intent Filters که در ادامه آمده است می توانید نحوه ی انتخاب و استفاده از یک دسته، که مناسب فعالیت یک Intent باشد را مورد بررسی قرار دهید.

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>

 

حال نوبت آن رسیده تا با استفاده از اندروید استودیو برنامه را اجرا کنیم. برای این منظور روی آیکون RunEclipse Run Icon که در نوار ابزار قرار دارد کلیک کنید.اگر همه چیز بدون مشکل پیش برود پنجره ی شبیه ساز شما مانند تصویر زیر خواهد بود.

حال روی دکمه ی شروع مرورگر کلیک کنید که در اثر آن مرورگر در حالی که به آدرس     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 Eclipse Run Iconکه در نوار ابزار قرار دارد کلیک کنید.اگر همه چیز بدون مشکل پیش برود پنجره ی شبیه ساز شما مانند تصویر زیر خواهد بود.

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

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

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

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