Thursday, August 1, 2013

Android Application Development

1.2. Google Play (Android Market)

Google ကေနျပီးေတာ့ Google Play service တစ္ခုကိုဖန္တီးေပးထားပါတယ္။ Programmer ေတြဟာ သူတုိ႕ရဲ႕ Android application ေတြကို Android user ေတြဆီေရာက္ေအာင္ Google Play ကေနတစ္ဆင့္ျဖန္႕ေ၀ႏုိင္ပါတယ္။ Google phone ေတြမွာပါတဲ့ Google Play application ကုိအသံုးျပဳျပီး application ေတြကို install လုပ္ႏုိင္ပါတယ္။
Google Play မွာ update လုပ္ႏုိင္တဲ့ service တစ္ခုလည္းပါပါတယ္။ ဥပမာ programmer တစ္ေယာက္ဟာ သူ Google Play မွာ upload လုပ္ထားတဲ့ application အတြက္ version အသစ္တစ္ခုကိုေရးျပီးေနာက္ Google Play ကို္တင္လုိက္တယ္ဆိုပါေတာ့။ အဲဒါဆုိရင္ Google Play ကေနျပီးေတာ့ (old version) application ကို install လုပ္ထားတဲ့ user ေတြဆီကုိ new version ကို install လုပ္ႏုိင္ေၾကာင္း သတိေပး ေပးပါတယ္။
Google Play ကို Android Market လို႕လည္းေခၚပါတယ္။

2. Security and permissions

2.1. Security concept in Android

Android application တုိင္းအတြက္ user and group ID တစ္ခုကို create လုပ္ေပးပါတယ္။ Application file တစ္ခုဟာ အဲဒီ application ကုိ generate လုပ္ထားတဲ့ user အတြက္ private ျဖစ္ပါတယ္။ ဒီဖုိင္ေတြကို အျခားေသာ application ေတြကအသံုးမျပဳႏုိင္ပါဘူး။
Data ကုိ share ခ်င္ရင္ service or content provider ကိုသံုးျပီး share ရပါတယ္။

2.2. Permission concept in Android

Android မွာ permission system တစ္ခုလည္းပါ၀င္ပါတယ္။ အခ်ိဳ႕ေသာ task ေတြအတြက္ permission ေတြကို ၾကိဳတင္ define လုပ္ျပီးျဖစ္ပါတယ္။ ဒါေပမယ့္ ေနာက္ထပ္ permission ေတြကိုလည္း ထပ္ျပီး define လုပ္ႏုိင္ပါေသးတယ္။
Android application တစ္ခုဟာ သူလိုအပ္တဲ့ permission ေတြကို  AndroidManifest.xml configuration file မွာ declare လုပ္ရပါတယ္။ ဥပမာ Application တစ္ခုက Internet ကုိ access လုပ္ဘို႕လိုအပ္တယ္ဆိုရင္ အဲဒီလိုအပ္တယ္ဆုိတဲ့ အေၾကာင္းကို AndroidManifest.xml configuration file မွာ declare လုပ္ရပါတယ္။
Permissions မွာလည္း level အမ်ိဳးမ်ိဳးရွိပါတယ္။ အခ်ိဳ႕ permission ေတြကုိ auto ခြင့္ျပဳထားျပီး အခ်ိဳ႕ permission ေတြကုိေတာ့ auto reject လုပ္ထားပါတယ္။
Application က request လုပ္ထားတဲ့ permission ေတြကို ခြင့္ျပဳ/မျပဳဆိုတာကို အဲဒီ application ကုိ install မလုပ္ခင္ user ကိုေမးပါတယ္။ User က ခြင့္ျပဳ/မျပဳဆံုးျဖတ္ေပးရပါတယ္။ (Application တစ္ခုကို install လုပ္တဲ့အခါ permission request လုပ္တာကိုျမင္ဘူးမယ္ထင္ပါတယ္)
User ကသာ application ကလိုအပ္တဲ့ permission ကို deny လုပ္လုိက္မယ္ဆိုရင္ အဲဒီ application ကို install လုပ္လို႕မရေတာ့ပါဘူး။ Permission check လုပ္တာကို application install လုပ္ေနစဥ္အခ်ိန္အတြင္းမွာသာလုပ္လို႕ရပါတယ္။ Install လုပ္ျပီးမွ deny လုပ္လို႕မရေတာ့ပါဘူး။
User အမ်ားစုက ဒီကိစၥကို သိပ္အာရံုမထားၾကေပမယ့္ အခ်ိဳ႕ user ေတြကေတာ့ ဒီကိစၥနဲ႕ပတ္သက္ျပီး Google Play မွာ negative review ေတြလာေရးၾကဆိုဘဲ။ J


3. Android applications and tasks

3.1. Application

Android application တစ္ခုမွာ component ေတြ resources ေတြမ်ိဳးစံုပါ၀င္ပါတယ္။ Component ေတြကေတာ့ activitiesservicesbroadcast receiver and content provider  ေတြပါ။

3.2. Tasks across application borders

Android application component ေတြဟာ အျခားေသာ Android application ေတြရဲ႕ component ေတြနဲ႕ connect လုပ္ႏုိင္ပါတယ္။ ဥပမာ Photo တစ္ခုကို touch လုပ္လိုက္ရင္ email application ပြင့္မယ္။ အဲဒီကေန new mail တစ္ခုကို create လုပ္ျပီး ခုနက ေရြးထားတဲ့ photo ကုိ အဲဒီေမးမွာ attach လုပ္ႏုိင္တာမ်ိဳးပါ။ ဒါဟာ application တစ္ခုရဲ႕ component နဲ႕အျခား application ရဲ႕ component ကုိခ်ိတ္ဆက္တာပါ။

