فراخوانی برنامه ها از قبل ساخته شده ( Built –in ) با استفاده از intent
بسم الله الرحمن الرحیم
فراخوانی برنامه ها از قبل ساخته شده ( Built –in ) با استفاده از intent
فصل دوم-بخش یازدهم
تا اینجا شما یاد می گیرید که چگونه activity ها را در برنامه خود فراخوانی کنید. یک از جنبه های بسیار مهم برنامه نویسی اندرو.ید این می باشد که شما می توانید با استفاد از intent ها activity های برنامه های دیگر را در برنامه خود فرا خوانی کنید.به خصوص, برنامه شما می تواند برنامه های Built-in را که در دستگاه های که از اندروید استفاده می کنند را فرا خوانی کنند. به عنوان مثال اگر شما نیاز دارید تا یک صفحه وب را باز کنید. شما می توانید با شی Intent برنامه از قبل ساخته شده , web Browser را اجرا کنید. ودیگر نیازی به ایجاد برنامه ای که صفحات وب را نمایش می دهد نمی باشد.
آن را به یک مثال شرح می دهیم.
پروژه جدید را به نامIntents ایجاد کنید.
دستورات زیر را در فایلmain.xml اضافه کنید
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<Button
android:id="@+id/btn_webbrowser"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Web Browser"
android:onClick="onClickWebBrowser" />
<Button
android:id="@+id/btn_makecalls"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Make Calls"
android:onClick="onClickMakeCalls" />
<Button
android:id="@+id/btn_showMap"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Show Map"
android:onClick="onClickShowMap" />
</LinearLayout>
دستورات زیر در فایلmainActivity.java وارد کنید.
package com.MehrdadJavidi.intents;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends Activity {
int request_Code = 1;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
public void onClickWebBrowser(View view) {
Intent i = new
Intent(android.content.Intent.ACTION_VIEW,
Uri.parse("http://www.amazon.com"));
startActivity(i);
}
public void onClickMakeCalls(View view) {
Intent i = new
Intent(android.content.Intent.ACTION_DIAL,
Uri.parse("tel:+651234567"));
startActivity(i);
}
public void onClickShowMap(View view) {
Intent i = new
Intent(android.content.Intent.ACTION_VIEW,
Uri.parse("geo:37.827500,-122.481670"));
startActivity(i);
}
}
F11 را بزنید تا برنامه اجرا شود.
توجه کنید برای نمایش نقشه باید ازAVD استفاده کنید که Google APIs. را پشتیبانی می کند
توضیحات
در این مثال شما به intent می گویید که برنامه های built-in را که از قبل وجود دارد را اجرا کند. از قبیل (Browser).وMaps,وPhone,)
در اندروید intent ها معمولا با دو پارا متر action,Data می آیند. Action آن چیزی است که باید اجرا شود.وData ان چیزی است که آن action بر روی آن عملیات انجام میدهد.
مثالی از action ها :
- ACTION_VIEW
- ACTION_DIAL
- ACTION_PICK
مثالی از Data
- www.google.com
- tel:+651234567
- geo:37.827500,-122.481670
- content://contacts
به طور کلی این دو actonو data عملیاتی که باید انجام شود را شرح میدهند.
به عنوان تماس گرفتن شما بایدACTION_DIAL/tel:+651234567 استفاد کنید . برای نمایش شماره تلفن های ذخیره شده در گوشی ازACTION_VIEW/content://contacts استفاده می کنید
در button اول شما یک شی intent که را ایجاد کردید که 2 پاامتر را دریافت می کرد.action وdata
Intent i = new
Intent(android.content.Intent.ACTION_VIEW,
Uri.parse("http://www.amazon.com"));
startActivity(i);
که action در اینجا با ثابت android.content.Intent.ACTION_VIEW نمایش داده می شود شما می توانید از متد parse مربوط به کلاس uri برای تبدیل متن URL به uri مربوط به action استفاده کنید.
ثابت android.content.Intent.ACTION_VIEW معمولا به android.intent.action.VIEW اشاره دارد بنابراین شما می توانید دستورات به صورت زیر تغییر دهید
Intent i = new
Intent(android.content.Intent.ACTION_VIEW,
Uri.parse("http://www.amazon.com"));
startActivity(i);
startActivity(i);همچنین می توان به صورت زیر نوشت.
Intent i = new
Intent("android.intent.action.VIEW");
i.setData(Uri.parse("http://www.amazon.com"));
startActivity(i);
شما در این جا data آن را به متد setDtata تنظیم کرده اید.
در button دوم شما برای تماس شماره را تعیین کرده اید که در Data Portion می باشد.
Intent i = new
Intent(android.content.Intent.ACTION_DIAL,
Uri.parse("tel:+651234567"));
startActivity(i);
در این مورد شما شماره ای که باید تماس بگیرد را نمایش می دهید. و برای انجام تماس باید دکمه dial را فشار دهید.
اگر شما می خواهید بدون نیاز به فشار دادن دکمه dial مستقیم تماس انجام شود تغییرات زیر انجام دهید.
Intent i = new
Intent(android.content.Intent.ACTION_CALL,
Uri.parse("tel:+651234567"));
startActivity(i);
برای اینکه شما بتوانید به طور مستقیم تماس را انجام دهید شما باید permissionبا نام android.permission.CALL_PHONE را به برنامه بدهید
Intent i = new
Intent(android.content.Intent.ACTION_DIAL,
Uri.parse("tel:+651234567"));
startActivity(i);
در دکمه سوم برای نمایش نقشه از ثایتACTION_VIEW استفاد می کنیم
Intent i = new
Intent(android.content.Intent.ACTION_VIEW,
Uri.parse("geo:37.827500,-122.481670"));
startActivity(i);
});
}
}
به جای http” ازgeo” استفاده می کنیم
فهمیدن و درک شی intent
تا اینجا شما یاد گرفته اید که از شی intent برای فرا خوانی activity ها استفاده کنید. این زمان بهترین زمان برای این است که شما جزئیات بیشتری د مورد intent بفهمید.
شما یاد گرفتید که activity های دیگر را با ارسال action به سازنده آن فراخوانی کنید.
Intent i = new
Intent("com.MehrdadJavidi.passingdata.SecondActivity");
action (در این مثال com.MehrdadJavidi.passingdata.SecondActivity) به عنوان component name شناخته می شود. که آن برای شناسایی activity /Program استفاده می شود و با آن activity را اجرا می کند.شما می توانید component name را دو باره بازنویسی کنید این بار با نام کلاس activity که دربر نامه تعیین کرده اید.
startActivity(new Intent(this, SecondActivity.class));
شما همچنین می توانید یک شی intent ایجاد کنید که دو پارامتر action و data را به آن ارسال کنید.
شما می توانید data آن را با متد setData به آن بدهید
Intent i = new Intent("android.intent.action.VIEW");
i.setData(Uri.parse("http://www.amazon.com"));
در این مثال شما خواستید که یک صفححه web را مشاهده کنید. که Url آن را تعیین کردید.سیستم عامل Android به دنبال activity های می گردد که بتواند در خواست شما را انجام دهد که این پروسس به عنوان intent resolution شناخته می شود. که جزئیات بشتر را در بخش بعدی شرح می دهیم.
برای بعضی از intent ها نیاز به ارسال data نمی باشند. به عنوان مثال انتخاب یک نام(contact) از برنامه تماس(Contacts application) .
شما یک action و یک نوع MIME را توسط متد( setType( تعیین می کنید.
Intent i = new
Intent(android.content.Intent.ACTION_PICK);
i.setType(ContactsContract.Contacts.CONTENT_TYPE);
در فصل هفتم به شما شرح می دهم که چگونه Contant ها در برنامه خود استفاده کنید.
متد setType() به طور نوع داده MIME که می خواهد بر گر داند صریح بیان می کند. نوع داده MIME برای ContactsContract.Contacts.CONTENT_TYPE , " vnd.android .cursor.dir/contact " می باشد .
در کنار تعیین action ,Data,،Type برای intent. برای شی intent می تواند Category هم تعیین شود.
Category مجموع ای از Activity ها می باشد که می تواند در یک Unit قرار گیرند. که android می تواند از آن ها برای بیشر Filtering استفاده می کند. که در بخش بعدی جزئیات بیشتری شرح می دهیم.
به طور خلاصه شی Intent می تواند شامل اطلاعات زیر باشد.
- Action
- Data
- Type
- Category
استفاده از Intent Filters
قبلا دیدید که چطور activity ها را باشی intent فرا خوانی می کنید.
و برای اجرای activity ها شما نیاز دارید که Category را برای آن در عنصر <intent-filter> در فایل AndroidManifest.xml تعریف کنید
<intent-filter>
<action android:name="com.MehrdadJavidi.passingdata.SecondActivity" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
این یک مثال برای یک activity است که توسط activity های دیگر با استفاد ه از action با نام “com.MehrdadJavidi.passingdata.SecondActivity فراخوانی می شود
در زیر مثال های پیچده تری بیان می کنیم.
در پروژه قبلی Intents کلاس جدید به نام MyBrowserActivity ایجاد کنید و همچنین یک فایل Xml جدید به نام browser.xml در مسیر res/layout ایجاد کنید
دستورات زیر را در فایلAndroidManifest.xml اضافه کنید
<intent-filter>
<action android:name="com.MehrdadJavidi.passingdata.SecondActivity" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
این یک مثال برای یک activity است که توسط activity های دیگر با استفاد ه از action با نام “com.MehrdadJavidi.passingdata.SecondActivity فراخوانی می شود
در زیر مثال های پیچده تری بیان می کنیم.
در پروژه قبلی Intents کلاس جدید به نام MyBrowserActivity ایجاد کنید و همچنین یک فایل Xml جدید به نام browser.xml در مسیر res/layout ایجاد کنید
دستورات زیر را در فایلAndroidManifest.xml اضافه کنید
encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.MehrdadJavidi.Intents"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="14" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.INTERNET" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:name=".IntentsActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".MyBrowserActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:name="com.MehrdadJavidi.MyBrowser" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="http" />
</intent-filter>
</activity>
</application>
</manifest>
دستور زیر را در فایل main.xml اضافه کنید
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<Button
android:id="@+id/btn_webbrowser"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:onClick="onClickWebBrowser"
android:text="Web Browser" />
<Button
android:id="@+id/btn_makecalls"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:onClick="onClickMakeCalls"
android:text="Make Calls" />
<Button
android:id="@+id/btn_showMap"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:onClick="onClickShowMap"
android:text="Show Map" />
<Button
android:id="@+id/btn_launchMyBrowser"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:onClick="onClickLaunchMyBrowser"
android:text="Launch My Browser" />
</LinearLayout>
در mainActivity.java دستورات زیر را اضافه کنید اضافه کنید
package com.MehrdadJavidi.intents;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
public class IntentsActivity extends Activity {
int request_Code = 1;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) { … }
public void onClickWebBrowser(View view) { … }
public void onClickMakeCalls(View view) { ... }
public void onClickShowMap(View view) { ... }
public void onClickLaunchMyBrowser(View view) {
Intent i = new
Intent("com.MehrdadJavidi.MyBrowser");
i.setData(Uri.parse("http://www.amazon.com"));
startActivity(i);
}
}
دستورات زیر در فایل browser.xml اضافه کنید
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<WebView
android:id="@+id/WebView01"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
دستورات زیر را در فایل MyBrowserActivity.java اضافه کنید
package com.MehrdadJavidi.intents;
import android.app.Activity;
import android.net.Uri;
import android.os.Bundle;
import android.webkit.WebView;
import android.webkit.WebViewClient;
public class MyBrowserActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.browser);
Uri url = getIntent().getData();
WebView webView = (WebView) findViewById(R.id.);
webView.setWebViewClient(new Callback());
webView.loadUrl(url.toString());
}
private class Callback extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading
(WebView view, String url) {
return(false);
}
}
}
دکمه های F11 را فشا دهید تا برنامه emulator. در اجرا شود
دکمه راLaunch my Browser بزنید شما باید یک activity جدید را که سایت Amazon.com را نشان میدهد مشاهده کنید
توضیحات
در اینجا شما یک activity به نام ایجاد MyBrowserActivity کردید. شما آن را در فایل AndroidManifest.xml تعریف کردید.
<activity android:name=".MyBrowserActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:name="com.MehrdadJavidi.MyBrowser" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="http" />
</intent-filter>
</activity>
در Elemetnt به نام <intent-filter> شما دو Action به نام های category, و data. تعریف کردید. به این معنی می باشد که تمام Activity های دیگر می توانند این Activity را با android.intent.action.VIEW و یا “com.MehrdadJavidi.MyBrowser فراخوانی کنند. اگر شما می خواهید که Activity توسط startActivity() or startActivityForResult() صدا زده شد. شما باید Category به عنوان “android.intent.category.DEFAULT” به آن داد با Elemet با نام data شما تعیین می کنید که این Activity حامل چه نوع داده است که در این جا " http” " می باشد
فایل AndroidManifest.Xml را به صورت زیر تعییر دهید و برنامه را اجرا کید.
<activity android:name=".MyBrowserActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:name="com.MehrdadJavidi.MyBrowser" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="http" />
</intent-filter>
</activity>
برنامه را اجرابا F11 کنید
شما در عنصر <intent-filter> دو Action یکی category, و دیگری data..
این به این معنی می باشد که دیگر Activity ها می توانند این activity را را با android.intent.action.VIEW و com.MehrdadJavidi.MyBrowser فراخوانی کنند.
تمام activity ها startActivity() or startActivityForResult()می شوند اگر شما می خواهید با این متد ها فراخوانی شوند شما category به نام android.intent.category.DEFAULT تعیین شود در غیر این صورت توسط دیگر Activity ها غیر قابل فراخوانی شدن می باشد.
عنصر <data> نوع داده activity را تعیین می کند. که در اینجا نوع داده با پیشوند “http:// شروع می شود.
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:name="com.MehrdadJavidi.MyBrowser" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="http" />
</intent-filter>
</activity>
حال اگر شما از ACTION_VIEW و داده تعیین استفاده کنید پنجره زیر نمایش داده می شود
Intent i = new
Intent(android.content.Intent.ACTION_VIEW,
Uri.parse(“http://www.amazon.com”));
اگر چندین activity با شی intent یکی باشد یک دیالوگ باعنوان Complete action using نمایش داده می شود
که برای تعیین این عنوان توسط خودتان از متد createChooser() شی intent استفاده می کنیم مانند زیر عمل می کنیم
Intent i = new
Intent(android.content.Intent.ACTION_VIEW,
Uri.parse(“http://www.amazon.com”));
startActivity(Intent.createChooser(i, “Open URL using...”));
توجه کنید که کد بالا پنجره نمیاش داده شده (سمت چپ) برای یکی بودن activity ها را به صورت شکل سمت راست تغییر داده و دیگر activit ها و گزینه Use by default for this action در دسترس نمیباشد
اضافه کردن Category
شما می توانید Activity ها را در گرو های یکسان با استفاده از عنصر <category> دسته بندی کنید.
فرض کنید می خواهید عنصر <category> را در فایل AndroidManifest.xml اضافه کنید
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.MehrdadJavidi.Intents"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="14" />
<uses-permission android:name="android.permission.CALL_PHONE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<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:name=".MyBrowserActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:name="com.MehrdadJavidi.MyBrowser" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="http" />
</intent-filter>
</activity>
</application>
</manifest>
در این موارد شما می توانید MyBrowerActivity را به صورت مستقیم فراخوانی کنید
Intent i = new
Intent(android.content.Intent.ACTION_VIEW,
Uri.parse("http://www.amazon.com"));
i.addCategory("com.MehrdadJavidi.MyBrowser");
startActivity(Intent.createChooser(i, "Open URL using..."));