در این آموزش نحوه فیلتر کردن اکتیویتی را برای اعمال انتنت ها را خواهیم دید.
فیلتر های شیئ Intent
شما در گام های قبل نحوه استفاده از شیئ Intent را برای فراخوانی یک activity دیگر را دیدید. سیستم عامل اندروید از فیلتر ها برای افزایش دقت در اشاره کردن به مجموعه از Activities و دریافت کنندهای پخش Broadcast receivers که میتوانند Intent ها را با کمک مجموعه مشخصی از action ، طبقه بندی و نمای داده مرتبط با یک Intent را کنترل کنند، میباشد. شما از المان یا تگ <intent-filter> در فایل manifest برای لیست کردن فعالیت ها ، طبقه بندی ها و انواع داده مرتبط، با هر اکتیویتی و سرویس و یا دریافت کننده پخش broadcast receiver استفاده خواهید کرد.
مثال زیر یک بخش از فایل AndroidManifest.xml است که به اکتیویتی خاص com.example.My Application.CustomActivity اشاره دارد و میتواند با دو اکشن و یک دسته بندی و یک داده نامبرده شده در تعامل باشد :
<activity android:name=".CustomActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:name="com.example.My Application.LAUNCH" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="http" />
</intent-filter>
</activity>
با تعریف این activity با فیلتری که در بالا ذکر شد. دیگر activities ها قابلیت فراخوانی این اکتیویتی را با استفاده از android.intent.action.VIEW و یا com.example.My Application.LAUNCH را دارند، دسته بندی action provided این دو android.intent.category.DEFAULT است.
المان یا تگ <data> نوع داده را مشخص خواهد کرد، که انتضار داریم توسط activity مثال بلا فراخوانی شود . activity سفارشی ما داده ای را برای شروع با http:// نیاز دارد.
در برخی وضعیت ها ممکن است که یک شیئ intent بتواند از فیلتر بیش از یک activity یا service بگذرد. کاربر ممکن است، در باره کامپوننتی که باید فعال کند سوال بپرسد ، اگر هدفی یافت نشود یک استثنا ایجاد خواهد شد.
تست های زیر قبل از فراخوانی یک اکتیویتی اجرا خواهد شد
یک فیلتر <intent-filter> ممکن است بیش از یک اکشن را لیست کرده باشد ، درست همانطور که در بالا به این موضوع اشاره کردیم . هنگامیکه یک فیلتر شیئ intent به چند اکتیوتی اشاده دارد نمی تواند تهی را بازگردانی کند. یعنی یک فیلتر باید حداقل یک تگ <action> داشته باشد، در غیر این صورت تمام intents های دیگر بلاک خواهند شد. اگر بیش از یک اکشن مورد اشاره باشند، اندروید سعی خواهد کرد که یکی از آنها را قبل از فراخوانی اکتویتی هماهنگ کند.
یک فیلتر <intent-filter> ممکن است صفر را لیست کند. این اتفاق برای یک یا تعداد بیشتری طبقه بندی ممکن است بیافتد . اگر طبقه بندی مورد اشاره وجود نداشته باشد، اندروید همواره این تست را انجام میدهد. اما اگر بیش از یک طبقه بندی مورد اشاره باشند ، برای یک intent که از تست طبقه بندی عبور می کند. هر طبقه بندی در شیئ Intent باید با طبقه بندی یک طبقه در فیلتر هماهنگ باشد.
هر تگ <data> میتواند یک URI و یک نوع داده (MIME media type) را مشخص کند. در اینجا صفت های مجزایی مانند scheme, host, port و path برای قسمت های یک URI وجود دارد. یک شیئ Intent که هم دارای URI و هم دارای نوع داده است ، فقط نوع داده را برای تست ارسال می کند. این تنها زمانی رخ میدهد که نوع داده با نوع آن در لیست فیلتر هماهنگ باشد.
مثال
مثال زیر تغییر یافته مثال بالا است . در اینجا ما شاهد حل تضاد در یک intent در اندروید هستیم. که دو اکتیویتی تعریف شده را فراخوانی میکند ، در ادامه نحوه فراخوانی یک اکتیویتی سفارشی با استفاده از یک فیلتر را خواهیم دید و در گام سوم یک کیس استثناء است .که در آن اگر اندروید اکتیویتی مناسبی را برای یک intent در یک فایل تعریف نکرده باشد رخ میدهد.
گام
|
توضیحات
|
1
|
شما از نرم افزار اندروید استودیو برای ایجاد یک نرم افزار اندرویدی استفاده کرده و نام آن را My Application در پیکیج com.example.tutorialspoint7.myapplication; گذارده اید.
|
2
|
فایل src/Main/Java/MainActivity.java را ویرایش کنید و سه listeners مرتبط برای سه دکمه ای که در فایل ظاهر درست خواهیم کرد ، ایجاد کنید .
|
3
|
یک فایل جدید src/Main/Java/CustomActivity.java اضافه کنید تا بتوانیم اکتیویتی سفارشی داشته باشیم. این اکتیویتی با intents های مختلفی فراخوانی خواهد شد.
|
4
|
فایل Xml ظاهر نرم افزار را ویرایش کنید res/layout/activity_main.xml همانطور که گفتیم سه دکمه در این فایل باید اضافه شود.
|
5
|
یک فایل ظاهر XML به res/layout/custom_view.xml اضافه کنید تا یک <TextView> ساده برای نمایش گذر داده ها از intent اضافه کنیم.
|
6
|
فایل AndroidManifest.xml را ویرایش کنید تا تگ <intent-filter> را برای افزودن قواعد برای intent خودتان برای هدف قرار دادن یک اکتیویتی سفارشی ایجاد کنید .
|
7
|
اجرای نرم افزار برای اتصال به شبیه ساز اندروید و تائید صحت عملکرد نرم افزار.
|
کد های زیر کد های تغییر یافته فایل اکتیویتی اصلی src/MainActivity.java می باشند.
package com.example.tutorialspoint7.myapplication;
import android.content.Intent;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
Button b1,b2,b3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
b1=(Button)findViewById(R.id.button);
b1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(android.content.Intent.ACTION_VIEW,
Uri.parse("http://www.example.com"));
startActivity(i);
}
});
b2 = (Button)findViewById(R.id.button2);
b2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent("com.example.
tutorialspoint7.myapplication.
LAUNCH",Uri.parse("http://www.example.com"));
startActivity(i);
}
});
b3 = (Button)findViewById(R.id.button3);
b3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent("com.example.
My Application.LAUNCH",
Uri.parse("https://www.example.com"));
startActivity(i);
}
});
}
}
کدهای زیر کد های تغییر یافته فایل src/com.example.My Application/CustomActivity.java می باشند.
package com.example.tutorialspoint7.myapplication;
import android.app.Activity;
import android.net.Uri;
import android.os.Bundle;
import android.widget.TextView;
/**
* Created by TutorialsPoint7 on 8/23/2016.
*/
public class CustomActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.custom_view);
TextView label = (TextView) findViewById(R.id.show_data);
Uri url = getIntent().getData();
label.setText(url.toString());
}
}
کد های زیر محتوای فایل res/layout/activity_main.xml میباشند.
<?xml version="1.0" encoding="utf-8"?>
<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.example.tutorialspoint7.myapplication.MainActivity">
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Intent Example"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:textSize="30dp" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Tutorials point"
android:textColor="#ff87ff09"
android:textSize="30dp"
android:layout_below="@+id/textView1"
android:layout_centerHorizontal="true" />
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageButton"
android:src="@drawable/abc"
android:layout_below="@+id/textView2"
android:layout_centerHorizontal="true" />
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/editText"
android:layout_below="@+id/imageButton"
android:layout_alignRight="@+id/imageButton"
android:layout_alignEnd="@+id/imageButton" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Start Browser"
android:id="@+id/button"
android:layout_alignTop="@+id/editText"
android:layout_alignLeft="@+id/imageButton"
android:layout_alignStart="@+id/imageButton"
android:layout_alignEnd="@+id/imageButton" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Start browsing with launch action"
android:id="@+id/button2"
android:layout_below="@+id/button"
android:layout_alignLeft="@+id/button"
android:layout_alignStart="@+id/button"
android:layout_alignEnd="@+id/button" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Exceptional condition"
android:id="@+id/button3"
android:layout_below="@+id/button2"
android:layout_alignLeft="@+id/button2"
android:layout_alignStart="@+id/button2"
android:layout_toStartOf="@+id/editText"
android:layout_alignParentEnd="true" />
</RelativeLayout>
کد های زیر مربوط به فایل res/layout/custom_view.xml می باشند.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView android:id="@+id/show_data"
android:layout_width="fill_parent"
android:layout_height="400dp"/>
</LinearLayout>
کد های زیر مربوط به فایل res/values/strings.xml هستند که دو ثابت جدید را تعریف می کنند.
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">My Application</string>
</resources>
کد های زیر محتوای پیشفرض فایل AndroidManifest.xml هستند.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.tutorialspoint7.myapplication">
<application
android:allowBackup = "true"
android:icon = "@mipmap/ic_launcher"
android:label = "@string/app_name"
android:supportsRtl = "true"
android:theme = "@style/AppTheme">
<activity android:name = ".MainActivity">
<intent-filter>
<action android:name = "android.intent.action.MAIN" />
<category android:name = "android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="com.example.tutorialspoint7.myapplication.CustomActivity">
<intent-filter>
<action android:name = "android.intent.action.VIEW" />
<action android:name = "com.example.tutorialspoint7.myapplication.LAUNCH" />
<category android:name = "android.intent.category.DEFAULT" />
<data android:scheme = "http" />
</intent-filter>
</activity>
</application>
</manifest>
در آخر هم نرم افزار خود را اجرا کنید. همانطور که در کد ها دیدید نرم افزار ما My Application نام دارد. ما فرض را بر این گذاشته ایم که شما نرم افزار شبیه ساز خود را نصب کرده اید، برای اجرای نرم افزار یکی از فایل های اکتیویتی پروژه را باز کرده و روی دکمه Run در نوار ابزار کلیک کنید. اندروید استودیو نرم افزار را بر روی شبیه ساز نصب می کند و اگر همه چیز خوب پیش رفت پنجره زیر به نمایش در میاید.
حالا کار را با دکمه Start Browser with VIEW Action شروع میکنیم. ما اکتیویتی سفارشی خود را با فیلتر android.intent.action.VIEW تعریف می کنیم. در این قسمت یک اکتیویتی پیشفرض در برابر VIEW action که با اندروید تعریف شده و به مرورگر متصل خواهد گردید وجود دارد. بنابراین اندروید به شما دو گزینه برای انتخاب نوع اکتیویتی که میخواهید به آن متصل شوید را نشان میدهد.
حالا هنگامی که مرورگر خود را انتخاب کنیم ، اندروید به مرورگر متصل میشود و سایت example.com را باز خواهد کرد. اما اگر ما گزینه IndentDemo را انتخاب کنیم اندروید به اکتیویتی سفارشی متصل میشود و چیزی بجز داده ای که در یک متن به نمایش گذارده شده است نمایش نخواهد یافت:
حالا با دکمه back به عقب بازگشته و دکمه Start Browser with LAUNCH Action را بزنید . اندروید اینبار فیلتر را اجرا کرده اکتیوتی را برای نمایش انتخاب می کند. و به سادگی به اکتیویتی سفارشی متصل می شود.
یکباردیگر به عقب بازگردید و روی دکمه Exception Condition کلیک کنید. در اینجا اندروید تلاش خواهد کرد که فیلتر معتبری به intent بدهد ولی نمی تواند یک اکتیویتی معتبر برای معرفی ارائه کند. زیرا ما در اینجا از https بجای http استفاده کردیم . در این زمان اندروید یک استثناء را شروع کرده و صفحه زیر را به نمایش می گذارد.
شرکت برنامه نویسی سارگون اماده تولید نرم افزار اندرویدی برای کلیه صاحبان مشاغل بصورت تخصصی میباشد.