4. Android user interface components

4.1. Activity
Activity ဆိုတာ android application တစ္ခုရဲ႕ visual representation ပါ။  ဆုိလုိတာက application တစ္ခုကို run လုိက္ရင္ screen ေပၚမွာ user interface တစ္ခုတက္လာပါမယ္။ အဲဒါဟာ activity ပါ။ Activity တစ္ခုျဖစ္လာဘုိ႕ views ေတြ fragments  ေတြကိုအသံုးျပဳရပါတယ္။ View ဆုိတာ Button, TextView, ImageView  အစရွိတာေတြကိုေျပာတာပါ။ ဒါေတြကိုအသံုးျပဳျပီး user interface တစ္ခုဖန္တီးရပါတယ္။ အဲဒီ user interface က application နဲ႕ user ကိုဆက္သြယ္ေပးတာပါ။ ဥပမာ Phone Dial application တစ္ခုမွာ user ကဖုန္းနံပါတ္ႏွိပ္ျပီး Call လုပ္လိုက္ရင္ application က အဲဒီနံပါတ္ကို call ေပးရပါတယ္။ user နဲ႕ application ၾကားမွာ အဲဒီ Dial Pad က user interface အျဖစ္ၾကားခံေဆာင္ရြက္ေပးရပါတယ္။ အဲဒီ user interface (dial pad) ကုိ Button, TextView, ImageView ဆုိတဲ႕ view ေတြနဲ႕ျပဳလုပ္ထားတာပါ။
Android application တစ္ခုမွာ activity အနည္းဆံုး တစ္ခုကေန လိုသလာက္အေရအတြက္အထိ အသံုးျပဳႏုိင္ပါတယ္။

4.2. Fragments

          Fragments are components which run in the context of an activity. A fragment encapsulates application code so that it is easier to reuse it and to support different sized devices.
          Fragments are optional components which allow you to reuse user interface and non user interface components for different devices configurations.

4.3. Views and layout manager

          Views ဆုိတာ အေရွ႕မွာေျပာခဲ့သလို user interface widget ေတြျဖစ္ပါတယ္။ ဥပမာ buttons or text fields အစရွိတာေတြကိုေျပာတာပါ။ views ေတြရဲ႕ base class ဟာ android.view.View ျဖစ္ပါတယ္။ View ရဲ႕ appearance နဲ႕ behavior ေတြကို configure လုပ္ဘို႕အတြက္ View attribute ေတြကိုသံုးရပါတယ္။ ဥပမာ button ဆုိတဲ့ view ကုိၾကည့္ရေအာင္။ အဲဒီ button မွာဘယ္ text ကုိေရးမလဲ။ ကိုယ္ေရးခ်င္တဲ့ text ကုိ button ရဲ႕ text attribute မွာေရးရပါတယ္။ text ကုိဘယ္အေရာင္ျဖစ္ေစခ်င္လဲ။ button ရဲ႕ textcolor attribute မွာေရးရပါတယ္။
Layout manager ကေတာ့ view ေတြကို arrange လုပ္ေပးရတာပါ။ Layout manager ရဲ႕ base class ကေတာ့ android.view.ViewGroup  ပါ။ View class ကေန extend လုပ္ထားတဲ့ class ပါ။  Layout တစ္ခုထဲမွာ အျခား layout တစ္ခုကိုထား၊ အဲဒီ layout ထဲ ေနာက္ထပ္ layout တစ္ခုထား၊ အဲဒီလုိ ဆင့္ကဲ ဆင့္ကဲထားလို႕လည္းရပါတယ္။ ဒါေပမယ့္ သိပ္မ်ားသြားရင္ performance  သိပ္မေကာင္းဘဲျဖစ္သြားတတ္ပါတယ္။ ဒါေၾကာင့္ သိပ္မ်ားမ်ားေတာ့မထားသင့္ ပါဘူး။

4.4. Device configuration specific layouts

Activity အတြက္ user interface ကို  XML files (layout files) မွာေရးရပါတယ္။ Device ေတြရဲ႕ size ကအမ်ိဳးမ်ိဳးရွိႏိုင္တာမုိ႕ user interface ေတြဖန္တီးတဲ့အခါ device အမ်ိဳးအမ်ိဳးအတြက္ အဆင္ေျပေအာင္ဖန္တီးေပးဘုိ႕လိုပါတယ္။
        ေအာက္မွာ activity တစ္ခုကိုျပထားပါတယ္။ MainActivity လို႕အမည္ေပးလိုက္ရေအာင္။ ဒီ activity ဟာ small screen မွာဆိုရင္ fragment တစ္ခုဘဲျပပါတယ္။ ဒီတစ္ခုကေန ေနာက္ fragment ကိုျပေအာင္ navigate လုပ္ႏုိ္င္ပါတယ္။ Wide screen မွာဆုိရင္ fragment ၂ခုလံုးကိုျပပါတယ္။

5. Other Android components

Android application မွာအသံုးျပဳႏုိင္တဲ့ component ေတြမ်ားစြာရွိပါေသးတယ္။ Android application မွာအသံုးျပဳႏုိင္တဲ့ component ေတြမ်ားစြာရွိပါေသးတယ္။ တစ္ခုခ်င္းစီကိုေအာက္မွာ အတိုခ်ဳပ္ေဖာ္ျပထားပါတယ္။

