سبد (0)

رفع مشکل تداخل اینتنت فیلتر

رفع مشکل تداخل اینتنت فیلتر

اگر زمانی که می خواهید یک اکتیویتی را به وسیله ی اکتیویتی دیگر فراخوانی کنید یک اکتیویتی دیگر دارای نام فیلتر یکسانی باشد چه اتفاقی خواهد افتاد؟فرض کنید که دو اکتیویتی را تعریف کردید(همان پروژه ای که در آموزش قبل کار کردید)و میخواهید اکتیویتی سوم را با مشخصات زیر در 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 می توان به جزئیات آن دسترسی داشت.

تمامی محصولات و خدمات این وبسایت، حسب مورد دارای مجوزهای لازم از مراجع مربوطه می‌باشند و فعالیت‌های این سایت تابع قوانین و مقررات جمهوری اسلامی ایران است.
logo-samandehi مجوز نشر دیجیتال از وزرات فرهنگ و ارشاد اسلامی پرداخت آنلاین -  بانک ملت معرفی بیاموز در شبکه سه