کار با Intent و دریافت نتیجه از اکتیویتی با اینتنت ، در قسمت چهاردهم آموزش برنامه نویسی اندروید مبحث کار با اینتنت در اندروید و دریافت نتیجه از اکتیویتی با اینتنت را بررسی میکنیم که مبحث مهم و پر کاربردی است یکی از کارایی های مهم این مبحث برای دریافت اطلاعات عبور (نام کاربری و رمز عبور) و بازگرداندن آن به اکتیویتی قبل می باشد.
توجه : برای مشاهده تصاویر در سایز اصلی بر روی آنها کلیک کنید.
متد ()startActivity یک اکتیویتی دیگر را فراخوانی میکند اما مقدار آن را برای اکتیویتی باز نمیگرداند. برای مثال فرض کنید یک اکتیویتی برای دریافت نام کاربری و رمز عبور ایجاد کرده اید اطلاعاتی که توسط کاربر وارد میشوند باید به اکتیویتی قبلی برای پردازش های لازم بازگردانده شود. اگر نیاز دارید تا اطلاعاتی را از یک اکتیویتی برگردانید ( دریافت نتیجه از اکتیویتی ) باید از متد ()startActivityForResult را فراخوانی کنید. مثال زیر این عملیات را به خوبی نمایش میدهد.
در همان پروژه آموزش قبل (IntentsPrj) کدهای زیر را به فایل secondactivity.xml اضافه کنید
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Please enter your name" />
<EditText
android:id="@+id/txt_username"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/ >
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Ok"
android:onClick="onClick" />
کدهای فوق یک TextView برای نمایش عبارت “Please enter your name” و یک EditText برای وارد کردن عبارتی که توسط کاربر نوشته میشود و یک دکمه که با فشردن آن عبارت ورودی توسط کاربر باید به اکتیویتی قبل ارسال شود.
حال کدهای زیر را به فایل SecondActivity.java اضافه میکنیم
import android.content.Intent;
import android.net.Uri;
import android.view.View;
import android.widget.EditText;
public void onClick(View v)
{
Intent data = new Intent();
//--get the EditText view--
EditText txt_username = (EditText)findViewById(R.id.txt_username);
//--set the data to pass back--
data.setData(Uri.parse(txt_username.getText().toString()));
setResult(RESULT_OK,data);
//--close the activity--
finish();
}
قسمت های زیر را نیز به فایل ManiActivity.java اضافه میکنیم
import android.view.View;
import android.widget.Toast;
import android.content.Intent;
public class MainActivity extends Activity {
int request_code=1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void onClick(View v)
{
//startActivity(new Intent("learn.SecondActivity"));
startActivityForResult(new Intent("learn.SecondActivity"),request_code);
}
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
if(requestCode == request_code){
if(resultCode == RESULT_OK){
Toast.makeText(this, data.getData().toString(), Toast.LENGTH_SHORT).show();
}
}
}
}
حال با اجرای برنامه مطابق شکل زیر ابتدا اولیت اکتیویتی ظاهر شده سپس با فشردن دکمه SecondActivity.xml نمایش داده میشود حال نام خود را وارد کرده و دکمه Ok را کلیک کنید سپس خواهید دید به اکتیویتی اول باز گشته و نام شمارا با استفاده از کلاس Toast نمایش میدهد
برای فراخوانی یک اکتیویتی و دریافت نتیجه از متد startActivityForResult() استفاده میکنیم
startActivityForResult(new Intent("learn.SecondActivity"),request_code);
علاوه بر آن برای ارسال یک شی باید کد درخواست آن را همینطور نوشت. کد درخواست یک عدد Integer ساده است که مشخص کننده اکتیویتی است که فراخوانی میکنیم این کار بدین دلیل انجام میشود که نیاز است وقتی یک اکتیویتی مقداری را برمیگرداند آنرا شناسایی کنیم برای مثال فرض کنید در آن واحد چند اکتیویتی را فراخوانی کنیم که ممکن است بعضی از آنها در ارسال نتیجه تاخیر داشته باشند(برای مثال ارسال درخواست به سرور). وقتی اکتیویتی نتیجه را ارسال نمود باید فهمید که از طرف کدام اکتیویتی بوده.
*اگر مقدار درخواست برابر ۱- بود بدین معنی است که فراخوانی آن به وسیله های هیچ یک از متدهای startActivity() ,startActivityForResult() توفیقی نداشته چرا که در هرصورت نتیجه ای برنمیگرداند.
برای برگرداندن یک مقدار توسط اکتیویتی به اکتیویتی فراخوان کننده از شی Intent برای ارسال اطلاعات از طریق متد setData() استفاده میکنیم.
Intent data = new Intent();
//--get the EditText view--
EditText txt_username = (EditText)findViewById(R.id.txt_username);
//--set the data to pass back--
data.setData(Uri.parse(txt_username.getText().toString()));
setResult(RESULT_OK,data);
//--close the activity--
finish();
متد ()setResult یک کد نتیجه را تنظیم میکند (که یا RESULT_OK است یا RESULT_CANCEL) و دیتا (یک شی Intent) به اکتیویتی فراخوان کننده بازگردانده میشود.متد ()finish نیز اکتیویتی را بسته و کنترل را به دست اکتیویتی فراخوان کننده میدهد.
در اکتیویتی فراخوان کننده باید متد ()onActivityResult پیاده سازی شود که درهنگام بازگشت یک اکتیویتی فراخوانی میشود
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
if(requestCode == request_code){
if(resultCode == RESULT_OK){
Toast.makeText(this, data.getData().toString(), Toast.LENGTH_SHORT).show();
}
}
}
در این مرحله است که باید صحت درخواست و نتیجه را چک کرده و مقدار بازگشتی را نمایش دهید. مقدار بازگشتی از طریق آرگومان data ارسال شده است که با استفاده از متد ()getData میتوان به جزییات آن دسترسی داشت.