تبادل اطلاعات بین اکتیویتی ها با اینتنت ، در قسمت چهاردهم آموزش برنامه نویسی اندروید مبحث بازگرداندن نتایج از اینتنت را آموزش داده ایم حال در این آموزش مبحث روش کار ارسال اطلاعات از یک اکتیویتی به اکتیویتی دیگر را که یکی دیگر از قابلیت های مهم برنامه نویسی اندروید می باشد را آموزش داده ایم.
توجه : برای مشاهده تصاویر در سایز اصلی بر روی آنها کلیک کنید.
علاوه بر امکان دریافت دیتا که در آموزش قبل توضیح دادیم میتوان به یک اکتیویتی دیتا نیز ارسال کرد (ارسال مقدار به اکتیویتی دیگر). برای مثال میتوان در مثال قبل یک متن پیش فرض در EditText قرار داد و میتوان برای انجام این کار از شی Intent جهت ارسال دیتا به اکتیویتی استفاده کرد.
در مثال زیر روش تبادل اطلاعات بین اکتیویتی ها را مشاهده می کنید. پروژه جدیدی به نام PassingData ایجاد کرده و طبق کدنویسی زیر در فایل activity_main.xml یک Button یا دکمه ایجاد میکنیم
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Click to go to the second Activity"
android:onClick="onClick" />
حال در فولدر res/layout یک فایل جدید به نام secondactivity.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">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="welcome to second Activity"/>
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="click to return to main activity"
android:onClick="onClick2" />
</LinearLayout>
حال یک کلاس جدید به نام SecondActivity ایجاد کرده و محتویاتش را چنین کدنویسی میکنیم
package com.example.passingdata;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.*;
public class SecondActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.secondactivity);
//--get the data passed in using getStrigExtra()--
Toast.makeText(this, getIntent().getStringExtra("str1"),
Toast.LENGTH_SHORT).show();
//--get the data passed in using getIntExtra--
Toast.makeText(this, Integer.toString(getIntent().getIntExtra("age1", 0)),
Toast.LENGTH_SHORT).show();
//--get the Bundle passed in--
Bundle b = getIntent().getExtras();
//--get the data using the get String()--
Toast.makeText(this, b.getString("str2"), Toast.LENGTH_SHORT).show();
//--get the data using the getInt()--
Toast.makeText(this, Integer.toString(b.getInt("age2")),
Toast.LENGTH_SHORT).show();
}
public void onClick2(View v)
{
//--use an Intent object to return data--
Intent i=new Intent();
//--use the putExtra() method to return some value..--
i.putExtra("age3", 45);
//--use the setData() method to return some value--
i.setData(Uri.parse("something passed back to main activity"));
//--set the result with the OK and the Intent object--
setResult(RESULT_OK,i);
//--destroy the current activity--
finish();
}
}
قسمت های زیر را نیز به فایل MainActivity.java اضافه کنید
package com.example.passingdata;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void onClick(View v){
Intent i=new Intent("learn.PassingData.SecondActivity");
//--use putExtra() to add new name/value pairs--
i.putExtra("str1", "this is a string");
i.putExtra("age1", 25);
//--use a Bundle object to add new name/value pairs--
Bundle b=new Bundle();
b.putString("str2", "this is another string");
b.putInt("age2", 35);
//--attach the Bundle object to the Intent object--
i.putExtras(b);
//--start activity to get a result back--
startActivityForResult(i,1);
}
public void onActivityResult(int requestCode,int resultCode, Intent data){
//--check if the request code id 1--
if(requestCode == 1){
//-- if the result is OK--
if(resultCode == RESULT_OK){
//--get the result using getIntExtra()--
Toast.makeText(this, Integer.toString(data.getIntExtra("age3", 0)),
Toast.LENGTH_SHORT).show();
//--get the result using getData()--
Toast.makeText(this, data.getData().toString(), Toast.LENGTH_SHORT).show();
}
}
}
}
حال باید در manifest پروژه نیز اکتیویتی ایجاد شده را معرفی کنیم پس درون فایل AndroidManifest.xml کدهای پررنگ شده زیر را اضافه میکنیم
<activity
android:name=".MainActivity"
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:label="Second Activity"
android:name=".SecondActivity">
<intent-filter>
<action android:name="learn.PassingData.SecondActivity" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
حال میتوان برنامه را اجرا و نتیجه را مطابق شکل زیر مشاهده کرد
این برنامه مهمترین روش تبادل اطلاعات بین اکتیویتی ها با اینتنت را نمایش میدهد.ابتدا میتوان از متد ()putExtra شی Intent برای افزودن مقادیر به صورت دیگشنری استفاده نمود
//--use putExtra() to add new name/value pairs--
i.putExtra("str1", "this is a string");
i.putExtra("age1", 25);
کد بالا دوجفت نام/مقدار را به شی Intent اضافه میکند که یکی از آنها string و دیگری integer است در واقع شکل کلی این متد بدین صورت است putExtra(string (name, value که برای value نوع ای مختلفی میتوان استفاده کرد.
علاوه بر استفاده از متد ()putExtra همچنین میتوان یک شی Bundle ایجاد کرده و سپس آن را با استفاده از متد ()putExtra پیوست داد. تصور کنید که شی Bundle یک شی دیگشنری است. این شی حاوی چندین جفت نام/مقدار است. قطعه کد زیر یک شی Bundle ایجاد کرده و دو جفت نام/مقدار به آن اضافه کرده و با استفاده از دستور اخر به شی Intent پیوست داده شده.
//--use a Bundle object to add new name/value pairs--
Bundle b=new Bundle();
b.putString("str2", "this is another string");
b.putInt("age2", 35);
//--attach the Bundle object to the Intent object--
i.putExtras(b);
در اکتیویتی دوم برای دریافت اطلاعات ارسال شده با استفاده از شی Intent ابتدا میبایستی شی Intent را با استفاده از متد ()getIntent دریافت کنیم سپس متد ()getIntExtra را جهت دربافت مقادیر Integer که توسط متد ()putExtra افزوده شده بودند فراخوانی کنیم (آرگومان دوم مقدار پیش فرض برای مواقعی است که به ازای نام مقداری وجود ندارد)
//--get the data passed in using getIntExtra--
Toast.makeText(this, Integer.toString(getIntent().getIntExtra("age1", 0)),
Toast.LENGTH_SHORT).show();
برای مقادیر رشته ای نیز از متد ()getStringExtra استفاده میکنیم.
برای دریافت شی Bundle از متد ()getExtra استفاده میکنیم
//--get the Bundle passed in--
Bundle b = getIntent().getExtras();
و برای استخراج نام/مقدار ها به صورت تکی از تابع مناسب آن استفاده میکنیم مثلا ()getString و ()getInt
راه دیگر برای ارسال دیتا به اکتویتی دیگر استفاده از متد ()setData است
//--use the setData() method to return some value--
i.setData(Uri.parse("something passed back to main activity"));
معمولا از متد ()setData مواقعی استفاده میکنیم که بخواهیم Intent عملیاتی را انجام دهد(برای مثال ارسال یک URL به مرورگر خود اندروید جهت نمایش صفحه وب که در ادامه آموزشات ببه این موضوع میپردازیم)برای دریافت دیتایی که با استفاده از متد ()setData فرستاده شده از متد ()getData استفاده میکنیم
//--get the result using getData()--
Toast.makeText(this, data.getData().toString(), Toast.LENGTH_SHORT).show();