Deodexed คืออะไร และทำอย่างไร ??

มาทำความเข้าใจกันก่อนครับว่า Deodexd คืออะไร

– ก่อนอื่นก็ต้องรู้ก่อนว่ามันย่อมาจากอะไร ???? !!!!
DEODEXED ย่อมาจาก DEcoder Optimized Dalvik Executable (บางตำราแปลได้ว่า Demodulation Optimized Dalvik Executable)

นี่คือคำเต็มๆ ของมันครับ !!! ไอ้หยา แล้วมันแปลว่าอะไรละเนี่ย เราจะมาพูดกันในตอนต่อไปครับ

– มารู้จักคำว่า DEX กันก่อนดีกว่า

DEX = Dalvik Executable File

*.DEX มันคือ นามสกุล นามสกุลหนึ่งครับ ที่ไม่ใช่นามสกุล พานทองหยิบ นะครับ เย้ยยย !!! สั้นๆ ก็คือมันเป็นนามสกุลที่เป็นนามสกุลแบบ Executable File หรือ เป็นไฟล์ที่สามารถ Run (ทำงาน) ได้ด้วยตัวมันเอง เปรียบเทียบได้กับ นามสกุล .EXE บน Windows ของเราๆ เนี่ยแหละครับพอจะเก็ตกันหรือยัง แต่มันเป็น Executable File ที่ทำงานบนระบบ JAVA Dalvik Virtual Machine (Davlik VM) นั่นเอง ซึ่งก็เป็นแกนหลักส่วนนึงของ Android หละครับ

– ODEX = Optimized Dalvik Executable File . . .

*.ODEX สั้นๆ (อีกนั่นแหละ) ก็คือ ไฟล์ *.DEX ที่ถูกปรับประสิทธิภาพให้ทำงานได้รวดเร็วยิ่งๆ ขึ้นไป หรือ พูดศัพท์ภาษาอังกฤษ ก็คือ Optimize แล้วนั่นเอง

– เพราะฉะนั้่น DEODEXED ก็คือการถอดรหัส (Decoder) ไฟล์ ODEX นั่นเอง

———————————————————————————–
Question : แล้วเราจะ Deodexed ไปเพื่ออะไรกันหว่า ???

Answer : ก็เพราะมันปรับแต่ง แก้ไขได้ง่ายกว่า หนะสิ

———————————————————————————–
Question : แล้วมันมีข้อเสียไหมสำหรับการทำ Deodexed ???

Answer : มีแน่นอนครับ คือมันเปิดช้ากว่า !!! ในครั้งแรก (เทียบกับตอน Boot เข้า Windows นั่นแหละครับ) แต่มันจะทำงานเร็วถ้าถูกเปิดไปแล้ว และ ทำงานได้รวดเร็ว พอๆ กันกับ .ODEX หรือก่อนทำ Deodexed นั่นเองครับ

———————————————————————————–
Question : แล้ว ROM + เครื่องรุ่นไหนบ้าง ที่เป็นแบบ Deodexed , ODEX หรือ DEX ธรรมดาๆ ???

Answer : ง่ายๆ เลยครับ ใช้ App อย่าง Root Explorer เข้าไปดูในส่วนของ \system\app ว่ามีไฟล์ เป็นแบบไหน
– ถ้าเป็น ROM แบบ ODEX จะมีไฟล์ .ODEX อยู่
– ถ้าเป็น ROM แบบ DEX จะมีไฟล์ .DEX อยู่
– ถ้าเป็น ROM แบบ DeODEXed จะมีแต่ไฟล์ .APK (Android Package) อยู่นั่นเอง

———————————————————————————–
Question : แล้วจะทำ Deodexed ยังไง ??

Answer : ก็ต้องใช้โปรแกรมจำพวก ถอดการ Compile (Decompile) จำพวก xUltimatex , baksmali + smali , Deodexer ครับ ซึ่งหากทำแบบ Manual แล้ว เราก็จะได้ไฟล์ class.dex ออกมา เราก็จับยัดลงไปในไฟล์ APK หรือจะแตกไฟล์ APK ออกมาแล้วจับรวมไฟล์นี้รวมไปแล้ว Signed APK ใหม่ด้วย APK Manager ก็ได้ครับ ซึ่งผมจะสอนในถัดๆ ไป

———————————————————————————–

มาทดลองการทำ Deodexed สำหรับโทรศัพท์ของท่านกันครับ !!!!
———————————————————————————–
สิ่งที่ต้องเตรียม
1. xUltimate 2.2.x
2. JAVA Runtime Environment & JAVA Development Kit (JRE & JDK)
3. Android SDK
4. baksmali (Option)
5. APK Manager (Option)
———————————————————————————–

 

 

Advertisements

Android: ทำ SplashScreen ง่ายนิดเดียว

บทความนี้เป็นตัวอย่างของการทำ Splash Screen หรือหน้า Intro ก่อนเข้า Application ใน Android นะ

ตัวอย่าง Source Code สามารถ Download ได้ที่นี้ SplashScreenDemo

1. สร้าง Android Project ใหม่

Create Project Part1

Create Project Part2

2. สร้าง Layout ของหน้า SplashScreen ใน Folder layout

<?xml version=”1.0″ encoding=”utf-8″?>
<LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android”
android:orientation=”vertical”
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”
android:background=”#FFF”>
<ImageView android:layout_gravity=”center”
android:src=”@drawable/android”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content” />
</LinearLayout>

3. สร้าง Activity Class สำหรับหน้า SplashScreen ใน Folder src

public class SplashScreenActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.splashscreen);
}

}

การทำ SplashScreen โดยใช้ Handler

3.1 การใช้ Handler สำหรับทำ Splash Screen นั้นสามารถทำได้โดยใช้ Method ของ Handler ที่ชื่อว่า postDelayed(Runnable, DelayedTime)

Runnable: คือ Process ที่จะกำหนดให้กับตัว Handler
ในตัวอย่างคือเรียกคำสั่ง finsish() เพื่อปิด Activity ปัจจุบัน
จากนั้นจึงเรียกคำสั่ง startActivty เพื่อเปิดหน้า Activity หลักของ Application ขึ้นมา

DelayedTime: คือเวลาที่เมื่อผ่านไปตามที่กำหนดแล้วจะเรียก Runnable ขึ้นมาทำงาน มีหน่วยของเวลาเป็น Millisecond (1000 Millisecond = 1 Second)
ในตัวอย่างกำหนดไว้ 2000 Millisecond หรือ 2 Second

private Handler mHandler;
mHandler = new Handler();// Call postDelayed Method for running process after delay time
mHandler.postDelayed(new Runnable() {@Override
public void run() {
finish();
startActivity(new Intent(SplashScreenActivity.this,
MainActivity.class));
}}, 2000);

การทำ SplashScreen โดยใช้ Thread

3.2 การใช้ Thread สำหรับทำ Splash Screen ทำได้โดยสร้าง Thread ขึ้นมาใหม่และใช้คำสั่ง start เพื่อสั่งให้ Thread ทำงาน และใน Thread ให้ทำการ Override Method run() จากนั้นจึงใช้คำสั่ง sleep(time) เข้ามาช่วยทำ SplashScreen