5.1. Intents

          Intents ဆိုတာ asynchronous message ေတြျဖစ္ပါတယ္။ အျခား android component ေတြျဖစ္တဲ့ service တုိ႕ activity တုိ႕ဆီကေန functionality ေတြကို request လုပ္ဘုိ႕အတြက္ intent ေတြကိုအသံုးျပဳရပါတယ္။          Application တစ္ခုဟာ component တစ္ခုကို တုိက္ရုိက္ေခၚႏုိင္သလို (explicit Intent)၊ intent data ေပၚမူတည္ျပီး register လုပ္ထားတဲ့ component ေတြထဲက ေရြးခ်ယ္ေပးဘုိ႕ Android system ကုိေတာင္းခံႏုိင္ပါတယ္ (implicit intents)။ ဥပမာ application တစ္ခုဟာ data sharing လုပ္ဘုိ႕အတြက္ intent ကုိသံုးရပါတယ္။ User က data sharing လုပ္ေပးႏုိင္တဲ့ component ေတြကို ေရြးခ်ယ္ႏုိင္ပါတယ္။

5.2. Services

          Service ေတြဟာ  user interface မလုိဘဲလုပ္ငန္းေတြကိုေဆာင္ရြက္ႏုိင္ပါတယ္။ Service ေတြဟာ အျခား android component ေတြနဲ႕ communicate လုပ္ႏုိင္သလို notification framework ကိုသံုးျပီး user ကို notify လည္းလုပ္ႏုိင္ပါတယ္။

5.3. ContentProvider

Application data ေတြအတြက္ structured interface တစ္ခုျဖစ္ပါတယ္။  Content provider ကုိသံုးျပီး အျခားေသာ application ေတြနဲ႕ data sharing လုပ္ႏုိင္ပါတယ္။ Content provider နဲ႕တြဲသံုးေလ့ရိွတာကေတာ့ SQLite database ပါ။ SQLite database ဟာ data ေတြကို store လုပ္ထားျပီး အဲဒီ data ေတြကို access လုပ္ခ်င္ရင္ content provider ကိုသံုးရပါတယ္။

5.4. BroadcastReceiver

          System messages ေတြနဲ႕ intent ေတြကိုလက္ခံရရွိဘုိ႕အတြက္ Broadcast receiver ေတြကို register လုပ္ထားႏုိင္ပါတယ္။ သတ္မွတ္ထားတဲ့ event တစ္ခုျဖစ္ပြားျပီဆိုရင္ broadcast receiver ဆီကို Android system ကေန notify လုပ္ေပးပါတယ္။
ဥပမာေျပာရရင္ boot process ျပီးသြားတဲ့အခါ notify လုပ္ေစခ်င္တာမ်ိဳး သို႕မဟုတ္ phone call ၀င္လာတာကို notify လုပ္ေစခ်င္တာမ်ိဳး အတြက္ register လုပ္ထားႏုိင္ပါတယ္။

5.5. Home screen and lock screen widgets

          Widget ဆိုတာ Android home screen ေပၚမွာထားျပီးအသံုးျပဳရတဲ့ interactive components ေတြပါ။ ဥပမာ email widget တစ္ခုဟာဆိုရင္ အသစ္ေရာက္လာတဲ့ ေမးေတြနဲ႕ပတ္သက္တဲ့ short summary ကိုေဖာ္ျပထားပါတယ္။ User က email တစ္ခုကို select လုပ္လုိက္ရင္ select လုပ္လုိက္တဲ့ mail ကိုဖြင့္ေပးမွာပါ။

5.6. Live Wallpapers

          Android home screen မွာ animated background ေတြ ဖန္တီးဘုိ႕အတြက္ Live wallpaper ေတြကိုအသံုးျပဳရပါတယ္။

6. Android Development Tools

6.1. Android SDK

Android Software Development Kit (SDK) မွာ Android application ေတြကို create လုပ္ဘို႕၊ compile လုပ္ဘုိ႕ နဲ႕ package လုပ္ဘုိ႕အတြက္လုိအပ္တဲ့ tools ေတြအားလံုးပါ၀င္ပါတယ္။ ဒီ tools အမ်ားစုဟာ command line tool ေတြျဖစ္ပါတယ္။
အထက္ပါ tool ေတြအျပင္ Android device emulator tool လည္းပါပါေသးတယ္။  emulator ကိုအသံုးျပဳျပီး Android application ေတြကို test လုပ္ႏုိင္ပါတယ္။ You can create Android virtual devices (AVD) ကို create လုပ္ျပီး real device အစားအသံုးျပဳႏုိင္ပါတယ္။
Android SDK မွာ Android debug bridge (adb) tool လည္းပါပါတယ္။ adb tool ကေတာ့ ခုနေျပာတဲ့ AVD or real Android device ေတြနဲ႕ application ကုိခ်ိတ္ဆက္ဘုိ႕ျဖစ္ပါတယ္။

6.2. Android Development Tools

Android application ေတြကို Eclipse IDE မွာ develop လုပ္ဘုိ႕ဆုိရင္ Android Development Tools (ADT) ကုိ install လုပ္ဘုိ႕လိုပါတယ္။ Eclipse သက္သက္ကေတာ့ Android application ေတြကို develop လုပ္ႏုိင္တဲ့ capability မရွိပါဘူး။ ADT (plug-ins) ကို install လုပ္လိုက္မွသာ  Eclipse မွာ Android application ေတြကို develop လုပ္ႏုိင္တဲ့ capability ရွိသြားမွာပါ။
ADT မွာဆုိရင္ Android applications ေတြကို create, compile, debug and deploy လုပ္ဘို႕အတြက္လိုအပ္တဲ့ functionalities အားလံုးပါ၀င္ပါတယ္။ ဒါ့အျပင္ AVD ေတြကို create လုပ္ဘုိ႕နဲ႕ start လုပ္ဘုိ႕ကိုလည္း ADT ကလုပ္ေဆာင္ေပးပါတယ္။
ADT ဟာဆိုရင္ resource file ေတြ (ဥပမာ layout file ေတြ) အတြက္ special editor ေတြလည္း provide လုပ္ပါတယ္။  ဒီ editor ကိုသံုးျပီး layout ဖုိင္ရဲ႕ XML representation နဲ႕ user interface ၾကား အျပန္အလွန္အလြယ္တကူ switch လုပ္ႏုိင္ပါတယ္။ XML representation မွာေရးျပီး user interface မွာသြားၾကည့္လိုက္၊ ဒါမွမဟုတ္ user interface မွာ view ေတြထည့္ျပီး XML representation မွာလာၾကည့္လိုက္ ဒီလုိလုပ္ႏုိင္ပါတယ္။ အဲဒီလို ဟိုဘက္ ဒီဘက္ကူးဘုိ႕အတြက္ editor ရဲ႕ေအာက္ဘက္က tab ကိုသံုးျပီး switch လုပ္ႏုိင္ပါတယ္။

