رفع مشکل تداخل اینتنت فیلتر
رفع مشکل تداخل اینتنت فیلتر
اگر زمانی که می خواهید یک اکتیویتی را به وسیله ی اکتیویتی دیگر فراخوانی کنید یک اکتیویتی دیگر دارای نام فیلتر یکسانی باشد چه اتفاقی خواهد افتاد؟فرض کنید که دو اکتیویتی را تعریف کردید(همان پروژه ای که در آموزش قبل کار کردید)و میخواهید اکتیویتی سوم را با مشخصات زیر در AndroidManifest.xml تعریف کنید:
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.PRG.intent"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="21" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<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="com.PRG.SecondActivity"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
<activity
android:label="Third Activity"
android:name=".ThirdActivity">
<intent-filter>
<action android:name="com.PRG.SecondActivity"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
</application>
</manifest>
اگر متد ()startActivity را با اینتنت زیر فراخوانی کنید,آنگاه سیستم عامل اندروید یک دیالوگ انتخاب اکتیویتی نمایش می دهد.
Title
StartActivity(new Intent("com.PRG.SecondActivity"));
بازگرداندن نتایج از یک اینتنت
وقتی متد ()startActivity یک اکتیویتی دیگر را فراخوانی می کند مقداری از آن را برای اکتیویتی باز نمی گرداند.به عنوان مثال::اگر یک اکتیویتی برای پرسیدن نام کاربری و کلمه ی عبور ایجاد کنید,اطلاعاتی که توسط کاربر وارد می شوند باید به اکتیویتی قبلی برای پردازش های لازم باز گردانده شوند.اگر می خواهید تا اطلاعاتی را از یک اکتیویتی برگردانید,باید متد ()startActivity را فراخوانی کنید.
1.در همان پروژه ی قبلی تغییرات زیر را در فایل secondactivity.xml اعمال کنید:
secondactivity.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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.PRG.intent.MainActivity" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Second Activity" />
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Enter your name" />
<EditText
android:id="@+id/txt_username"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<Button
android:id="@+id/btn_ok"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="OK"
android:onClick="onClick"
/>
</RelativeLayout>
2.تغییرات زیر را در فایل SecondActivity.java اعمال کنید:
SecondActivity.java
package com.PRG.intent;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
public class SecondActivity extends Activity {
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.secondactivity);
}
public void onClick(View view){
Intent data = new Intent();
EditText txt_username = (EditText) findViewById(R.id.txt_username);
data.setData(Uri.parse(txt_username.getText().toString()));
setResult(RESULT_OK, data);
finish();
}
}
3.تغییرات زیر را در فایل MainActivity.java اعمال کنید:
MainActivity.java
package com.PRG.intent;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends Activity {
private int request_Code=1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
public void onClick(View view){
//startActivity(new Intent("com.PRG.SecondActivity"));
//or
//startActivity(new Intent(this,SecondActivity.class));
startActivityForResult(new Intent(
"com.PRG.SecondActivity"),request_Code);
}
public void onActivityResult(int requestCode,int resultCode,Intent data){
if(requestCode == requestCode){
if(resultCode == RESULT_OK){
Toast.makeText(this, data.getData().toString(), Toast.LENGTH_SHORT).show();
}
}
}
}
4.برنامه را اجرا کنید.
روش کار به این صورت است که برای فراخوانی یک اکتیویتی و دریافت نتیجه از متد ()startActivityForResult استفاده می کنیم:
startActivity
startActivityForResult(new Intent(
"com.PRG.SecondActivity"),request_Code);
علاوه بر این برای ارسال یک شئ Intent, باید کد درخواست آن را هم همینطور نوشت.کد درخواست یک عدد integer ساده است که مشخص کننده ی اکتیویتی است که شما فراخوانی می کنید.این کار به این دلیل صورت می گیرد که نیاز است وقتی یک اکتیویتی مقداری را بر میگرداند,آن را شناسایی کنیم.برای برگرداندن یک مقدار توسط اکتیویتی به اکتیویتی فراخوان کننده,از شئ Intent برای ارسال اطلاعات از طریق متد ()setData استفاده می کنیم:
setData
Intent data = new Intent();
EditText txt_username = (EditText) findViewById(R.id.txt_username);
data.setData(Uri.parse(txt_username.getText().toString()));
setResult(RESULT_OK, data);
finish();
}
متد ()setResult یک کد نتیجه را تنظیم میکند(که یا RESULT_OK است یا RESULT_CANCEL)و دیتا به اکتیویتی فراخوانی کننده بازگردانده می شود.متد ()finish اکتیویتی را می بندد و کنترل را به دست اکتیویتی فراخوانی کننده می سپارد.در اکتیویتی فراخوانی کننده,می بایستی متد ()onActivityResult پیاده سازی شود که هنگام بازگشت یک اکتیویتی فراخوانی شود:
onActivityResult
public void onActivityResult(int requestCode,int resultCode,Intent data){
if(requestCode == requestCode){
if(resultCode == RESULT_OK){
Toast.makeText(this, data.getData().toString(), Toast.LENGTH_SHORT).show();
}
}
}
در اینجا باید صحت درخواست و نتیجه را چک کرده و مقدار بازگشتی را نمایش دهید.مقدار بازگشتی از طریق آرگومان data ارسال شده است که با استفاده از متد()getData می توان به جزئیات آن دسترسی داشت.
- نوشته شده توسط سعید نوشادی
- بازدید: 6062