sleep เป็นคำสั่งให้หยุดทำงาน โดยเราสามารถกำหนดเวลาที่ต้องการสั่งให้ Thread หยุดทำงานได้ ซึ่งหน่วยของเวลาคือ Millisecond หลังจากสั่งให้หยุดทำงานเสร็จจึงเรียกใช้ Method finish() เพื่อสั่งปิด Activity ปัจจุบัน และตามด้วย Method startActivity เพื่อเปิดหน้า Activity หลักของ Application

new Thread() {

@Override
public void run() {
try {
sleep(2000);
finish();
startActivity(new Intent(SplashScreenActivity.this,
MainActivity.class));
} catch (Exception e) {
e.printStackTrace();
}
}

}.start();

4. แทรก Activty Tag ในไฟล์ AndroidManifest.xml

ทำการเปลี่ยน Activity แรกสุดที่จะถูกเรียกเป็น SplashScreenActivty และทำการแทรก Activity Tag ของ Class Activity หลักของ Application

<activity android:name=”.SplashScreenActivity”  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:name=”.MainActivity”>
</activity>

Output:

1. แสดงหน้า Activity ของ SplashScreen ที่สร้างขึ้น

Output 01

2. หลังจากผ่านไป 2 วินาที ก็จะปิดหน้า SplashScreen ปัจจุบันและเรียกหน้า Activity หลักของ Application ขึ้นมา

Output 02

credit : http://puyblog.piscessera.com/android-ทำ-splashscreen-ง่ายนิดเดียว

ทำไมจึงไม่ควรใช้ task killer กับมือถือ Android ของคุณ


เป็นปัญหาโลกแตกของคนใช้ Android แทบทุกคนว่าจะใช้ Task Killer ตัวไหนดี?
วันนี้มีทางออกมาให้ครับ คืออย่าไปใช้เลยซักตัวนั่นแหละ

รวมมาจากที่ tweet เอาไว้นะครับ

1.) ทำไมไม่ควรใช้ task killer กับมือถือ android (กรุณา RT)

2.) ทำความเข้าใจกันก่อนว่า android เป็น OS แบบ multitasking ที่มีพื้นฐานมาจาก Linux

3.) ถ้าสังเกตดีๆ เวลาเข้า setting > app management > running app มันจะแบ่งแถบข้างล่างเป็น 2 ส่วนคือ running service กับ cached process

4.) นี่คือการจัดการ Memory แบบ Linux ที่ต้องการลดการใช้งาน I/O เช่น อ่านไฟล์จาก HDD หรือ flash memory ให้น้อยที่สุด

5.) Andorid OS จะเลือกเอาไฟล์โปรแกรมที่เราใช้บ่อยๆมาไว้ในส่วน cached process เวลาเปิดโปรแกรมจะได้อ่านจาก memory ได้เลย

6.) ถ้าเปิดโปรแกรมที่ไม่อยู่ใน cached process ก็จะต้องโหลดไฟล์มาใส่ memory ก่อน จึงจะรันโปรแกรมได้

7.) เทียบทำงาน 2 ขั้นตอน (โหลด+รัน) กับ 1 ขั้นตอน (รัน) คุณว่าแบบไหนเร็วกว่ากัน? แบบไหนกินไฟน้อยกว่ากัน?

8.) ทีนี้ task killer แต่ละตัวมันไปทำอะไร? มันไปลบไฟล์โปรแกรมมที่ถูก cached ออกจาก Memory น่ะสิ เราถึงเห็นว่า free ram มันเพิ่มขึ้น

9.) การมี free ram เพิ่ม นอกจากไม่ได้ทำให้เร็วขึ้นแล้ว ยังกินไฟมากกว่าเดิมด้วย เพราะ OS จะพยายามหาอะไรมา cached กลับเข้าไปให้เต็มอยู่ดี

10.) และการโหลดไฟล์จาก flash เข้า memory ก็กินไฟ ยิ่ง kill task บ่อย มันก็ยิ่งโหลดบ่อย CPU ถูกปลุกจาก sleep state บ่อย กินไฟบรรลัยวายวอด

11.) แล้วเวลาเรียกโปรแกรมที่ใช้ memory เยอะๆอย่างเกมล่ะ? ก็รอให้ตัว OS มันโละพวก cached process ทิ้งไปชั่วคราวเอง พอออกจากเกมมันก็กลับมาอีก

12.) และการพยายามปิด app ใน recent apps (ICS) ก็ไม่ได้ช่วยให้ลื่นขึ้นอย่างไร

13.) สรุป: เลิกใช้ task killer เพราะ OS ทำงานได้ดีอยู่แล้ว และ free ram เยอะๆ แปลว่าคุณใช้ของที่ซื้อมาไม่คุ้มเลย free ram is wasted ram

14.) จบแล้ว…. ลองต่อสู้กับความเชื่อเดิมๆและลองทำตามนี้ดูซักครั้งนะครับ

อันนี้แนะนำเฉพาะเครื่องที่ RAM เพียงพอคือ 512 หรือมากกว่่าครับ เพราะ android บางรุ่นให้ RAM มาน้อยเกินไป บางทีจะขึ้นว่า Mem ไม่พอถ้าจะเปิดโปรแกรมใหม่ต้องปิดโปรแกรมเก่าก่อน ตรงนั้นบางทีต้องใช้ Task Killer แต่รวมๆ แล้ว หลักการข้างบนถูกต้อง

การใช้งาน android ทั่วไปไม่ต้องใช้ Task Killer ก็เล่นได้สบายๆ ครับ
=แล้วตอนไหนควรจะใช้ Task Killer=
1. ตอนที่โปรแกรมที่เราเปิดมันค้าง ไม่ทำงานต่อ
2. ตอนที่เราเห็นว่าไอ้โปรแกรมที่เราไม่ได้เปิดใช้งาน มันกิน CPU Process ไปหลาย % ซึ่งนั่นแสดงว่ามันกินแบต ส่วนไอ้พวก Process 0% ไม่ต้องไปสนใจมันครับ

 

credit : http://droidsans.com/why-task-killer-is-wrong-for-android#comments

Android Tutorial – Toast

การสร้าง Toast อย่างง่ายๆใน แอนดรอยด์(Android) กันบ้าง Toast คือคลาสที่ใช้แสดงข้อความขึ้นมาบนหน้าจอ ดังรูป

AndroidJump Toast 1

Toast คือคลาสใน Android ที่ใช้แสดงข้อความขึ้นมาบนหน้าจอ โดยจะแสดงเฉพาะข้อความ ไม่มีปุ่มอื่น เช่น OK หรือ Cancel เป็นต้น และจะแสดงในระยะเวลาสั้นๆ

ความรู้ที่ได้จากตัวอย่างนี้
1. การเขียนโปรแกรมเพื่อใช้งาน Toast
2. การแสดง Toast ขึ้นมาด้วย method “show()”

เริ่มกันเลยค้าบ….^_^
1. สร้างโปรเจ็ค Android Project โดยไปที่เมนู File > New > Project > Android Project หรือ File > New > Android Project ( กรณีมี เมนู Android Project ให้เลือก )