6.3. Dalvik Virtual Machine

Android system ဟာ Java based application ေတြကို run ဘုိ႕အတြက္ Dalvik Virtual Machine ကိုအသံုးျပဳပါတယ္။ Dalvik က Java bytecode နဲ႕မတူတဲ႕ သူ႕ကိုယ္ပိုင္ bytecode format ကိုအသံုးျပဳပါတယ္။
ဒါေၾကာင့္        Java class file ေတြကို Android ေပၚမွာတုိက္ရိုက္ run  လို႕မရပါဘူး။ အရင္ဆံုး Dalvik bytecode format ကိုေျပာင္းျပီးမွ Android ေပၚ run ႏိုင္ပါမယ္။

6.4. How to develop Android Applications

Android application ေတြကို Java programming language နဲ႕ေရးပါတယ္။ ေရးထားတဲ့ Java source file ကို Java class file ျဖစ္ေအာင္ Java compiler အသံုးျပဳျပီး compile လုပ္ေပးရပါတယ္။
Android SDK မွာ dx ဆုိတဲ့ tool တစ္ခုပါပါတယ္။ အဲဒီ dx tool ဟာ Java class file ကို .dex (Dalvik Executable) file အျဖစ္ေျပာင္းေပးပါတယ္။ (Application တစ္ခုမွာ တစ္ခု သို႕မဟုတ္ တစ္ခုထက္ပိုတဲ့ class file ေတြပါ၀င္ပါတယ္) dx tool နဲ႕ conversion လုပ္ျပီးေနာက္မွာ အဲဒီ class file ေတြအားလံုးဟာ compress လုပ္ထားတဲ့ .dex file တစ္ခုထဲျဖစ္သြားပါတယ္။ (ဥပမာ ဖုိင္ ၅ ဖုိင္ပါတဲ့ ဖုိဒါတစ္ခုကို zip လုပ္လုိက္ရင္ တစ္ဖုိင္ထဲျဖစ္သြားသလိုမ်ိဳးေပါ့) dx tool နဲ႕ conversion လုပ္ေနစဥ္အတြင္းမွာ class ထဲကပိုေနတဲ့ information ေတြကိုဖယ္ရွားပစ္ပါတယ္။ ဥပမာ- class တစ္ခုမွာပါတဲ့ String ဟာ အျခား class မွာလည္းပါေနခဲ့တယ္ဆုိရင္ conversion လုပ္ျပီးတဲ့အခါ ဒီ String ဟာ .dex file မွာ တစ္ၾကိမ္သာပါေတာ့မွာျဖစ္ပါတယ္။
ဒါေၾကာင့္ dex file ေတြဟာ သက္ဆုိင္ရာ class file ေတြထက္ size အားျဖင့္ ေသးငယ္တယ္ဆိုတာေတြ႕ရပါတယ္။ (redundant information ေတြကိုဖယ္ရွားထားလုိ႕ပါ)
ဒီအဆင့္မွာရလာတဲ့ .dex file ရယ္ resource ေတြရယ္ကိုေပါင္းျပီး .apk (Android Package) file အျဖစ္ pack လုပ္လိုက္ပါတယ္။ resource ဆိုတာကေတာ့ ဒီ project အသံုးျပဳတဲ့ image ေတြ XML file ေတြကိုေျပာတာပါ။ ဒီလို apk ျဖစ္ေအာင္ pack လုပ္တာကိုေတာ့ aapt (Android Asset Packaging Tool) ကေဆာင္ရြက္ေပးပါတယ္။
.apk file မွာဆိုရင္ Application ကို run ဘို႕လိုအပ္တဲ့ data ေတြအားလံုးပါ၀င္ပါတယ္။ .apk file ကုိ Android device ေပၚ deploy လုပ္ဘုိ႕ကုိေတာ့ adb tool ကိုသံုးျပီးလုပ္ႏုိင္ပါတယ္။     ဒီအဆင့္ေတြအားလံုးကို Android Development Tools (ADT) ကေဆာင္ရြက္ေပးသြားမွာပါ။ Source code ေတြေရးျပီး run button ကုိႏွိပ္လိုက္တာနဲ႕ (error မရွိရင္) .apk file ကုိ create လုပ္ျပီး device ေပၚကိုပါ deploy လုပ္ေပးသြားမွာျဖစ္ပါတယ္။




Capture

6.5. Resource editors

