کاربرد Intent در اندروید
کاربرد Intent در اندروید

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

حالا در ادامه این مقاله با ما همراه باشید کهIntent رو آموزش ببینیم

یک Activity جدید میسازیم به اسم Activity2 و در قسمت layout این اکتیویتی TextView زیر را قرار میدهیم.


<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Activity 2"
    android:textSize="30sp"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

در MainActivity کد زیر را به layout اضافه میکنیم.

<Button
    android:text="GotoActivity2"
    android:id="@+id/bt_activity2"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>

در Activity برای دکمه ای که اضافه کرده ایم یک رویداد click اضافه میکنیم.  و کد Intent را در این رویداد قرار میدهیم.

Intent در پارامتر اول Context را میگیرد در اصل context همان Activity جاری است و در پارامتر دوم Activity مقصد را میگیرد. در خط بعدی startActivty اجرا میشود این دستور در ورودی یک Intent میگیرد که حاوی اطلاعات این Activity و Activity مقصد است.

bt_activity2.setOnClickListener {
    var intent = Intent(this, Activity2::class.java)
    startActivity(intent)

}

با استفاده ازIntent میتوانیم داده هم به سمت Activity  مقصد ارسال کنیم.با دستور putExtra میتوانیم مقادیر را ست کنیم این دستور دو پارامتر میگیرد اولی اسم متغیر کهاز نوع String است و دومی مقدار که میتواند هرنوعی باشد.

var intent = Intent(this, Activity2::class.java)
intent.putExtra("username","bugeto")
intent.putExtra("password",123456)
startActivity(intent)

در اکتیویتی مقصد با دستور get و بعد از اون نوشتن نوع متغیر میتوانیم مقدار ارسالی را دریافت کنیم.به عنوان مثال برای گرفتن مقدار یک متغیر از نوع string از دستور getStringExtra استفاده میکنیم. 

class Activity2 : AppCompatActivity() {
    var username: String = ""
    var password: Int = 0
    var tvUser: TextView? = null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_2)
        username = intent.getStringExtra("username").toString()
        password = intent.getIntExtra("password", 0)
        Toast.makeText(this, "username: $username \n password: $password", Toast.LENGTH_LONG).show()
    }

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

در   layout چند دکمه طراحی میکنیم که هرکدام از این دکمه ها قرار است با استفاده از intent به یکی از اپلیکیشن های سیستم عامل هدایت شود. 

<Button
    android:id="@+id/bt_contact"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="20dp"
    android:text="Choose Contact"
    app:layout_constraintTop_toTopOf="parent" />

<Button
    android:id="@+id/bt_webBrowser"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="20dp"
    android:text="Web Browser"
    app:layout_constraintTop_toBottomOf="@+id/bt_contact" />


<Button
    android:id="@+id/bt_showMap"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="20dp"
    android:text="Show Map"
    app:layout_constraintTop_toBottomOf="@+id/bt_webBrowser" />

<Button
    android:id="@+id/bt_makeCalls"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="20dp"
    android:text="Make Calls"
    app:layout_constraintTop_toBottomOf="@+id/bt_showMap" />

درActivityبعد ازfindکردن.برای هر دکمه یک رویدادclickمینویسیم.

var btContact: Button? = null
var btWebBrowser: Button? = null
var btShowMap: Button? = null
var btMakeCalls: Button? = null
private var requestCode = 1
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    btContact = findViewById(R.id.bt_contact)
    btWebBrowser = findViewById(R.id.bt_webBrowser)
    btShowMap = findViewById(R.id.bt_showMap)
    btMakeCalls = findViewById(R.id.bt_makeCalls)
    listener()
}

private fun listener() {
    btContact?.setOnClickListener {
        var contact = Intent(Intent.ACTION_PICK)
        contact.type = ContactsContract.Contacts.CONTENT_TYPE
        startActivityForResult(contact, requestCode)

    }
     btShowMap?.setOnClickListener {
    var map = Intent(Intent.ACTION_VIEW,Uri.parse("geo:35.7443378,51.3506717"))
    startActivity(map)
}
    btMakeCalls?.setOnClickListener {
        var call = Intent(Intent.ACTION_DIAL, Uri.parse("tel:09122222222"))
        startActivity(call)

    }
    btWebBrowser?.setOnClickListener {
        var website = Intent(Intent.ACTION_VIEW, Uri.parse("https://www.bugeto.net"))
        startActivity(website)

    }
}

در این نوع از Intent باید دو پارامتر به ورودی Intent ارسال کنیم. اولین پارامتر action هست. این پارامتر مشخص میکنید که به چه شکلی اپ را به کاربر نمایش بدهد مثلا در دکمه MakeCall گفتیم که به شگل DIAL نمایشد بدهد یعنی به صفحه کلید انتقال داده میشود بعد کاربر میتواند تماس بگیرد یا منصرف شود.پارامتر دوم هم یکURI میگیرد که مشخص میکند به کدام آدرس باید برود از طریق رشته ای که در این پارامتر مینویسیم سیستم عامل تشخیص میدهد که باید کدام اپلیکیشن را باز کند.
اما در دکمهcontact  یه کم کدمان تغییر کرده است. یک type به intent اضافه شده است که مشخص کرده ایم محتوای کامل مخاطب را نمایش بدهد. وهمچنین در خط بعدی از startActivityForResualt استفاده کرده اینم. این متد علاوه بر intent یک requestCode هم میگیرد که در ادامه وقتی برسیم به متد onActivityResult از این متغییر استفاده میکنیم.

بعضی مواقع ما نیاز داریم که اطلاعاتی از اپلیکیشن باز شده به اپلیکیشن خودمان برگردانیم.برای این کار از متد onActivityResult استفاده میکنیم.
این متد سه پارامتر دارد به نام های requestCode وresultCode و data که از نوع intent است. از متغیر requestCode برای این امر استفاده میکنیم که مشخص کنیم این برگشت داده از کدام درخواست است وقتی که Activity را start میکنیم یک requestCode میفرستیم و اینجا دریافتش میکنیم. اما متغیر بعدی resultCode است که وضعیت درخواست را مشخص میکند اگر مقدارش برابر با RESULT_OK(مقدار این متغیر با یک enum مقایسه میشود) باشد یعنی درخواست به درستی انجام شده است.و متغیر بعدی data که حاوی اطلاعات برگشتی از اپلیکیشن مورد نظر است و ما میتوانیم این داده ها را واکشی کنیم. 
در Activity خارج از متد onCreate این متد را اضافه میکنیم.

override fun onActivityResult(requestcode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if(requestcode==requestCode){
        if (resultCode== RESULT_OK){
            Toast.makeText(this,data?.data.toString(),Toast.LENGTH_LONG).show()
            var i=Intent(android.content.Intent.ACTION_VIEW,Uri.parse(data?.data.toString()))
            startActivity(i)
        }
    }
}


 

 

تگ‌ها
اشتراک
0 نظرات

برای ارسال نظر باید وارد حساب کاربری خود شوید
ورود به حساب کاربری ثبت نام