2. กำหนดค่าต่างๆ ดังรูป แล้วคลิกปุ่ม Finish โดยจะเห็นว่าเราติ๊กที่ CheckBox “Create Activity :” เพื่อสร้าง Activity Class ชื่อ MainActivity ให้เราอัตโนมัติ

AndroidJump Toast 2

3. ที่ AndroidManifest.xml ไม่ต้องแก้ไขอะไร เนื่องจากโปรแกรมนี้เรามี Activity Class เดียว

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.androidjump.app.simpletoast" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <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> </application> <uses-sdk android:minSdkVersion="7" /> </manifest> 

4. แก้ไขส่วนแสดงหน้าจอ User Interface หน้าจอหลักไปที่ layout > main.xml ดังนี้ (สามารถสร้างไฟล์ XML ใหม่ เพื่อใช้เป็นส่วนแสดงผลได้ แต่ในที่นี้ใช้ main.xml ที่สร้างให้เราอัตโนมัติ)

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center" android:text="Simple Toast" android:textSize="25sp" android:textStyle="bold" /> <LinearLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center"> <Button android:id="@+id/btnDisplayToast" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:text="Display Toast Message"/> </LinearLayout> </LinearLayout>

จากโค๊ดข้างต้น ส่วนของโค๊ด XML ไม่มีคำสั่งที่ควบคุม Toast เนื่องจากเราสามารถเรียกใช้งาน Toast จากโค๊ดจาวาได้เลย

5. แก้ไข Activity Class “MainActivity” ที่ src > com.androidjump.app.simpletoast > MainActivity ดังนี้ เพื่อให้แอพพลิเคชั่นทำงานได้อย่างถูกต้อง

package com.androidjump.app.simpletoast; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; // 1 import android.widget.Toast; public class MainActivity extends Activity { /** Called when the activity is first created. */ private Button btnDisplayToast; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); btnDisplayToast = (Button)findViewById(R.id.btnDisplayToast); btnDisplayToast.setOnClickListener( new OnClickListener() { public void onClick(View v) { // TODO Auto-generated method stub // 2 Toast.makeText(MainActivity.this, "Here is TOAST message", Toast.LENGTH_SHORT).show(); } } ); } } 

จากโค๊ดข้างต้น ส่วนของโค๊ด JAVA ที่ควบคุม Button คือข้อ 1-4 ดังนี้
1. import คลาส Toast เข้ามาเพื่อให้สามารถใช้งาน Toast ในคลาส MainActivity ได้
2. เมื่อเรากดปุ่ม “Display Toast Message” โปรแกรมจะแสดงข้อความขึ้นมาจาก Toast โดยการเรียกใช้งาน Toast นั้น มีรูปแบบการใช้งานดังนี้

Toast.makeText(context, text, duration).show()

เมธทอด “maketext” คือเมธทอดที่ใช้สร้างกล่องข้อความ Toast โดยสร้างจากองค์ประกอบ 3 ตัว คือ context, text, และ duration

context คือคลาสที่จะให้แสดง Toast ขึ้นมา ในที่นี้คือคลาส MainActivity เราจึงใช้เป็น MainActivity.this เพื่อบอกให้ Android รู้ว่าใช้คลาสตัวมันเอง หากเราใช้แค่ this อย่างเดียว จะทำให้ Android เข้าใจว่าเรากำลังอ้างอิงไปยัง Interface “OnClickListener” ซึ่ง Interface นี้จะใช้งาน Toast ไม่ได้
text คือข้อความที่เราต้องการให้แสดงใน Toast
duration คือระยะเวลาที่ Toast แสดงบนหน้าจอ แบ่งออกเป็น 2 ระยะเวลา
1. Toast.LENGTH_SHORT ใช้สำหรับแสดงข้อความเป็นระยะเวลาสั้นๆ เหมาะสำหรับข้อความสั้นๆ
2. Toast.LENGTH_LONG ใช้สำหรับแสดงข้อความเป็นระยะเวลานานขึ้น เหมาะสำหรับข้อความยาวๆ
แต่ทั้ง 2 ระยะ ก็แสดงไม่กี่วินาที

เมธทอด “show()” คือเมธทอดที่ใช้แสดงกล่องข้อความ Toast ขึ้นมา

ดังนั้นจากโค๊ดตัวอย่าง เราจึงเขียนคำสั่งใช้งาน Toast ได้ดังนี้

Toast.makeText(MainActivity.this, "Here is TOAST message", Toast.LENGTH_SHORT).show();

จากนั้นรันโปรแกรม คลิกขวาที่โปรเจ็ค SimpleToast เลือก Run As -> Android Application โปรแกรมจะทำงานดังที่กล่าวข้างต้น

 

credit : http://www.androidjump.com/droidjump-android-tutorial-13-toast/

Android Tutorial – View (Widget) on Android

View (Widget) ใช้สร้างองค์ประกอบของหน้าจอ Application ที่เร้าต้องการ ที่น่าสนใจดังจะกล่าวต่อไปนี้ ^_^ (แบบว่าสร้างผ่าน xml ก่อนนะครับ ส่วนการเขียนเป็นโค้ดไว้คราวต่อไปครับผม)

TextView

         ใช้สำหรับแสดงข้อความเพียงอย่างเดียวทางหน้าจอ โดยกำหนดผ่านแท็ก TextView และสามารถกำหนดคุณสมบัติต่างๆ ที่ใช้บ่อยๆ ดังนี้

<TextView android:id="@+id/TextView01" android:text="Hello Everybody ^_^" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textStyle="bold" android:textColor="#FF0000"/>

EditText

         ใช้สำหรับแสดงข้อความ และสามารถป้อน แก้ไขข้อความได้ทางหน้าจอ โดยกำหนดผ่านแท็ก EditText และสามารถกำหนดคุณสมบัติต่างๆ ที่ใช้บ่อยๆ ดังนี้

<EditText android:id="@+id/EditText01" android:text="Show Data and Edit Data..." android:layout_width="wrap_content" android:layout_height="wrap_content" android:textStyle="bold" android:textColor="#00FF00" android:singleLine="false"/> <EditText android:id="@+id/EditText02" android:text="0123456..." android:layout_width="wrap_content" android:layout_height="wrap_content" android:textStyle="bold" android:textColor="#00FF00" android:singleLine="true" android:numeric="integer"/> <EditText android:id="@+id/EditText03" android:text="(087)1112222" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textColor="#00FF00" android:phoneNumber="true"/> <EditText android:id="@+id/EditText04" android:text="password key" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textColor="#00FF00" android:password="true"/>

ImageView

         ใช้สำหรับแสดงรูปภาพใดๆ ได้ทางหน้าจอ โดยกำหนดผ่านแท็ก ImageView และสามารถกำหนดคุณสมบัติต่างๆ ที่ใช้บ่อยๆ ดังนี้

<ImageView android:id="@+id/ImageView01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/imgtest"/>

CheckBox

         ใช้สำหรับแสดง CheckBox ให้ผู้ใช้เลือก ซึ่งจะเลือกหรือไม่ก็ได้ทางหน้าจอ ถ้าเลือกก็เลือกได้มากกว่าหนึ่งตามหลักการ โดยกำหนดผ่านแท็ก CheckBox และสามารถกำหนดคุณสมบัติต่างๆ ที่ใช้บ่อยๆ ดังนี้

