مشخصات مقاله
-
3606
-
0.0
-
7388
-
0
-
4
آموزش Intent در اندروید-intent filter در اندروید
دوره آموزش برنامه نویسی اندروید
کلیه حقوق مادی و معنوی این مقاله متعلق به آموزشگاه تحلیل داده می باشد و هر گونه استفاده غیر قانونی از آن پیگرد قانونی دارد.
آموزش Intent در اندروید )قسمت دوم(
4. معرفی intent filter ها
Intent filter چیست؟
Intent ها جهت آگاه سازی سیستم اندروید از وقوع رخداد معینی به کار می روند. intent ها اغلب عملیاتی (action) که باید انجام شود و همچنین داده هایی که عملیات گفته شده باید بر اساس آن صورت گیرد را توصیف می کند. برای مثال، برنامه ی کاربردی قادر است از طریق intent، یک مولفه یا جز مرورگر (browser component) ویژه ی URL معین راه اندازی کند. این امر در تکه کد زیر با مثال تشریح شده.
String url = "http://www.tahlildadeh.com";
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(url));
startActivity(i);
اما سیستم اندروید چگونه باید کامپوننت هایی که تنها به intent مشخصی واکنش نشان می دهد را شناسایی کند؟
یک مولفه این امکان را دارد که از طریق intent filter خود را ویژه ی عملیات و داده های معین تنظیم کرده و تخصیص دهد. intent filter نوع intent هایی که یک activity، service، broadcast receiver نسبت به آن واکنش نشان می دهد را با معرفی قابلیت های مولفه تعیین می کند.
کامپوننت های اندروید، intent filter ها را یا به صورت ایستا (statically) در AndroidManifest.xml تخصیص می دهند یا در مورد broadcast receiver (آن ها از طریق کد) به صورت پویا (dynamically) رجیستر می کنند. لازم به ذکر است که intent filter بر اساس دسته بندی (category)، عملیات و فیلتر داده های (data filter) آن تعریف می شود. گفتنی است کهintent filter همچنین ممکن است دربردارنده ی metadata (داده ای که درباره ی دادهای دیگر اطلاعاتی را ارائه دهد) باشد.
در صورت ارسال یک intent به سیستم اندروید، محیط یا پلتفرم اندروید یک بررسی درباره ی دریافت کننده ی intent انجام می دهد (اینکه گیرنده ی پیغام یا intent کدام کامپوننت است) که به آن receiver determination می گویند. سپس سیستم اندروید داده های درون یک intent را مورد استفاده قرار می دهند.
چنانچه چندین کامپوننت ویژه ی تنها یک filter intent ثبت شده باشد، این کاربر است که باید انتخاب کند کدام مولفه اجرا شود.
تعریف intent filter
شما می توانید کامپوننت های اندروید خود را به کمک intent filter ویژه ی رخداد معینی ثبت (register) کنید. در صورتی که کامپوننت مورد نظر، intent filter خاصی را در نظر نگرفته یا تعریف نکرده باشد، فقط intent صریح است که می تواند آن را مشخص و فراخوانی کند.
در این فصل مثالی مبنی بر نحوه ی تخصیص کامپوننت به intent ارائه شده. آنچه در فرایند تخصیص یا ثبت (registration) دارای اهمیت می باشد، این است که کامپوننت مورد نظر به عملیات مربوطه و mime-type مناسب اختصاص یابد، همچنین metadata ی صحیح را مشخص کند.
اگر چنین intent ای را به سیستم خود ارسال کنید، سیستم اندروید خود تمامی کامپوننت های تخصیص یافته به آن intent را شناسایی می کند. در صورتی که چندین مولفه ویژه ی intent مذکور ثبت شده باشد، کاربر می تواند انتخاب کند کدام (کامپوننت) باید مورد استفاده قرار گیرد.
مثال
کدی که زیر مشاهده می کنید یک activity ویژه ی intent ثبت و تنظیم می کند. intent نام برده قرار است هر زمان کاربری یک صفحه ی وب را باز کرد فعال (trigger) شود.
<activity android:name=".BrowserActivitiy"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="http" />
intent-filter>
activity>
ثبت یک activity برای اینتنت ACTION_SEND
مثال زیر یک activity ویژه ی اینتنت ACTION_SEND ثبت می کند.
<activity android:name=".ActivityTest"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimetype="text/plain" />
intent-filter>
activity>
به یاد داشته باشید که اگر کامپوننت هیچگونه intent filter تعریف نکرد، فراخوانی آن تنها از طریق explicit intent امکان پذیر می باشد.
5. فعال سازی رویدادها به وسیله ی intent
می توان از intent ها به منظور ارسال broadcast message ها به سیستم اندروید کمک گرفت. broadcast receiver می تواند در یک رخداد ثبت شده و از رخداد مشابه ارسال شده مطلع گردد.
اپلیکیشن ها می تواند در رخدادهای سیستم برای مثال زمانی که ایمیل جدیدی به شما ارسال شده یا فرایند بالا آمدن سیستم به اتمام رسیده و یا تماس تلفنی تازه ای صورت گرفته ثبت گردند و متناسب با هر یک از این رخدادها واکنش نشان دهند.
6. بررسی و شناسایی intent receiver های معتبر
گاهی اوقات شما می خواهید ببینید آیا کامپوننتی برای یک intent ثبت شده یا خیر. برای مثال اول بررسی می کنید آیا دریافت کننده intent (intent receiver) وجود دارد، سپس در صورت موجود بودن کامپوننت مورد نظر قابلیت را در برنامه ی کاربردی خود فعال سازی می کنید.
این پروسه ی بررسی را می توان با استفاده از کلاس PackManager انجام داد.
نمونه کد زیر بررسی می کند آیا مولفه ی خاصی برای intent موردنظر ثبت شده یا خیر.
public static boolean isIntentAvailable(Context ctx، Intent intent) {
final PackageManager mgr = ctx.getPackageManager();
List list =
mgr.queryIntentActivities(intent،
PackageManager.MATCH_DEFAULT_ONLY);
return list.size() > 0;
}
بر اساس نتیجه حاصله قادر خواهید بود اپلیکیشن خود را تنظیم کنید، به طور مثال تعدادی از آیتم های قابل گزینش (menu item) را غیر فعال یا پنهان سازید.
7. تمرین : راه اندازی activity ها
هدف اصلی این تمرین
تمرینی که پیش رو داریم قصد دارد نحوه ی استفاده از intent صریح جهت راه اندازی sub-activity و ارسال اطلاعات به آن را با به مثال به شما بفهماند.
ایجاد پروژه و طرح بندی اصلی
یک پروژه ی جدید اندروید به نام com.vogella.android.intent.explicit ایجاد کرده و activity آن را MainActivity نام گذاری کنید.
فایل layout آن را به به ترتیب زیر اصلاح کنید.
<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=".MainActivity">
<edittext android:id="@+id/inputforintent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:minheight="60dip"
android:text="First Activity"
android:textsize="20sp">
EditText>
<button android:id="@+id/startintent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignleft="@+id/inputforintent"
android:layout_below="@+id/inputforintent"
android:onclick="onClick"
android:text="Calling an intent" />
relativelayout>
ایجاد فایل layout جدید
فایل layout جدیدی به نام activity_result.xml ایجاد کنید. در مرحله بعد activity ای تازه ای ایجاد می کنید که از این فایل استفاده می کند.
به منظور ایجاد فایل layout، پروژه ی مربوطه را انتخاب کرده و روی آن راست کلیک کنید، سپس : File → New → Other... → Android → Android XML File حال گزینه ی Layout را انتخاب کنید.
activity_result.xml را به عنوان اسم فایل وارد کرده و دکمه ی Finish را کلیک کنید. اکنون طرح بندی (layout) خود را به گونه ای اصلاح کنید که شبیه فایل XML زیر درآید.
<xml version="1.0" encoding="utf-8" ?>
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<textview android:id="@+id/displayintentextra"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Input"
/>
<edittext android:id="@+id/returnValue"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<requestfocus />
EditText>
linearlayout>
ایجاد activity دیگر
کلاس جدیدی به نام ResultActivity بر اساس کد زیر ایجاد کنید.
package com.vogella.android.intent.explicit;
import android.app.Activity;
import android.os.Bundle;
public class ResultActivity extends Activity {
@Override
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView(R.layout.activity_result);
}
}
اکنون activity جدیدی به نام ResultActivity به فایل AndroidManifest.xml اضافه کنید.
<xml version="1.0" encoding="utf-8" ?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.vogella.android.first"
android:versioncode="1"
android:versionname="1.0">
<uses-sdk android:minsdkversion="14" />
<application android:icon="@drawable/ic_launcher"
android:label="@string/app_name">
<activity android:label="@string/app_name"
android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
intent-filter>
activity>
<activity android:label="Result Activity"
android:name=".ResultActivity">
activity>
application>
manifest>
توجه
activity نام برده به وسیله ی MainActivity راه اندازی می شود، به همین خاطر یک sub-activity اطلاق می گردد.
راه اندازی sub-activity
Sub-activity را با یک کلیک از کلاس MainActivity راه اندازی کنید. کد زیر با ارائه ی تعداد معدودی نکته ی آموزشی نحوه ی مدیریت و حل این مسئله را تشریح می کند. TODO ها را در متن برنامه (source code) حل کرده تا از این طریق ResultActivity از متد onClick () راه اندازی شود.
package com.vogella.android.intent.explicit;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void onClick(View view) {
EditText text = (EditText) findViewById(R.id.inputforintent);
// used later
String value = text.getText().toString();
// TODO 1 create new Intent(context، class)
// use the activity as context parameter
// and "ResultActivity.class" for the class parameter
// TODO 2 start second activity with
// startActivity(intent);
}
}
پس از اینکه این بخش از تمرین را پشت سر گذاشته اید، برنامه ی کاربردی خود را اجرا کنید، سپس بررسی کنید آیا می توانید activity دوم را به درستی راه اندازی کنید یا خیر.
ارسال داده به ResultActivity
کلاس MainActivity باید مقدار EditText view را به sub-activity مربوطه ارسال کند. برای این منظور لازم است putExtra"yourKey"، (string) را در شیIntent بکارببرید.
دستیابی به داده های intent در ResultActivity
در sub-activity بیان شده (ResultActivity) با فراخوانی متد getIntent (). getExtras () به Bundle و داده های intent دست پیدا کنید.
با استفاده از متد ("yourkey"extras. getString ( در شی bundle (که با فراخوانی متد getExtras () بدست آوردید)، مقدار extra ارسال شده را دریافت کنید.
مقدار نام برده باید در TextView با شناسه (ID) displayintentextra جای گذاری شود.
8. تمرین : دریافت داده از sub-activity ها
هدف این تمرین
هچنان به استفاده از پروژه ای که قبلاً ایجاد کرده بودید (com.vogella.android.intent.explicit) ادامه دهید.
در تمرین زیر کاری که می کنید این است که داده ها را از sub-activity دوم به MainActivity (مجرد اینکه کاربر دکمه ی بازگشت (back button) را بکار می گیرد) انتقال می دهید.
برگرداندن داده از ResultActivity
متد finish () را به کلاس ResultActivity اضافه کنید.
@Override
public void finish() {
// TODO 1 create new Intent
// Intent intent = new Intent();
// TODO 2 read the data of the EditText field
// with the id returnValue
// TODO 3 put the text from EditText
// as String extra into the intent
// use editText.getText().toString();
// TODO 4 use setResult(RESULT_OK، intent);
// to return the Intent to the applicationa
super.finish();
}
کلیه ی TODO ها را حل کنید.