Developer အေနနဲ႕ အခ်ိဳ႕ေသာ artifacts ျဖစ္တဲ့ Strings and layout files ေတြကို နည္းလမ္း ၂မ်ိဳးနဲ႕ေရးႏိုင္ပါတယ္။ Graphical Layout ကုိသံုးတာရယ္ XML နဲ႕ေရးတာရယ္ေပါ့။   ဥပမာ           res/layout/main.xml file ကိုဖြင့္ျပီးရင္ Graphical Layout နဲ႕ design လုပ္မလား ဒါမွမဟုတ္ xml code နဲ႕ေရးမလား ၾကိဳက္ရာသံုးႏုိင္ပါတယ္။ Screen ေအာက္ေျခမွာရွိတဲ့ button ကိုသံုးျပီးေရြးႏုိင္ပါတယ္။

7. Android Application Architecture

7.1. AndroidManifest.xml

Android application တစ္ခုရဲ႕ components နဲ႕ settings ေတြကို AndroidManifest.xml file မွာေရးရပါတယ္။ ဥပမာ application အတြက္ လုိအပ္တဲ့ activity ေတြ service ေတြကို AndroidManifest.xml file မွာ declare လုပ္ရပါတယ္။
ဒီဖုိင္ထဲမွာ application အတြက္လိုအပ္တဲ့ permission ေတြကိုလည္း declare လုပ္ေပးရပါတယ္။ ဥပမာ application တစ္ခုဟာ network access လိုအပ္တယ္ဆိုရင္ အဲဒါကုိ ဒီဖုိင္မွာ declare လုပ္ေပးရမွာပါ။ ေအာက္မွာ AndroidManifest.xml file ကုိနမူနာျပထားပါတယ္။
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="de.vogella.android.temperature"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon"
                       android:label="@string/app_name">
        <activity android:name=".Convert"
                    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="9" />
</manifest>
package attribute ကေတာ့ ဒီ application ရဲ႕ Java object ေတြကုိ ဘယ္ package ေအာက္မွာထားသလဲ။ အဲဒီ package name ကုိေရးေပးရပါမယ္။ တကယ္လုိ႕ Java object ေတြဟာ အျခား package ေတြအတြင္းမွာရွိေနတာဆုိရင္ေတာ့  fully qualified package name ကိုေပးရပါမယ္။
Android application ေတြကို unique package name ေတြေပးသင့္ပါတယ္။ ဥပမာ ကိုယ့္ရဲ႕ domain name ကုိ ေျပာင္းျပန္လုပ္ျပီး package name အျဖစ္ေပးတာမ်ိဳးလုပ္သင့္ပါတယ္။ ကိုယ့္ရဲ႕ domain name က computerandmobiletech.com ဆုိပါေတာ့။ ဒါဆိုရင္ com.computerandmoible.xxx လုိေပးသင့္ပါတယ္။ xxx ေနရာမွာ ကိုယ့္ application အတြက္သင့္ေတာ္တဲ့ name ကုိေပးေပါ့။ Application က calculator တစ္ခုကို create လုပ္ထားတာဆိုရင္ com.computerandmoible.calculator လုိ႕ေပးႏုိင္ပါတယ္။ ဒါဆုိရင္ အျခား developer တစ္ေယာက္ကလည္း calculator တစ္ခုကို create လုပ္ျပီး calculator လုိ႕အမည္ေပးခဲ့ရင္ေတာင္ package name တူေနတာမ်ိဳးမျဖစ္ႏုိင္ေတာ့ပါဘူး။ ဘာလို႕လဲဆုိေတာ့ သူက သူ႕ reverse domain name နဲ႕ calculator ကိုတြဲေပးမွာမုိ႕ပါ။ (ဥပမာ com.myanmarmobileappstore.calculator)
android:versionName and android:versionCode ေတြကေတာ့ application ရဲ႕ version ကိုသတ္မွတ္တာပါ။ versionName ကို ၾကိဳက္ရာ String တစ္ခုေပးႏုိင္ပါတယ္။ ဒီ version name ကုိ user ကျမင္ေတြ႕ရမွာျဖစ္ပါတယ္။ ဒါမွ ဒီ application ရဲ႕ version ကိုသူသိႏိုင္မွာေပါ့။
          versionCode ကေတာ့ integer ျဖစ္ရပါမယ္။ versionCode ကိုေတာ့ Android Market ကအသံုးျပဳပါတယ္။ သူက versionCode ကုိၾကည့္ျပီး application တစ္ခုအတြက္ update လုပ္ေပးရမလား ဘာလားဆိုတာကိုဆံုးျဖတ္တာပါ။ ဥပမာ user တစ္ေယာက္က calculator application version 1 ကုိ install လုပ္ထားတယ္ဆိုပါေတာ့။ Android Market မွာ calculator application version 2 ရွိေနျပီဆုိရင္ အရင္ version 1 ကေန 2 ကုိ update လုပ္ဘုိ႕ notify ေပးရပါတယ္။