<CheckBox android:id="@+id/CheckBox01" android:text="Business Commputer" android:layout_width="wrap_content" android:layout_height="wrap_content" android:checked="true"/> <CheckBox android:id="@+id/CheckBox02" android:text="Computer Engineering" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <CheckBox android:id="@+id/CheckBox03" android:text="Computer Science" android:layout_width="wrap_content" android:layout_height="wrap_content" android:checked="true"/>

RadioButton และ RadoiGroup

         ใช้สำหรับแสดง RadioButton ซึ่งอยู่ภายใต้ RadioGroup ให้ผู้ใช้เลือก ซึ่งจะเลือกได้เพียงหนึ่งเท่านั้นภายใต้ RadioGroup (ซึ่งเป็น ViewGroup) หนึ่งๆ ทางหน้าจอ โดยกำหนดผ่านแท็ก RadioButton และ RadioGroup และสามารถกำหนดคุณสมบัติต่างๆ ที่ใช้บ่อยๆ ดังนี้

<RadioGroup android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical"> <RadioButton android:id="@+id/RadioButton01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Mr." android:checked="true" android:textStyle="bold" android:textColor="#FF0000"/> <RadioButton android:id="@+id/RadioButton01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Mrs." android:checked="false"/> <RadioButton android:id="@+id/RadioButton01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Miss" android:checked="false" android:textStyle="italic" android:textColor="#00FF00"/> </RadioGroup>

Button

         ใช้สำหรับแสดง ปุ่ม ทางหน้าจอ โดยกำหนดผ่านแท็ก Button และสามารถกำหนดคุณสมบัติต่างๆ ที่ใช้บ่อยๆ ดังนี้

<Button android:id="@android:id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Click"/> 

ImageButton

         ใช้สำหรับแสดง ปุ่มที่เป็นรูปภาพ ทางหน้าจอ โดยกำหนดผ่านแท็ก ImageButton และสามารถกำหนดคุณสมบัติต่างๆ ที่ใช้บ่อยๆ ดังนี้

<ImageButton android:id="@+id/ImageButton01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/media"/>

DatePicker

         ใช้สำหรับแสดง วัน/เดือน/ปี ซึ่งสามารถปรับเปลี่ยนได้ ทางหน้าจอ โดยกำหนดผ่านแท็ก DatePicker และสามารถกำหนดคุณสมบัติต่างๆ ที่ใช้บ่อยๆ ดังนี้

<DatePicker android:id="@+id/DatePicker01" android:layout_width="wrap_content" android:layout_height="wrap_content"/>

TimePicker

         ใช้สำหรับแสดง เวลา ซึ่งสามารถปรับเปลี่ยนได้ ทางหน้าจอ โดยกำหนดผ่านแท็ก TimePicker และสามารถกำหนดคุณสมบัติต่างๆ ที่ใช้บ่อยๆ ดังนี้

<TimePicker android:id="@+id/TimePicker01" android:layout_width="wrap_content" android:layout_height="wrap_content"/>

Toggle

         ใช้สำหรับกำหนด หรือตั้งค่าปุ่ม ซึ่งมี 2 สถานะ คือ checked และ unchecked และสามารถกำหนดคุณสมบัติต่างๆ ที่ใช้บ่อยๆ ดังนี้

<ToggleButton android:id="@+id/ToggleButton01" android:layout_height="wrap_content" android:checked="true" android:textOff="Pic Off" android:textOn="Pic On" android:layout_width="80dip"/>

List

         ใช้สำหรับแสดงรายการข้อมูลต่างๆ ให้ผู้ใช้เลือก โดยกำหนดผ่านแท็ก List และสามารถกำหนดคุณสมบัติต่างๆ ที่ใช้บ่อยๆ ดังนี้

<ListView android:id="@+id/ListView01" android:layout_width="fill_parent" android:layout_height="fill_parent"/>

Spinner

         ใช้สำหรับแสดงรายการข้อมูลต่างๆ ให้ผู้ใช้เลือกในลักษณะของลิสต์ เมื่อผู้ใช้กดลูกศรด้านข้าง โดยกำหนดผ่านแท็ก Spinner และสามารถกำหนดคุณสมบัติต่างๆ ที่ใช้บ่อยๆ ดังนี้

<Spinner android:id="@+id/Spinner01" android:layout_width="fill_parent" android:layout_height="wrap_content"/>

AutoCompleteTextView

         ใช้สำหรับแสดงรายการข้อมูลต่างๆ ให้ผู้ใช้เลือกในลักษณะของลิสต์ เมื่อผู้ใช้ป้อนข้อมูลเป็นตัวอักษรบางตัวลงไปใน EditText โดยกำหนดผ่านแท็ก AutoCompleteTextView และสามารถกำหนดคุณสมบัติต่างๆ ที่ใช้บ่อยๆ ดังนี้

<AutoCompleteTextView android:id="@+id/AutoCompleteTextView01" android:layout_width="fill_parent" android:layout_height="wrap_content" />

TabHost

         ใช้เพื่อเพิ่มแท็บที่สามารถเรียกใช้ View หรือ Activity ต่างๆ และทำให้การสร้างหน้าจอเป็นไปได้ง่ายขึ้น โดยกำหนดผ่านแท็ก TabHost และสามารถกำหนดคุณสมบัติต่างๆ ที่ใช้บ่อยๆ ดังนี้

<TabHost xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+:id/TabHost" android:layout_width="fill_parent" android:layout_height="fill_parent"> <LinearLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:padding="5dp"> <TabWidget android:id="@+:id/TabWidget01" android:layout_width="fill_parent" android:layout_height="wrap_content"/> <FrameLayout android:id="@+id/FrameLayout01" android:layout_width="fill_parent" android:layout_height="fill_parent" android:padding="5dp"/> </LinearLayout> </TabHost>

GridView

ใช้สำหรับแสดงรายการข้อมูลต่างๆ ใน มุมมองเป็น 2 มิติ โดยกำหนดผ่านแท็ก GridView และสามารถกำหนดคุณสมบัติต่างๆ ที่ใช้บ่อยๆ ดังนี้

<GridView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/GridView01" android:layout_width="fill_parent" android:layout_height="fill_parent" android:numColumns="auto_fit" android:verticalSpacing="10dp" android:horizontalSpacing="10dp" android:columnWidth="90dp" android:stretchMode="columnWidth" android:gravity="center"/>

Gallery

ใช้สำหรับแสดงรายการข้อมูลในแนวนอน (Horizontally) ซึ่งรายการที่เลือกจะอยู่ตรงกลาง โดยกำหนดผ่านแท็ก Gallery และสามารถกำหนดคุณสมบัติต่างๆ ที่ใช้บ่อยๆ ดังนี้

<Gallery android:id="@+id/Gallery01" android:layout_width="fill_parent" android:layout_height="wrap_content"/>

ImageSwitcher

ใช้สำหรับสลับปรับเปลี่ยนภาพ จากภาพหนึ่งไปยังอีกภาพหนึ่งอย่างราบรื่น โดยกำหนดผ่านแท็ก ImageSwitcher และสามารถกำหนดคุณสมบัติต่างๆ ที่ใช้บ่อยๆ ดังนี้

<ImageSwitcher android:id="@+id/ImageSwitcher01" android:layout_width="fill_parent" android:layout_height="fill_parent"/>

WebView

ใช้สำหรับแสดงเว็บไซต์ต่างๆ โดยกำหนดผ่านแท็ก WebView และสามารถกำหนดคุณสมบัติต่างๆ ที่ใช้บ่อยๆ ดังนี้

<WebView android:id="@+id/WebView01" android:layout_width="fill_parent" android:layout_height="fill_parent" />

VedioView

ใช้สำหรับแสดงภาพเคลื่อนไหว โดยกำหนดผ่านแท็ก VedioView และสามารถกำหนดคุณสมบัติต่างๆ ที่ใช้บ่อยๆ ดังนี้

 <VideoView android:id="@+id/VideoView01" android:layout_width="fill_parent" android:layout_height="fill_parent" />

 

credit : http://www.androidjump.com/droidjump-tutorial-8-view-widget/

Android Tutorial – Android Project Structure – Android Application Component – Activity Life Cycle

คราวนี้เรามาดูโครงสร้าง และองค์ประกอบต่างๆของเจ้า Android รวมถึงวงจรชีวิตของเจ้า Activity (ว่าแต่เจ้า Activity มันคืออะไรหว่า…..แหม….ดูเหมือนละครชีวิตยังไงไม่รู้ เอาง่ายๆ แล้วกันนะครับ ก็อาจจะเปรียบได้กับหน้าจอการทำงานหนึ่งๆ นั่นเอง) ว่าแล้วมาต่อกันเลยนะครับ

Android Project Structure

ในการสร้าง Android Project ทุกครั้งจะมีโครงสร้างพื้นฐานของตัวโปรเจ็กต์ ดังนี้

1. scr (Source code) เป็นส่วนของซอสโค้ดที่เราสร้างขึ้นและเขียนขึ้นเป็นไฟล์ .java ซี่งจะเห็นชื่อคลาส แอตทริบิวส์ และเมธอด
2. gen (Generated Java Files) เป็นส่วนที่ถูกสร้างขึ้นโดยอัตโนมัติ เช่น ไฟล์ R.java ซึ่งภายในประกอบด้วย text และ UI Element โดยถูกนำเข้ามาในโปรเจ็คต์ผ่าน Android Plugin ซึ่งไฟล์นี้จะเป็นเหมือน pointer ไปยัง drawable , layout, values directories
3. res (Resource) จะเป็นส่วนของการแสดงผล ของไฟล์อื่นๆ ที่นำมาเป็นส่วนประกอบ ร่วมกับโค้ดที่เราเขียนขึ้น โดยแอนดรอยด์จะมีการแบ่งโฟลเดอร์ ไว้ตามชนิดของ resource นั้น โดยตอนที่เราสร้างโปรเจ็คต์ขึ้นมาใหม่ จะ directory ย่อยๆ อีก 5 directory คือ
– drawable-hdpi/drawable-ldpi/drawable-mdpi สำหรับเก็บภาพ
– layout จัดวาง View ต่างๆ
– values จัดการค่าต่างๆ ที่นำไปใช้ในแอพพลิเคชัน ทั้งนี้ ก็ยังสามารถสร้าง directory ต่างๆ ขึ้นเองเพื่อเก็บข้อมูลอื่นๆ ที่จะใช้ในแอพพลิเคชันได้ด้วย
4. AndroidManifest.xml เป็นโครงสร้างของ xml ไฟล์ ซึ่ง ใน xml นั้นจะเป็นการกำหนดคุณสมบัติ และการตั้งค่าต่างๆต่างๆ ของ แอพพลิเคชั่น เช่น ชื่อของแอพพลิเคชั่น, เวอร์ชั่นของโค้ด, การกำหนดสิทธิ์ ต่างๆ ในการเข้าถึงของแอพพลิเคชั่น และอื่นๆ

Android Application Components

องค์ประกอบของแอนดรอยด์แอพพลิเคชันมีอยู่ 4 ประเภท ดังนี้

1. Activity (User Interface) คือ สิ่งที่ใช้ในการแสดงผล ออกมาเพื่อให้ผู้ใช้งานได้เห็น และได้ใช้งาน โดยในแต่ละ Application นั้น อาจจะมี activity เดียว หรือ หลายๆ activity ก็ได้ หรืออาจะไม่มี Activity เลยก็ได้ และสิ่งที่อยู่ใน activity นั้นจะเรียกว่า view ซึ่งก็มีอยู่ในหลายรูปแบบ เช่น buttons, text fields, scroll bars, menu items, check boxes และอื่นๆ
2. Service (Service Provider) คือ สิ่งที่ไม่มีส่วนของการแสดงผล แต่ถูกเรียกว่ารันอยู่ในลักษณะของ background process โดย service นั้นอาจจะมีการกระทำอะไรบางอย่าง เช่น ติดต่อรับส่งข้อมูลผ่านเครือข่าย หรือคำนวณค่าต่างๆ แล้วก็ทำการส่งผลลัพธ์นั้นไปแสดงยัง activity ก็ได้
3. Broadcast receiver (Data Provider) คือ ตัวที่ใช้สำหรับคอยรับ และตอบสนองต่อเหตุการณ์ต่างๆ ที่เกิดขึ้น เช่น เมื่อแบตเตอรี่ต่ำ, ผู้ใช้ทำการเปลี่ยนภาษา, มีการโทรออก, มีข้อความเข้า และอื่นๆ ถึงแม้ broadcast receiver จะไม่มีส่วนของการแสดงผล แต่มันก็สามารถที่จะเรียก activity ขึ้นมาแสดงผลให้ผู้ใช้ได้ หรืออาจจะใช้สิ่งที่เรียกว่า Notification Manager ซึ่งจะเป็นตัวที่แจ้งเตือนในรูปแบบของ การสั่น, การแสดงไฟกระพริบที่หน้าจอ หรือการส่งเสียงออกมา โดยจะมี icon แสดงอยู่บน status bar เพื่อให้ผู้ใช้กดเข้าไปเปิดดูเหตุการณ์ที่เกิดขึ้น
4. Content provider (System Event Listener) คือกลุ่มของข้อมูลที่สร้างขึ้นจากแอพพลิเคชั่น เพื่อให้แอพพลิเคชั่นอื่นๆ ได้นำไปใช้ โดยการจัดเก็บข้อมูลของ content provider นั้นจะอยู่ในลักษณะของ ไฟล์, ฐานข้อมูล SQLite และอื่นๆ โดยการจัดเก็บข้อมูลของ content provider นั้นจะอยู่ในลักษณะของ ไฟล์, ฐานข้อมูล SQLite และอื่นๆ ตัวอย่าง Application ที่ใช้งาน Content Provider ที่เห็นชัดเจนที่สุดคือโปรแกรม Contacts ที่แสดงรายชื่อใน Contacts ของเรานั่นเอง

Activity Life Cycle

Activity มีหน้าที่ในการสร้าง และควบคุมการทำงานของหน้าจอ เพื่อโต้ตอบกับผู้ใช้งาน ซึ่งจะมีได้แค่ Activity เดียวเท่านั้นที่โต้ตอบกับผู้ใช้งานในขณะใดขณะหนึ่ง Activity แต่ละตัวจะมีวงจรชีวิตเป็นของตนเอง โดยแบ่งเป็นสถานะดังนี้

– Running เป็นสถานะที่ Activity กำลังได้ทำงานในขณะนั้น
– Pause เป็นสถานะที่ Activity ปรากฏอยู่บนหน้าจอ แต่ไม่ได้ทำงานในขณะนั้น
– Stop เป็นสถานะที่ Activity ไม่ปรากฏบนหน้าจอ
– Kill เป็นสถานะที่ Activity ถูกทำลายไปแล้วเมื่อ Activity อยู่ในสถานะ Pause หรือ Stop Activity สามารถถูกทำลายได้โดยระบบ

onCreate(Bundle) – จะถูกเรียกเมื่อ Activity มีการสร้างตัวเองครั้งแรก เป็น method สำคัญในสร้างหน้าจอการทำงานต่างๆ หรือกำหนดสถานะต่างๆ ของ control ที่จะใช้งาน
onRestart() – จะถูกเรียกหลังจากที่ Activity กลับมาจากสถานะ Stop เพื่อเริ่มทำงานใหม่อีกครั้ง
onStart() – จะถูกเรียกเมื่อ Activity เริ่มแสดงให้ผู้ใช้งานเห็น
onResume() – จะถูกเรียกเมื่อ Activity สามารถที่จะโต้ต้อบกับผู้ใช้งานได้
onPause() – จะถูกเรียกเมื่อมี Activity อื่นกำลังทำงาน เป็น method สำคัญในการเก็บข้อมูลที่สำคัญ หรือทำการปล่อยหน่วยความจำเพื่อให้ Activity อื่นได้ใช้งาน
onStop() – จะถูกเรียกเมื่อ Activity ไม่ปรากฏบนหน้าจอ แล้วจะเข้าสู่สถานะ Stop
onDestroy() – จะถูกเรียกเมื่อ Activity กำลังจะถูกทำลาย

และยังมี method ทีสำคัญอีก 2 ตัว คือ
onSaveInstanceState(Bundle) – จะถูกเรียกก่อน onPause() เพื่อเก็บสถานะต่างๆ ของ Activity ไว้ใช้เมื่อ Activity นี่ได้กลับมาทำงานอีกครั้ง
onRestoreInstanceState(Bundle) – จะถูกเรียกก่อน onResume() เพื่อนำสถานะต่างๆ ของ Activity ที่เก็บไว้มาใช้งาน

ตัวอย่าง Project ทดสอบ Activity Life Cycle

โดยจะเป็นการทดสอบให้เห็นภาพการทำงาน Activity Life Cycle จากการทำงานของ Activity กับ Dialog และ Activity กับ Activity โดยจะแสดงเป็นข้อความ (Toast) บอก ถึงการเรียกใช้เมธอดต่างๆ ของคลาส Activity ว่าจะถูกเรียกให้ทำงานเมื่อใด แล้วต้องบอกว่านี่สำคัญมากๆเลย ลองพยายามสังเกตุการทำงานดูนะขอรับ…. ไม่ยาก ดูให้เข้าใจนะครับแล้วจะทำให้นำไปต่อยอดในการสร้างแอพฯได้แยะเลย…

1. สร้างโปรเจ็ค Android Project โดยไปที่เมนู File > New > Project > Android Project หรือ File > New > Android Project ( กรณีมี เมนู Android Project ให้เลือก )

2. กำหนดค่าต่างๆ แล้วคลิกปุ่ม Finish

3. ที่ layout > main.xml แก้ไข ดังนี้

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center_vertical"> <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Dialog Activity" android:id="@+id/btnDialog" /> <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Full Screen Activity" android:id="@+id/btnFull" /> </LinearLayout>

4. ที่ layout คลิกขวา New > Android XML File ช่อง File กำหนด second.xml และแก้ไข ดังนี้

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="wrap_content" android:layout_height="50dp" android:layout_gravity="center" android:text="This is a second activity" /> <LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent"> <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1" android:text="Close" android:onClick="finishActivity" /> </LinearLayout> </LinearLayout>

5. ที่ src คลิกขาว New > Class ช่อง Name กำหนด FullActivity และแก้ไข ดังนี้

public class FullActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.second); } public void finishActivity(View v) { finish(); } }

6. ที่ AndroidManifest.xml เพิ่มโค้ดต่อไปนี้

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.sau.csbc" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <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:name=".DialogActivity" android:theme="@style/Theme.TransparentTest" /> <activity android:name=".FullActivity" /> </application> <uses-sdk android:minSdkVersion="7" /> </manifest>

7. ที่ src > com.androidjump.app.tutor > MainActivity.java แก้ไข ดังนี้

public class MainActivity extends Activity { /** Called when the activity is first created. */ private Button btnFull; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); btnFull = (Button) findViewById(R.id.btnFull); btnFull.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(getApplicationContext(), FullActivity.class); startActivity(intent); } }); Toast.makeText(getApplicationContext(), "onCreate…", Toast.LENGTH_SHORT).show(); } @Override protected void onRestart() { // TODO Auto-generated method stub super.onRestart(); Toast.makeText(getApplicationContext(), "onRestart…", Toast.LENGTH_SHORT).show(); } @Override protected void onStart() { // TODO Auto-generated method stub super.onStart(); Toast.makeText(getApplicationContext(), "onStart…", Toast.LENGTH_SHORT).show(); } @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); Toast.makeText(getApplicationContext(), "onResume…", Toast.LENGTH_SHORT).show(); } @Override protected void onPause() { // TODO Auto-generated method stub super.onPause(); Toast.makeText(getApplicationContext(), "onPause…", Toast.LENGTH_SHORT).show(); } @Override protected void onStop() { // TODO Auto-generated method stub super.onStop(); Toast.makeText(getApplicationContext(), "onStop…", Toast.LENGTH_SHORT).show(); } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); Toast.makeText(getApplicationContext(), "onDestroy…", Toast.LENGTH_SHORT).show(); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onRestoreInstanceState(savedInstanceState); Toast.makeText(getApplicationContext(), "onRestoreInstanceState…", Toast.LENGTH_SHORT).show(); } @Override protected void onSaveInstanceState(Bundle outState) { // TODO Auto-generated method stub super.onSaveInstanceState(outState); Toast.makeText(getApplicationContext(), "onSaveInstanceState…", Toast.LENGTH_SHORT).show(); } }

8. ที่ AndroidLifeCycleProject คลิกขวา Run As > Android Application สังเกตุผลการทำงาน โดยจะเห็นการเรียกใช้งานเมธอดต่างๆ ว่าจะถูกทำงานเมื่อใด ซึ่งถือเป็น Life Cycle ของการทำงานของ Activity หนึ่งๆ ย้ำว่าสังเกตุการทำงานที่เกิดขึ้น และการเรียกใช้เมธอดต่างๆ ให้ดีนะครับผม

 

credit : http://www.androidjump.com/วงจรชีวิต-android-activity-life-cycle/

NFC บน Nexus S

เผอิญมีโอกาสได้ทำงานเกี่ยวกับ NFC บน Nexus S ก็เลยมาแบ่งปันประสบการณ์ว่าการที่ทีมแอนดรอยด์บอกว่า Android 2.3 Gingerbread สนับสนุน NFC นั้นมันเป็นอย่างไร

NFC คืออะไร

ก่อนอื่นก็คงขอพูดโดยคร่าวๆก่อนว่า NFC คืออะไร

NFC ย่อมาจาก Near Field Communication หรือการสื่อสารด้วยการจับให้อุปกรณ์มาอยู่ใกล้ๆกัน โดยระยะทำการจะอยู่แค่เพียง 5 ซม. เรียกว่าแทบจะจูบปากกันแล้วทีเดียว โดยอุปกรณ์ทั้งสองจะใช้การเหนี่ยวนำของขดลวดในการสื่อสารซึ่งกันและกัน หากนึกไม่ออกมันก็คือบัตรรถไฟฟ้าที่เราแค่แตะประตูก็เดินเข้าไปได้แล้วนั่น เอง

แต่เจ้าสิ่งที่เราเห็นบนรถไฟฟ้าอันนั้นจริงๆเรียกว่า Proximity หรือถ้าเรียกอีกชื่อหนึ่งที่คนอาจจะคุ้นเคยกว่าคือ RFID (ซึ่งจริงๆแล้วมันคือคนละคำกัน RFID เป็น Proximity แบบหนึ่ง) การทำงานจะต้องมีตัวที่เรียกว่าตัวอ่าน (Reader) และการ์ด (Tag)

ส่วน NFC นั้นก็คล้ายกับ RFID อีกนั่นแหละเพราะเบื้องหลังมันคือ Proximity ตัวหนึ่งและมันสนับสนุนเทคโนโลยี RFID ได้แบบเต็มรูปแบบ เราสามารถใช้ NFC ในการอ่านหรือเขียน RFID ได้ทันที แต่สิ่งที่ NFC เหนือกว่าคือ NFC สามารถปรับเปลี่ยนตัวเองให้เป็น Reader หรือ Tag ก็ได้! ยังผลให้เราสามารถนำมันไปใช้ในการสื่อสารระหว่างกันได้ โดยจะมีอยู่ 3 โหมดการใช้งานที่ใช้กันคือ

1) ทำตัวเป็น Reader
2) แปลงร่างเป็น Tag
3) คุยกันแบบ P2P

Android 2.3 พร้อมสนับสนุน NFC มันเป็นอย่างไรกัน!?!

ตอนแรกก็ไม่เข้าใจว่ามันสนับสนุนยังไงกัน ก็เลยมาลองเล่นเอง ปรากฎว่ามันทำงานเป็น Intent ตัวนึง …. แบบนี้!

เราสามารถสั่งเปิดปิด NFC ได้เหมือนที่ทำกับ WiFi และ Bluetooth

และทันทีที่เราเปิด ระบบจะสั่งยิงสัญญาณออกไปเพื่อรอรับสัญญาณกลับอย่างต่อเนื่อง แน่นอนว่ากินไฟแน่ๆ ถึงจะไม่ได้มากมายแต่ก็ทำให้แบตคุณหมดเร็วขึ้นอย่างเห็นได้ชัดชัวร์! ดังนั้นปิดได้ขอให้ปิดไว้

และเมื่อมี Tag มาเข้าใกล้ ระบบก็ยิง Intent ที่ชื่อว่า android.nfc.action.TAG_DISCOVEREDg ออกมา จากนั้นโปรแกรมทั้งหลายที่เรียกดัก Intent ไว้ก็จะเสนอหน้าออกมาให้เลือก

ซึ่งตรงนี้มันก็เหมือนกับว่าเราจะสั่งเปิดเว็บ ถ้าเราลงโปรแกรมไว้หลายตัว มันก็จะเด้งให้เลือกว่าจะเปิดเว็บด้วยโปรแกรมอะไร

เมื่อเราเลือกโปรแกรมเสร็จ ก็สามารถนำ ID และข้อมูลในการ์ดไปใช้งานต่อได้ทันทีในฟังก์ชั่น resolveIntent(…)

ตรงนี้จะเห็นความไม่สะดวกของการใช้งานเกิดขึ้นแล้ว เพราะสิ่งที่แอนดรอยด์วาง NFC ไว้คือการยิง Intent ออกมาให้โปรแกรมต่างๆรับไป แต่มันเป็นไปไม่ได้เลยที่ทุก Service ที่เกิดจาก NFC จะรวมอยู่ในโปรแกรมเดียวกัน ดังนั้นจึงไม่สามารถเลือกโปรแกรมใดโปรแกรมหนึ่งเป็น Default Application ได้ในการใช้งานจริง

ทำไม NFC ถึงน่าสนใจ

ข้อเด่นของ Open NFC คุณเพียงแค่แตะอุปกรณ์สื่อสารที่มีเทคโนโลยี NFC บน NFC tag
เพื่อทำกิจกรรมอย่างใดอย่างหนึ่ง เช่น การเช็คอิน ณ สถานที่แห่งใดแห่งหนึ่ง
การเก็บแต้มสะสมของร้านค้า หรือการเข้าเว็บไซต์โดยไม่ต้องพิมพ์ URL นอกจากนี้
ยังสามารถใช้ NFC tag เพื่อโปรโมตแอพพลิเคชั่นบนร้านค้าออนไลน์ได้อีกด้วย
อาทิ แทนที่จะเข้าไปยังร้านค้าออนไลน์เพื่อหาแอพพลิเคชั่น
คุณเพียงแค่แตะบน tag ก็สามารถดาวน์โหลดแอพได้ทันที

NFC tag ซึ่งมีราคาไม่กี่บาท จะมอบศักยภาพมหาศาลให้กับผู้โฆษณา ผู้ค้าปลีก และอื่นๆ
เพื่อให้เข้าถึง มอบสิทธิประโยชน์ และติดต่อสื่อสารกับลูกค้า
เราสามารถติดตั้ง NFC tag ที่ไหนก็ได้ ไม่ว่าจะเป็นร้านขายโทรศัพท์ ซูเปอร์มาร์เก็ต หรือร้านกาแฟ
ซึ่งสามารถวัดผลลัพธ์ได้และเห็นผลทันที

การเปิดศักยภาพ NFC tag ไม่ต้องอาศัยโครงสร้างพื้นฐานอะไรมากมาย
เพียงแค่มีการวางตลาดอย่างแพร่หลายของอุปกรณ์สื่อสารที่มีเทคโนโลยี NFC
และการตระหนักถึงคุณประโยชน์ของ NFC tag ในกลุ่มผู้โฆษณาเท่านั้น

NFC on Nokia C7

นอกจากการอ่าน tag แล้ว Open NFC ยังสามารถเชื่อมต่อโทรศัพท์ NFC 2 เครื่องได้ง่ายๆ
เพียงแค่นำเครื่องทั้งสองแตะกัน คุณก็สามารถแบ่งปันเนื้อหา เช่น รูปถ่าย หรือการเล่นเกมส์คู่
โดยไม่เสียเวลาเชื่อมต่ออย่างบลูทูธ ล่าสุดเกมส์สุดฮิตอย่าง Angry Birds
ได้ออก Angry Birds Free With Magic
เกมส์เวอร์ชั่นพิเศษสำหรับอุปกรณ์สื่อสารที่มีเทคโนโลยี NFC อย่าง Nokia C7 ซึ่งได้ซ่อนขั้นพิเศษของเกมส์เอาไว้
ซึ่งจะเข้าไปเล่นได้ต่อเมื่อนำโทรศัพท์ NFC ของคุณแตะกับ Nokia C7 หรืออ่าน NFC tag
ที่จะนำคุณสู่ร้านค้าออนไลน์ของโนเกียเพื่อดาวน์โหลดขั้นพิเศษของเกมส์

nokia bluetooh headset

Open NFC ยังสามารถเชื่อมต่อโทรศัพท์มือถือของคุณไปยังลำโพงไร้สาย
หรือหูฟังที่มีเทคโนโลยี NFC ได้อย่างง่ายดาย ถ้าคุณกลับถึงบ้านขณะฟังเพลงจากโทรศัพท์ด้วยหูฟังค้างอยู่
เพียงแค่แตะโทรศัพท์มือถือกับลำโพง NFC ที่บ้าน คุณก็เปลี่ยนไปฟังเพลงจากลำโพงได้อย่างต่อเนื่อง
เพียงเท่านี้ก็ทำให้จินตนาการถึงอุปกรณ์และแอพพลิเคชั่นใหม่ๆ ที่สามารถใช้เทคโนโลยีนี้ได้อีกมากมาย

สรุปคือการใช้งานจะต้อง (1) เปิด NFC (2) แตะบัตร (3) เลือกโปรแกรมที่จะเปิด … ซึ่งไม่สะดวกเอาเลยหละจริงๆแล้ว

ข้อดีและข้อเสียของ NFC

ข้อดี
– อ่านทะลุวัสดุหลายๆชนิดได้เช่นกระจก(บางๆ) หรือเนื้อคน
– การตรวจจับและเริ่มต้นเชื่อมต่อทำได้เร็วมาก
– ใช้ในที่มืดได้
– นำไปใช้แทนระบบ RFID ที่มีอยู่ในชีวิตประจำวันได้ … ตามหลักการแล้วเราสามารถเปลี่ยนมือถือของเราเป็นบัตรรถไฟฟ้าได้ทันที (แต่ไม่ใช่แบบข่าวใน DroidSans ที่เพิ่งเขียนไปนะ!)
– อายุการใช้งานยืนยาว อายุขัยค่อนข้างสูง

ข้อเสีย
– ใช้อ่านทะลุโลหะไม่ได้
– นำ Tag ไปวางไว้บนโลหะจะอ่านไม่ได้
– ความเร็วในการรับส่งข้อมูลยังไม่สูงมากนัก
– ต้นทุนสูงกว่า Barcode และ 2D Barcode (มากกกกก)
– ต้องพึ่งพา Hardware พิเศษ ต่างกับ 2D Barcode ที่ใช้กล้องมือถือธรรมดาๆได้เลย

การประยุกต์ใช้ NFC

– โรงแรมหัวใสพัฒนาระบบ Check-in โรงแรมตั้งแต่เราอยู่ที่สนามบิน เมื่อถึงโรงแรมเราสามารถนำมือถือไปเปิดประตูห้องได้ทันที!

– ซื้อหนังสือพิมพ์ได้ในเวลาไม่กี่วินาที โดยเฉพาะในช่วงเร่งรีบยามเช้า

– รับตารางเวลาต่างๆ เพียงแค่แตะโทรศัพท์มือถือกับ smart poster

– โดยสารรถประจำทาง รถไฟ หรือรถไฟฟ้า เพียงโหลดข้อมูลบัตรโดยสารเข้าไปในโทรศัพท์ และแตะโทรศัพท์ของคุณกับประตูทางเข้า NFC

– แลกเปลี่ยนข้อมูลการติดต่อ และข้อมูลอื่นๆ กับเพื่อนหรือเพื่อนร่วมงานโดยเพียงแค่นำโทรศัพท์มาแตะกัน

– ทำ RFID tag ของคุณเอง โดยใส่ข้อมูลการติดต่อ และเชื่อมต่อไปยังบริการมือถือ เช่น ข่าว พยากรณ์อากาศ ราคาหุ้น

– อุปกรณ์ยืนยันสถานะบุคคล

– บัตรโดยสารเครื่องบิน

– กุญแจอิเล็กทรอนิกส์สำหรับรถยนต์ โรงแรม หรือสำนักงาน

ความคิดเห็นส่วนตัวเกียวกับ NFC

ทั้งนี้ทั้งนั้น NFC ไม่ใช่เทคโนโลยีใหม่เลย หากแต่เป็นเทคโนโลยีที่โนเกียเคยทำมาแล้วเมื่อ 4-5 ปีที่แล้ว จนถึงตอนนี้มีเป็นสิบรุ่นที่มี NFC แต่… NFC ก็ไม่เกิด คงเพราะว่า Target ของ Nokia User ต่างออกไปและไม่คิดที่จะใช้อะไรพวกนี้ แต่พอ Nexus S ประกาศตัวมาว่าสนับสนุนปุ๊บ ก็เริ่มเห็นวี่แววของอนาคตลางๆแล้วหละ ^_^ และยิ่งได้ยินแว่วๆว่า iPhone 5 ก็จะสนับสนุน ดังนั้น … NFC … มาแน่ Laughing out loud

อย่างไรก็ตาม NFC ยังต้องพึ่งพา Hardware โดยเฉพาะในการใช้งาน จึงเกิดเป็นคำถามว่า ดังนั้นเทคโนโลยีนี้จะเกิดหรือไม่ก็ขึ้นอยู่กับผู้ผลิตโทรศัพท์มือถือเป็น ส่วนใหญ่ หากสุดท้าย Device ยังไม่สามารถเข้าถึงคนส่วนใหญ่ได้ เทคโนโลยีนี้ก็ยากนักที่จะเกิดในวงกว้าง

Resource ที่น่าสนใจสำหรับนักพัฒนา

1. ใน SDK ที่โหลดมา ค้นหาตัวอย่างที่ชื่อว่า NFCDemo ตัวนี้เหมาะกับการเริ่มต้นมาก

2. สำหรับการต่อยอด ดูมาหลายเว็บแล้วพบว่าเว็บนี้เวอร์คที่สุด ไปอ่านกันได้เลย http://programming-android.labs.oreilly.com/ch18.html

อย่างไรก็ตามมันจะมีเรื่ององค์ความรู้เกี่ยวกับ RFID หลายประการที่อาจจะต้องศึกษากันเพิ่มอีก อันนี้ก็ลองหาอ่านหาลองกันดูครับ ซับซ้อนนิดหน่อยแต่ก็ไม่ได้ยากเกินความสามารถแน่นอน ^_^

credit : http://droidsans.com/nfc-experience-on-nexus-s