مشخصات مقاله
-
3574
-
0.0
-
4876
-
0
-
0
آموزش Intent در اندروید-بکارگیری intent ها
دوره آموزش برنامه نویسی اندروید
کلیه حقوق مادی و معنوی این مقاله متعلق به آموزشگاه تحلیل داده می باشد و هر گونه استفاده غیر قانونی از آن پیگرد قانونی دارد.
آموزش Intent در اندروید )قسمت سوم (
ارزیابی اطلاعات بازگشتی
با بکارگیری متد startActivityForResult () در MainActivity، sub-activity مورد نظر را راه اندازی کنید. این کار به شما اجازه می دهد با استفاده از متد onActivityResult () داده ها را از sub-activity دریافت کنید. داده های extra را با bundle دریافتی (received bundle) استخراج / extract کنید.
برای این که از دریافت صحیح داده های extra اطمینان لازم را حاصل کنید از یک Toast (toast message) کمک بگیرید. کدی که زیر مشاهده می کنید شما را در این زمینه راهنمایی می کند.
package com.vogella.android.intent.explicit;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
public class MainActivity extends Activity {
// constant to determine which sub-activity returns
private static final int REQUEST_CODE = 10;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void onClick(View view) {
EditText text = (EditText) findViewById(R.id.inputforintent);
String string = text.getText().toString();
Intent i = new Intent(this، ResultActivity.class);
i.putExtra("yourkey"، string);
// TODO 2.. now use
// startActivityForResult(i، REQUEST_CODE);
}
// TODO 3 Implement this method
// assumes that "returnkey" is used as key to return the result
@Override
protected void onActivityResult(int requestCode، int resultCode، Intent data) {
if (resultCode == RESULT_OK && requestCode == REQUEST_CODE) {
if (data.hasExtra("returnkey")) {
String result = data.getExtras().getString("returnkey");
if (result != null && result.length() > 0) {
Toast.makeText(this، result، Toast.LENGTH_SHORT).show();
}
}
}
}
}
9. راه حل : بکارگیریintent ها
نحوه ی پیاده سازی مطالب این فصل
پس از تکمیل تمرینی که در بخش "هدف این تمرین" به آن پرداختیم، کد activity شما باید چیزی مشابه کلاس های زیر درآید. می توانید با کمک این بخش آموزشی راه حل (solution) خود را با راه حل پیشنهادی مقایسه کنید.
کد activity
package com.vogella.android.intent.explicit;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.EditText;
import android.widget.TextView;
public class ResultActivity extends Activity {
@Override
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView(R.layout.activity_result);
Bundle extras = getIntent().getExtras();
String inputString = extras.getString("yourkey");
TextView view = (TextView) findViewById(R.id.displayintentextra);
view.setText(inputString);
}
@Override
public void finish() {
Intent intent = new Intent();
EditText editText= (EditText) findViewById(R.id.returnValue);
String string = editText.getText().toString();
intent.putExtra("returnkey"، string);
setResult(RESULT_OK، intent);
super.finish();
}
}
package com.vogella.android.intent.explicit;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends Activity {
// constant to determine which sub-activity returns
private static final int REQUEST_CODE = 10;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void onClick(View view) {
EditText text = (EditText) findViewById(R.id.inputforintent);
String string = text.getText().toString();
Intent i = new Intent(this، ResultActivity.class);
i.putExtra("yourkey"، string);
startActivityForResult(i، REQUEST_CODE);
}
@Override
protected void onActivityResult(int requestCode، int resultCode، Intent data) {
if (resultCode == RESULT_OK && requestCode == REQUEST_CODE) {
if (data.hasExtra("returnkey")) {
String result = data.getExtras().getString("returnkey");
if (result != null && result.length() > 0) {
Toast.makeText(this، result، Toast.LENGTH_SHORT).show();
}
}
}
}
}
10. تمرین : ثبت و تخصیص یک activity به عنوان مرورگر
هدف از این تمرین
در تمرینی که پیش رو دارید، باید یک activity را به عنوان مرورگر ثبت کنید، به عبارتی دیگر، هنگامی که شخصی جهت مشاهده ی URL (که با http آغاز می شود) اقدام کند یک intent فعال و راه اندازی می شود. حال activity ای که شما تخصیص داده اید آماده ی پردازش intent مزبور خواهد بود.
این نمونه activity منبع HTML صفحه ی مورد نظر را دانلود کرده، سپس آن را در یک TextView به نمایش می گذارد.
ساختن پروژه
پروژه ی اندرویدی با نام de.vogella.android.intent.browserfilter ایجاد کرده و activity آن را BrowserAcitivity نام گذاری کنید.
ثبت یک activity به عنوان مرورگر
Activity خود را در Intent. Action_VIEW و scheme "http" با اعمال تغییرات زیر در فایل AndroidManifest.xml ثبت کنید. توجه داشته باشید که مانیفست شما باید مجوز دسترسی به اینترنت را داده باشد.
حال فایل layout مربوطه را طبق کد زیر تغییر دهید.
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:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/textView" />
linearlayout>
اکنون کلاس activity خود را به کد زیر تغییر دهید.
package de.vogella.android.intent.browserfilter;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.StrictMode;
import android.widget.TextView;
public class BrowserActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// To keep this example simple، we allow network access
// in the user interface thread
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
.permitAll().build();
StrictMode.setThreadPolicy(policy);
setContentView(R.layout.main);
Intent intent = getIntent();
TextView text = (TextView) findViewById(R.id.textView);
// To get the action of the intent use
String action = intent.getAction();
if (!action.equals(Intent.ACTION_VIEW)) {
throw new RuntimeException("Should not happen");
}
// To get the data use
Uri data = intent.getData();
URL url;
try {
url = new URL(data.getScheme()، data.getHost()، data.getPath());
BufferedReader rd = new BufferedReader(new InputStreamReader(url.openStream()));
String line = "";
while ((line = rd.readLine()) != null) {
text.append(line);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
اعتبارسنجی و تست
ابتدا برنامه را نصب می کنید. اگر intent ای ویژه ی بازکردن URL فعال کنید، در این صورت کاربر باید بتواند مرورگر سفارشی (پیاده سازی شده به صورت اختصاصی توسط شما) را انتخاب کند. برای این منظور intent زیر را با یکی از برنامه های کاربردی اندروید خود فعال و راه اندازی کنید. این کار را با افزودن (به طور مثال) یک دکمه به اپلیکیشن مورد نظر انجام می دهید که در صورت استفاده از آن، کد فعال شود.
intent = new Intent(Intent.ACTION_VIEW،Uri.parse("http://www.vogella.com"));
startActivity(intent);
در صورت انتخاب مولفه مورد نظر، کد HTML بارگذاری شده و در TextView به نمایش گذاشته می شود.
تمرین بیشتر : تبدیل آن به یک مرورگر واقعی
جهت ایجاد یک مرورگر واقعی، TextView را با WebView جایگزین می کنید. WebView فرایند بارگذاری درخواست HTTP را برای شما انجام می دهد. تنها کافی است URL را با استفاده از متد LoadUrl به آن اختصاص دهید.
11. تمرین : انتخاب تصویر به وسیله ی intent
هدف تمرین
مثال زیر نحوه ی انتخاب تصویر از برنامه های کاربردی ریجیستر شده ی عکس محور (registered photo app) در اندروید )به وسیله ی intent) را نمایش می دهد.
ایجاد پروژه
پروژه ای به نام de.vogella.android.imagepick ایجاد کنید، سپس یک activity به نام ImagePickActivity برای آن در نظر بگیرید.
فایل طرح بندی activity_main.xml را به ترتیب زیر اصلاح کنید.
xml version="1.0" encoding="utf-8" ?>
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<button android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onclick="pickImage"
android:text="Button">
Button>
<imageview android:id="@+id/result"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@drawable/icon">
ImageView>
linearlayout>
کلاس activity خود را طبق کد زیر اصلاح کنید.
package de.vogella.android.imagepick;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
public class ImagePickActivity extends Activity {
private static final int REQUEST_CODE = 1;
private Bitmap bitmap;
private ImageView imageView;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
imageView = (ImageView) findViewById(R.id.result);
}
public void pickImage(View View) {
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
startActivityForResult(intent، REQUEST_CODE);
}
@Override
protected void onActivityResult(int requestCode، int resultCode، Intent data) {
InputStream stream = null;
if (requestCode == REQUEST_CODE && resultCode == Activity.RESULT_OK)
try {
// recyle unused bitmaps
if (bitmap != null) {
bitmap.recycle();
}
stream = getContentResolver().openInputStream(data.getData());
bitmap = BitmapFactory.decodeStream(stream);
imageView.setImageBitmap(bitmap);
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if (stream != null)
try {
stream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