Version code ကို သာမန္အားျဖင့္ 1 ကစေလ့ရွိျပီး new version ေရးျပီးရင္ေတာ့ 1 ခုစီတုိးေပးေလ့ရွိၾကပါတယ္။
<activity> tag ကေတာ့ activity ကုိ define လုပ္တာပါ။ အထက္က ဥပမာ မွာဆိုရင္ activity name ကို Convert လုိ႕ေပးထားပါတယ္။ Activity အတြက္ေရးထားတဲ့ java class ရဲ႕အမည္က Convert ျဖစ္လုိ႕ပါ။
(action android:name="android.intent.action.MAIN" ) ကေတာ့ Application ကို run တာနဲ႕ Main activity ကေနစတင္ဘုိ႕ intent filter ကို register လုပ္တာပါ။
(android:name="android.intent.category.LAUNCHER" ) ကေတာ့ application ကုိ Android device ရဲ႕ application directory ထဲထည့္ဘို႕ define လုပ္ေပးရတာပါ။
@string/app_name ဆိုတာက resources file ကိုညႊန္းတာပါ။ အဲဒီ resource file ထဲမွာ application name ေရးထားလို႕ပါ။ (application name ကုိဒီေနရာမွာတင္တုိက္ရိုက္မေပးဘဲ application name [ဥပမာ calculator ဆိုပါေတာ့] အဲဒါကိုေရးထားတဲ့ resource file ရွိတဲ့ေနရာကိုညႊန္ျပလိုက္တာပါ) အဲဒီ resource file ရဲ႕ app_name ဆိုတဲ့ထဲမွာ ‘calculator’ လုိ႕ေရးထားပါလိမ့္မယ္။
Resources file ေတြကိုအသံုးျပဳျခင္းအားျဖင့္ resource အမ်ိဳးအမ်ိဳးအတြက္ အဆင္ေျပလြယ္ကူစြာေဆာင္ရြက္ေပးႏုိ္င္ပါတယ္။ resource ေတြကေတာ့ strings, colors, icons အစရွိသည္တုိ႕ျဖစ္ပါတယ္။ Device အမ်ိဳးမ်ိဳးအတြက္ သင့္ေတာ္တဲ့ resource file ေတြကို define လုပ္ႏိုင္ပါတယ္။ ဥပမာ icon အတြက္စဥ္းစားၾကည့္ရေအာင္။ application ကုိ run မယ့္ device ေတြရဲ႕ ဆုိက္ကအမ်ိဳးမ်ိဳးရွိႏိုင္ပါတယ္။ device တုိင္းအတြက္အဆင္ေျပေအာင္ icon ကုိ resolution အမ်ိဳးမ်ိဳးနဲ႕ ထည့္ေပးထားႏုိင္ပါတယ္။ resolution အလုိက္ သက္ဆိုင္ရာ folder ေတြမွာထည့္ထားေပးရန္သာျဖစ္ပါတယ္။ application ကုိ run မယ့္ device ရဲ႕ size ေပၚမူတည္ျပီး သင့္ေတာ္တဲ့ icon ကုိ သံုးေပးသြားမွာျဖစ္ပါတယ္။
အခ်ိဳ႕ေသာ application ေတြကို install လုပ္တဲ့အခါ parsing error ဆိုတာကိုေတြ႕ဘူးၾကမယ္ထင္ပါတယ္။ အဲဒါကေတာ့ သာမန္အားျဖင့္ ကိုယ့္ device ရဲ႕ android version ဟာ application အတြက္လုိအပ္တဲ့ version ထက္နိမ့္ေနလုိ႕ပါ။ Application ကို install လုပ္မယ့္ Android version ဟာအနိမ့္ဆံုးဘယ္ေလာက္ရွိရမယ္လုိ႕သတ္မွတ္ေပးရပါတယ္။
<uses-sdk android:minSdkVersion=”9″ /> လုိ႕ သတ္မွတ္ထားရင္ application ကို API Level 9 ထက္နိမ္တဲ့ Android Version တင္ထားေသာ device ေတြမွာ install လုပ္လို႕မရႏုိင္ပါဘူး။ ဒီနည္းနဲ႕ application ကို unsupported device ေတြမွာ install လုပ္ျခင္းမွာတားျမစ္ႏုိင္မွာျဖစ္္ပါတယ္။

7.2. Activities and Lifecycle

Android system ဟာ application ရဲ႕ lifecycle ကုိ ထိန္းခ်ဳပ္ထားပါတယ္။ အခ်ိဳ႕ေသာ အေျခအေနေတြမွာ Android system က application ကို stop or destroy လုပ္ပစ္တတ္ပါတယ္။ ဥပမာ application တစ္ခုကို run ေနတဲ့ အခ်ိန္မွာ phone call ၀င္လာရင္ အဲဒီ application ကို stop လုပ္ပစ္တာမ်ိဳးေပါ့။ Android system ဟာ predefine method ေတြသံုးျပီး lifecycle ကိုသတ္မွတ္ပါတယ္။ အေရးၾကီးတဲ့ method ေတြကေတာ့
  •   onSaveInstanceState() - ဒီ method ကိုေတာ့ activity ကို stop လုပ္ျပီးရင္ေခၚရပါတယ္။ activity ကုိ restart ျပန္လုပ္တဲ့အခါ သူ႕ရဲ႕မူလ state ကိုျပန္ေရာက္ေအာင္ stop မလုပ္ခင္ကရွိခဲ့တဲ့ data ေတြကုိ save လုပ္ထားဘို႕လိုလို႕ပါ။
  •   onPause() – ဒီ method ကုိေတာ့ activity တစ္ခု အဆံုးသတ္သြားတုိင္း ေခၚရပါတယ္။ အဆံုးမသတ္ခင္အသံုးျပဳခဲ့တဲ့ resource ေတြ data ေတြကို release လုပ္ေပးဘုိ႕သံုးရတာပါ။
  •   onResume() - ဒီ method ကုိေတာ့ activity ကုိ restart ျပန္လုပ္ရင္ေခၚရပါတယ္။ Field ေတြကို initialize လုပ္ဘုိ႕သံုးတာပါ။

7.3. Configuration Change

Device ရဲ႕ configuration change သြားတုိင္းမွာ activity ကုိုလည္း restart ျပန္လုပ္ေပးရပါတယ္။ Application နဲ႕သက္ဆိုင္တဲ့ event တစ္ခုျဖစ္သြားတုိင္းမွာ configuration change သြားတတ္ပါတယ္။ ဥပမာ user က device ရဲ႕ orientation ကိုေျပာင္းလိုက္တယ္ဆိုပါေတာ့။ ဒါဆိုရင္ activity ဟာ အဲဒီလိုေျပာင္းလိုက္တဲ့အေနအထားအတြက္ အျခား resource တစ္ခုကိုေျပာင္းျပီးအသံုးျပဳဘုိ႕လိုအပ္တတ္ပါတယ္။ အဲဒီအတြက္ activity ကုိ restart လုပ္ေပးရတာပါ။
Emulator မွာ orientation ကုိ ေျပာင္းခ်င္ရင္ Ctrl+F11 ကုိႏွိပ္ျပီးေျပာင္းႏုိင္ပါတယ္။
အခ်ိဳ႕ေသာ configuration ေတြကို change လုိက္ေသာ္လည္း activity ကုိ restart မလုပ္ခ်င္ဘူးဆိုပါက AndroidManifest.xml ဖုိင္ထဲက configChanges attribute မွာ define လုပ္ထားႏိုင္ပါတယ္။ ေအာက္က ဥပမာကေတာ့ orientation တုိ႕ keyboard position အေျပာင္းအလည္းတုိ႕ လုပ္ေသာ္လည္း activity ကို restart မလုပ္ေအာင္ define လုပ္ထားတာပါ။
<activity android:name=".ProgressTestActivity"
     android:label="@string/app_name"
     android:configChanges="orientation|keyboardHidden|keyboard">
</activity>

7.4. Context

Android system နဲ႕ project ရဲ႕ resources ေတြကုိ ခ်ိတ္ဆက္ေပးဘုိ႕အတြက္ android.content.Context  class ကေဆာင္ရြက္ေပးပါတယ္။ Android services (e.g. the Location Service) ေတြကို access လုပ္ဘို႕အတြက္လည္း Context ကုိသံုးရပါတယ္။ Activities and services  ေတြဟာ Context class ကို extend လုပ္ထားတဲ့ class ေတြျဖစ္ပါတယ္။

8. Resources

8.1. Using resource files

Image တုိ႕ XML configuration file တုိ႕လို resource ေတြကို soruce code နဲ႕သီးသန္႕စီခြဲထားေပးပါတယ္။
ဒီ resources ေတြကို res directory ထဲမွာ define လုပ္ရပါမယ္။ ေအာက္မွာအေသးစိတ္ေဖာ္ျပထားပါတယ္။

Table 1. Resources
Resource Folder Description
Simple Values /res/values Strings, colors, dimensions, styles and static arrays of strings or integers ေတြကို /res/values ေအာက္က သက္ဆုိင္ရာဖုိင္ေတြမွာ define လုပ္ရပါတယ္။ဥပမာ Strings ေတြကို res/values/strings.xml file မွာ define လုပ္ရပါတယ္။
Layouts /res/layout Activities and Fragments ေတြအတြက္ user interface ေတြကို /res/layout ေအာက္မွာထားရပါတယ္။
Styles and Themes /res/values Application ရဲ႕ appearance ကို res/values မွာ define လုပ္ရပါတယ္။
Animations /res/animator Animation ကို res/animator မွာ define လုပ္ရပါမယ္။
Menus /res/menu Menu ရဲ႕ entry properties ေတြကို res/menu မွာ define လုပ္ရပါတယ္။

gen directory ထဲမွာေတာ့ project က generate လုပ္ေပးလိုက္တဲ့ generated values ေတြရွိပါတယ္။ R.java ဟာဆိုရင္ generated class တစ္ခုျဖစ္ပါတယ္။ R.java file ထဲမွာ resource ေတြရဲ႕ reference ေတြရွိပါတယ္။
Resource တစ္ခုကို create လုပ္လုိက္တာနဲ႕ အဲဒီ resource ရဲ႕ reference ကုိ auto create လုပ္ျပီး R.java ဖုိင္ထဲမွာ ထည့္ေပးလုိက္ပါတယ္။ အဲဒီ references ဆုိတာေတြဟာ static integer values ေတြျဖစ္ပါတယ္။ ျပီးေတာ့ resource အတြက္ ID ေတြကိုလည္း define လုပ္ေပးပါတယ္။ Resource ေတြကို အသံုးျပဳဘို႕အတြက္ ID ေတြနဲ႕ေခၚသံုးရတာပါ။ ဥပမာ String တစ္ခုရဲ႕ ID က R.string.yourString  ဆိုပါေတာ့။ အဲဒါဆိုရင္ အဲဒီ String ကုိအသံုးျပဳဘုိ႕အတြက္ getString(R.string.yourString)) လို႕ေရးရပါတယ္။ getString method ထဲမွာ ID ကုိ pass လုပ္ေပးရပါတယ္။ R.java ဖုိင္ကို auto generate လုပ္ေပးတာမုိ႕ programmer က ေရးစရာျပင္စရာမလုိအပ္ပါဘူး။

8.2. Defining IDs

User interface component ေတြရဲ႕ ID ကုိ layout file ေတြမွာလည္း define လုပ္လို႕ရပါတယ္။ လုပ္နည္းကေတာ့ @+id/your_id ဆုိျပီး your_id ေနရာမွာ ကို္ေပးခ်င္တဲ့ ID ကုိထည့္ေပးရမွာပါ။
ID ေတြကို control လုပ္ဘို႕အတြက္ ids.xml   file ကိုလည္း /res/values folder မွာ create လုပ္ႏုိင္ပါတယ္။ ျပီးရင္ ID အားလံုးကို ဒီဖိုင္မွာ define လုပ္ႏုိ္င္ပါတယ္။
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item name="button1" type="id"/>
</resources>
ဒီနည္းနဲ႕ ID ေတြကို layout file မွာတုိက္ရိုက္အသံုးျပဳႏုိင္ပါတယ္။
<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"
    tools:context=".MainActivity" >
    <Button
        android:id="@id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:layout_marginRight="27dp"
        android:text="Button" />
</RelativeLayout>

9. Using Resources

9.1. Reference to resources in code

Bitmap file တစ္ခု create လုပ္ပံုကိုေအာက္မွာျပထားပါတယ္။
BitmapFactory.decodeResource(getResources(), R.drawable.ic_action_search);

9.2. Reference to resources in XML files

Resource တစ္ခုကို @ သေကၤတသံုးျပီး refer လုပ္ႏုိင္ပါတယ္။ ဥပမာ XML resource file မွာ define လုပ္ထားတဲ့ color ကုိ refer လုပ္ခ်င္တယ္ဆိုပါေတာ့။ အဲဒါဆိုရင္ @color/your_id  လို႕ refer လုပ္ႏုိင္ပါတယ္။ your_id ေနရာမွာ ကိုယ္ refer လုပ္ခ်င္တဲ့ resource ရဲ႕ ID ကိုထည့္ရပါမယ္။ ေနာက္ ဥပမာ တစ္ခုၾကည့္ပါမယ္။ XML resource file မွာ define လုပ္ထားတဲ့ string “hello” ဆုိတာကို refer လုပ္ခ်င္တယ္ဆုိပါေတာ့။ ဒါဆိုရင္ေတာ့ @string/hello  လို႕ေရးရပါမယ္။

9.3. Activities and layouts

Activity တစ္ခုရဲ႕ user interface ကုိ layout file ေတြမွာ define လုပ္ရပါတယ္။ Layout file  မွာ Views (widgets) ေတြနဲ႕သူတုိ႕ရဲ႕ properties ေတြကို define လုပ္ေပးရမွာပါ။
Layout ကုိ define လုပ္ရာမွာ Java code နဲ႕လုပ္လို႕ရသလို XML file နဲ႕လည္းလုပ္လို႕ရပါတယ္။ အမ်ားစုကေတာ့ XML file ေတြကိုသံုးျပီးလုပ္ၾကပါတယ္။
XML layout file ေတြကို /res/layout folder ေအာက္မွာထားပါတယ္။ XML layout file မွာ  ViewGroupsViews နဲ႕ သူတုိ႕ရဲ႕ relationship ေတြ၊ attributes ေတြ define လုပ္ျပီး ဖန္တီးရပါတယ္။
View တစ္ခုကို Java code နဲ႕ access လုပ္ရန္လိုမည္ဆုိပါက အဲဒီ View ကုိ ID သတ္မွတ္ေပးရပါမယ္။ သတ္မွတ္ပံုကေတာ့ android:id attribute မွာ ကိုယ္ေပးခ်င္တဲ့ ID ကုိေပးရမွာပါ။ ေအာက္ပါ code မွာဆုိရင္ Button View တစ္ခုကို ဖန္တီးထားပါတယ္။ Button view ရဲ႕ ID ကုိ button1 လို႕ define လုပ္ထားပါတယ္။
<Button
  android:id="@+id/button1"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="Show Preferences" >
</Button>
Java code ထဲကေန ဒီ button ကို access လုပ္ခ်င္တယ္ဆိုရင္  findViewById(R.id. button1) ဆုိတဲ့ method ကုိသံုးရပါမယ္။
Layout ကုိ XML နဲ႕ define လုပ္ျခင္းအားျဖင့္ programming logic နဲ႕ layout definition ကိုသီးသန္႕စီခြဲထုတ္ျပီးသားျဖစ္ေနပါတယ္။ ဒါေၾကာင့္ device အမ်ိဳးမ်ိဳးအတြက္သူတုိ႕နဲ႕ သင့္ေတာ္တဲ့ layout ေတြဖန္တီးေပးဘုိ္႕ပိုျပီးအဆင္ေျပတာေတြ႕ရပါတယ္။

10. Assets

10.1. What are assets?

While the res directory ဟာ Android platform ကလက္ခံႏုိင္တဲ့ structured values ကိုသိမ္းဆည္းႏုိင္ပါတယ္။ assets directory ကေတာ့ မည္သည့္ data အမ်ိဳးအစားကိုမဆို store လုပ္ႏုိင္ပါတယ္။

10.2. Accessing assets

assets directory ထဲက data ေတြကိုဘယ္လို access လုပ္မလဲ။ Assetsmanager ကုိသံုးႏုိင္ပါတယ္။ Assetmanager manager = getAssets();
assets folder ထဲကဖိုင္ေတြကို InputStream အျဖစ္ဖတ္ႏုိ္င္ပါတယ္။ ေအာက္ပါ နမူနာကိုၾကည့္ပါ။ assets folder ထဲက logo.png ဆုိတဲ့ bitmap file တစ္ခုကိုဖတ္တာပါ။
အရင္ဆံုး getAssets() method ကုိသံုးျပီး ‘manager’ ဆုိတဲ့ Assetmanager တစ္ခုကို create လုပ္လိုက္ပါတယ္။
‘open’ ဆုိတဲ့ InputStram တစ္ခုကို create လုပ္ပါတယ္။
‘logo.png’ ဆုိတဲ့ ဖုိင္ကို open လုပ္ျပီး InputStream ‘open’ ထဲကို assign လုပ္ပါတယ္။

// Get the AssetManager
    AssetManager manager = getAssets();
    // Read a Bitmap from Assets
    InputStream open = null;
    try {
      open = manager.open("logo.png");
      Bitmap bitmap = BitmapFactory.decodeStream(open);
      // Assign the bitmap to an ImageView in this layout
      ImageView view = (ImageView) findViewById(R.id.imageView1);
      view.setImageBitmap(bitmap);
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      if (open != null) {
        try {
          open.close();
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
    }
 
Credit to: http://computerandmobiletech.com 

1 comment: