فراخوانی برنامه ها از قبل ساخته شده ( 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

به  طور کلی  این دو 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 را نشان میدهد  مشاهده کنید

اجرای برنامه های  Built in در اندروید

توضیحات

 در اینجا  شما یک  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 کنید

اجرای برنامه های  Built in در اندروید

شما در  عنصر  <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”));

اجرای برنامه های  Built in در اندروید

اگر چندین  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..."));

نظرات (۰)

هيچ نظري هنوز ثبت نشده است
ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی