آموزش اندروید فصل ۲۱ : Intent – پیاده سازی ۱

در فصل قبلی از سری مطالب آموزش برنامه نویسی اندروید، به معرفی Intent ها پرداختیم و انواع آن را با مثال های کاربردی بررسی کردیم. حال آماده ایم تا کمی هم کد بنویسیم و چند مثال خوب را با یکدیگر مرور کنیم. مثال هایی که برای این آموزش در نظر گرفته شده اند را در زیر میبینیم. مثال اول در این پست انجام خواهیم داد و بقیه را به پست بعدی موکول میکنیم.

۱- جابجایی بین دو اکتیویتی

۲- باز کردن یک سایت در اپلیکیشن مرورگر

۳- ارسال یک اس ام اس از طریق اپلیکیشن sms اندروید

۴- تماس مستقیم به یک شماره از طریق اپلیکیشن تماس اندروید

۵- تماس غیر مستقیم به یک شماره از طریق اپلیکیشن تماس اندروید

برای شروع ابتدا یک پروژه اندروید بسازید. با ساخت یک پروژه معمولا اولین اکتیویتی شما با نام MainActiviity بصورت پیش فرض ساخته میشود. برای دسته بندی کارهایی که میخواهیم انجام دهیم، طراحی و چیدمان زیر را در نظر گرفته ایم. به این صورت که با کلیک بر روی هر Button کار مورد نظر انجام شود. برای ظاهر Button ها یک style ایجاد کرده ایم تا مجبور به تکرار ویژگی های یکسان برای هر Button نباشیم. این استایل را در فایل style.xml در پوشه values قرار داده ایم. همچنین یک فایل rounded_shape.xml ساختیم که به پس زمینه Button ها بدهیم (background) و این فایل را نیز در پوشه res/dreawable قرار دادیم. این فولدر را خودمان ساختیم. در ادامه این فایل ها را بررسی می کنیم.  کدهای داحل layout_main تان را با کدهای زیر جایگزین کنید:main_layout_intent

 res/layout/activity_main.xml

<ScrollView 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" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:orientation="vertical"
        android:padding="10dp" >

        <Button
            android:id="@+id/nextActivityBtn"
            style="@style/myBtn"
            android:background="@drawable/rounded_shape"
            android:onClick="onBtnClick"
            android:text="Go To Next Activity" />

        <Button
            android:id="@+id/openBrowserBtn"
            style="@style/myBtn"
            android:onClick="onBtnClick"
            android:text="Open Browser" />

        <Button
            android:id="@+id/sendSmsBtn"
            style="@style/myBtn"
            android:onClick="onBtnClick"
            android:text="Send SMS" />

        <Button
            android:id="@+id/directCallBtn"
            style="@style/myBtn"
            android:onClick="onBtnClick"
            android:text="Direct Call" />

        <Button
            android:id="@+id/indirectCallBtn"
            style="@style/myBtn"
            android:onClick="onBtnClick"
            android:text="Indirect Call" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="smartlab.ir"
            android:layout_marginTop="15dp"
            android:textSize="23sp" />
    </LinearLayout>

</ScrollView>

نکته: از ScrollView استفاده کردیم تا اگر ارتفاع صفحه در یگ دستگاه کم بود، Button ها از کادر خارج نشوند و قابل اسکرول کردن باشند.

res/drawable/rounded_shape.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
    <corners android:radius="6dp"/>
    <solid android:color="#ffffff"/>
    <stroke android:width="1dp" android:color="#bbbbbb" />

</shape>

res/values/style.xml

<resources xmlns:android="http://schemas.android.com/apk/res/android">

    <style name="AppBaseTheme" parent="android:Theme.Light">
    </style>

    <style name="AppTheme" parent="AppBaseTheme">
    </style>

    <style name="myBtn">
        <item name="android:layout_width">wrap_content</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:layout_marginTop">10dp</item>
        <item name="android:paddingTop">5dp</item>
        <item name="android:paddingBottom">5dp</item>
        <item name="android:paddingRight">10dp</item>
        <item name="android:paddingLeft">10dp</item>
         <item name="android:background">@drawable/rounded_shape</item>
    </style>
</resources>

 

ما برای همه Button ها یک Onclick تعریف کرده ایم به نام onBtnClick  که متدی به همین نام را فراخوانی میکنند. در داخل آن متد switch-case ای که برای ()v.getId گذاشته ایم برای این است تا متوجه بشویم که کاربر بر روی کدام Button کلیک کرده است. این متد را در زیر میتوانید ببینید:

public void onBtnClick(View v){
		switch (v.getId()) {
		case R.id.nextActivityBtn:
			startAnExplicitIntent();
			break;
		case R.id.openBrowserBtn:
			startAnImplicitIntent_Browser();
			break;
		case R.id.sendSmsBtn:
			startAnImplicitIntent_Sms();
			break;
		case R.id.directCallBtn:
			startAnImplicitIntent_DirectCall();
			break;
		case R.id.indirectCallBtn:
			startAnImplicitIntent_IndirectCall();
			break;

		default:
			break;
		}

	}

برای مثال اول، یعنی جابجایی بین دو اکتیویتی،که یک Intent صریح (در Intent  های صریح نام اکتیویتی مقصد را میدانیم) محسوب میشود  ، متد  startAnExplicitIntent را نوشته ایم. این متد را باهم بررسی میکنیم:


	public void startAnExplicitIntent(){
		Intent i = new Intent(MainActivity.this, SecondActivity.class);
		i.putExtra("imageR", R.drawable.banner222);
		startActivity(i);
	}

بطور کلی برای استفاده از Intent  باید یک شیء از کلاس Intent  ساخت. این کلاس، سازنده(Constructor) های متفاوتی دارد. اگر نمیدانید سازنده چیست، باید مباحث شی گرای را دنبال کنید. اما فعلا اهمیتی ندارد. در همین حد بدانید که یک کلاس ممکن است چندین سازنده داشته باشد با پارامترهای ورودی مختلف(کافیست وقتی new Intent را نوشتید، ctrl + space  را بزنید تا انواع سازنده های آن کلاس برایتان لیست شود). یکی از این سازنده ها، دو پارامتر ورودی میگیرد. ما همین را انتخاب میکنیم.

Intent i = new Intent(MainActivity.this, SecondActivity.class

بررسی پارامترهای ورودی سازنده Intent

پارامتر اول، یک Context باید باشد. بخاطر داشته باشید هرگاه در اندروید، متد یا سازنده یا هرچیز دیگری که از شما Context خواست، اگر در یک Activity در حال کد زدن بودید، کافیست نام کلاس و در انتهایش کلمه this. را اضافه کنید و از آن به عنوان Context  استفاده کنید. یعنی MainActivity.this

( برای آن هایی که میخواهند بیشتر بدانند: this به کلاس جاری اشاره میکند. کلاس جاری هم که یک Activity است. Activity ها هم همگی در سلسله مراتب ارث بری یک Context محسوب میشوند )

پارامتر دوم، باید نام اکتیویتی مقصد باشد، برخلاف پارامتر قبلی که از کلمه this استفاده میکردیم، در این پارامتر باید از کلمه class. در انتهای نام اکتیویتی مقصد استفاده کنیم. یعنی : SecondActivity.class

برای این که به صفحه دوم برویم نیاز داریم گاهی اوقات داده ای راهم به صفحه بعد بفرستیم. برای اینکار از متد PutExtra روی شیء ای که ساختیم یعنی i ، استفاده میکنیم و داده هایمان را بصورت کلید/مقدار میفرستیم. کلید را برای این میگذاریم تا در اکتیویتی مقصد بتوانیم آن را بازیابی کنیم.مثلا در این مثال با کلیک بر روی Button مورد نظر، به صفحه بعد میرویم و یک عکسی که در اکتیویتی اول برایش فرستادیم، را نمایش میدهیم. حال اگر من یک Button دیگر داشتم که قرار بود عکسی دیگر را نشان دهد کافی ست در دستور putExtra آن مقدار کلید را عوض کنم و یک عکس دیگر را بفرستم.در این مثال از کلید دلحواه imageR استفده کردم. دقت کنید که ما خود عکس را نمیفرستیم. بلکه شناسه ای از عکس را که در R نگهداری میشود را میفرستیم. بطور کلی با متد putExtra فقط مجازیم داده های ساده و اولیه جاوا را بفرستیم.

i.putExtra("imageR", R.drawable.banner222);

حال که اینتنت مان را ساختیم متد putExtra  را هم برایش نوشتیم کافی است آن را به متد startActivity بدهیم تا کار را برای ما انجام دهد. این متد از متد های کلاس Activity است و خیلی پرکاربرد است و در ورودی خود یک Intent میگیرد. Intent ای که ساختیم را به او میدهیم و تمام.

 

دریافت داده ارسالی با Intent در Activity دوم

حال کاربر با کلیک بر رو Button به صفحه دوم میرود. اما این همه ماجرا نیست. باید داده ای را که همراه Intent فرستادیم را اینجا بازیابی کنیم. کدهای داخل کلاس مقصد یعنی SecondActivity.java و قالب صفحه یعنی layout_second.xml را در زیر مشاهده میکنید:

SecondActivity.java

package ir.smartlab.mysample;

import ir.smartlab.mysample.R;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.ImageView;

public class SecondActivity extends Activity {

	ImageView imgView;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_second);

		int imageR = R.drawable.ic_launcher; // default image
		Bundle bundle = getIntent().getExtras();
		if(bundle!=null){
			imageR = bundle.getInt("imageR");
		}

		imgView = (ImageView) findViewById(R.id.secondImageView);
		imgView.setImageResource(imageR);

	}

}

layout_second.xml

<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"
    tools:context=".SecondActivity" >

    <ImageView
        android:id="@+id/secondImageView"
        android:layout_width="350dp"
        android:layout_height="350dp"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:scaleType="centerCrop" />

</RelativeLayout>

در شروع onCreate بایستی اول Intent ای که با آن به این صفحه آمدیم را دریافت کنیم. سپس با صدا زدن متد getExtras داده های آن را دریافت میکنیم و آن را در یک متغیر از نوع   Bundle میریزیم. حال باید کلید مورد نظرمان را در آن جستجو کنیم. کافیست روی این Bundle  متد get را صدا بزنیم و کلیدی که قبلا استفاده کردیم(imageR) را به  عنوان ورودی به آن بدهیم. چون ما یک شناسه متعلق به R را فرستاده بودیم و این مقدار یک مقدار صحیح یعنی int محسوب میشد، لذا اینجا از دستور getInt استفده کردیم.

حال مقدار کلید یا همان شناسه عکس مان را دریافت کردیم کافیست آن را بر روی ImageView ای که در فایل layout_second تعریف کردیم، ست کنیم. تمام.

imgView.setImageResource(imageR);

secondActivity

ادامه این مبحث، یعنی Intent های ضمنی را در پست بعدی در قالب همین پروژه با مثال هایی که در بالا ذکر شد، ادامه خواهیم داد.

برای دریافت پروژه کامل این مبحث، اینجا کلیک کنید.

برای دریافت اسلایدهای این مبحث، اینجا کلیک کنید.





12 فکر می‌کنند “آموزش اندروید فصل ۲۱ : Intent – پیاده سازی ۱

  1. کورش باغبانی

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

    ۱ دنیا ممنون، خدا حفظتون کنه 🙂

    پاسخ
  2. کورش

    ببخشید اگر مثل همین اسلایدی که قرار دادید مطالب دیگری هم دارید که روان است ، لطف کنید به ما معرفی کنید تا مطالعه کنیم و جلوتر بیفتیم و دید بهتری هم داشته باشیم . چون بروز رسانی نسبت به مطلب درون آن کمی دیر انجام می شود . هم اطلاعاتی را به طور جزئی بدست بیاریم و تمرین و استفاده کنیم و هم زمانی که شما مطالب را گذاشتید بهتر درک کنیم

    با تشکر

    پاسخ
  3. omid

    با سلام

    تشکر بابت مطالب مفیدتون

    مبحثی که توی سایت های ایرانی به اون پرداخته نمیشه گرافیک در اندروید هستش

    البته دیدم که شما دو مطلب به اون اختصاص دادید

    اما بازهم کمه

    اگر ممکنه یک آموزش به صورت پروژه محور (مثلا ساخت PAINT در اندروید )داشته باشید

    با تشکر

    پاسخ
  4. مسعود

    سلام اساتید گرامی
    من دو اکتیویتی رو ساختم ولی موقع run شدن خطا force close میده و تو پنجره logcat این خطا رو میده ۰۷-۲۵ ۱۴:۴۳:۴۲٫۶۲۱: E/dalvikvm(1066): Unable to open stack trace file ‘/data/anr/traces.txt’: Permission denied
    سرچ کردم یکی از دلایلش اینه که شاید تو منیفست اکیتویتی دو رو معرفی نکرده باشم ولی معرفی شده ممنون میشم راهنماییم کنید.

    پاسخ
  5. مجید

    سلام آقا احسان ، خیلی ممنون از آموزشهاتون .
    آقا احسان اگر میشه یک مقدار در مورد context توضیح بدید . من اینو نمیتونم درست درک کنم که کجاها از this و کجاها از getApplicaationContext()استفاده کنم . ممنون میشم اگر یک مقدار راجع بهش توضیح بدید.
    خیلی ممنون.

    پاسخ
  6. داش مجید

    با سلام آقا احسان ، خیلی ممنون از آموزشهاتون .
    آقا احسان اگر میشه یک مقدار در مورد context توضیح بدید . من اینو نمیتونم درست درک کنم که کجاها از this و کجاها از getApplicaationContext استفاده کنم . ممنون میشم اگر یک مقدار راجع بهش توضیح بدید
    خیلی ممنون.

    پاسخ
  7. valayarxk

    سلام استاد سوالی خدمت جنابعالی داشتم ولی نمیدونم می تونم منظورمو برسونم یا نه؟
    چون تو دو سه تا سایت هم سوالمو مطرح کردم ولی متاسفانه نتونستم منظورمو واضح تر توضیح بدم
    سوالم از این قراره که بنده می خوام یه برنامه ای بنویسم مثل کتاب که وقتی تو اکتیویتی اول روی مثلا آیتم اول از لیست ویو کلیک می کنم از پوشه asset فایل اچ تی ام الی که قرار دادم (مثلا بیست تا صفحه اچ تی ام ال دارم که تو پوشه asset هست) یکی رو که خودم می گم کدوم یکی انتخاب کنه و ببره به اکتیویتی دوم و اونو تو یه webView دریافت کنه به همین ترتیب همه فایل های asset رو بفرستم و دریافت کنم و مشکلی که بنده دارم اول اینکه تو اکتیویتی اول نمی تونم فایل هارو از پوشه asset دریافت کنم ممنون میشم که بگید چجوری و با چه کدی فایلهای پوشه اسیت را دریافت کنم و دوم اینکه تو اکتیویتی دوم باچه کدی دریافت کنم
    مدیونتون میشم اگه کامل توضیح بدین ؟

    پاسخ

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *