Sunday, May 6

Knowledge of Android



Activities ဆိုုတာဘာလဲ?
Activity ဆိုု Android Application တခုုရဲ ့component တခုုလိုု ့ေျပာလိုု ့ရပါတယ္။ အလြယ္ဆုုံးေျပာရရင္ အသုုံးျပဳသူ (user) ဟာ Application တခုုကိုုသုုံးေနတဲ့အခ်ိန္မွာ Screen ေပၚမွာေပၚေနတာ ျမင္ေနရတာကိုု Activity တခုုလိုု ့ေျပာလိုု ့ရပါတယ္။ ဥပမာ က်ေနာ္ကသူငယ္ခ်င္းတစ္ေယာက္ရဲ ့ ဆက္သြယ္ရန္လိပ္စာ (Contact Address) တခုုကိုုေရးမွတ္ေနတယ္ဆိုုပါစိုု ့။ အဲဒီအခ်ိန္မွာ ျမင္ေနရတဲ့ screen ဟာ Activity တခုုပါ။ Application တခုုမွာ Activities ေတြအမ်ားၾကီးရွိနုုိင္ပါတယ္။ ျပီးေတာ့ က်ေနာ္တိုု ့ကလဲ Activities ေတြကိုု တခုုကေန တခုုကိုု အျပန္အလွန္ ကူးေျပာင္းအသုုံးျပဳေနပါတယ္။ user နဲ ့လုုံး၀ interaction ရွိတဲ့သေဘာပါ။

ဒါကိုု လြယ္ကူတဲ့ ဥပမာ တခုုေပးရမယ္ဆိုုရင္ က်ေနာ္တိုု ့Website ၾကည့္ရႈ အသုုံးျပဳခ်င္းနဲ ့ ဥပမာျပနုုိင္ပါတယ္။ က်ေနာ္တုုိ ့website တခုုကိုု ၾကည့္ရႈ အသုုံးျပဳတဲ့အခါမွာ ၄င္းမွာ webpage ေတြအမ်ားၾကီးရွိတာ သတိထားမိမွာပါ။ ဒီ Webpage ေတြကိုု က်ေနာ္တိုု ့က activities ေတြအျဖင့္ ျမင္ၾကည့္ရေအာင္လား။ ျပီးေတာ့ က်ေနာ္တိုု ့Webpage တခုုကေန တခုုကိုု ဟိုုသြားလိုုက္ ဒီသြားလိုုက္နဲ ့လွည့္ပတ္ၾကည့္ရႈၾကပါတယ္။ Website တခုုမွာ Home Page ရွိသလိုုပဲ က်ေနာ္တိုု ့ရဲ ့Android app တခုုမွာလဲ main activity ဆိုုတာရွိပါတယ္။ Main Activity ဟာ က်ေနာ္တိုု ့application ကိုု စတင္ launch လုုပ္လိုုက္တဲ့အခါ ေပၚလာတဲ့ screen ေပၚျမင္ရတဲ့ activity ပါပဲ။ Website ေတြမွာ Webpage အခ်င္းခ်င္း Links ျဖင့္ ခ်ိတ္ဆက္ညႊန္းတာသတိထားမိမွာပါ။ ဒီလိုုပါပဲ Android app ေတြမွာလဲ activity တခုုကေန တခုုကိုု ခ်ိတ္ဆက္ အလုုပ္လုုပ္ေနပါတယ္။ ဥပမာ က်ေနာ္က ဓါတ္ပုုံရုုိက္တဲ့ application ကိုုသုုံးေနတယ္ ရိုုက္ျပီးေတာ့ save လုုပ္တယ္။ ေနာက္ Edit လုုပ္ခ်င္ရေသးတယ္ အဲလိုု တခုုကေနတခုုကိုု ကူးေျပာင္းခ်ိတ္ဆက္ေနတာကိုုဆိုု လိုုခ်င္တာပါ။ ေနာက္ျပီး Website တခုုကေနျပီး အျခား website တခုုကိုု Link ခ်ိတ္ဆက္ျပီး ညႊန္းတာကိုုလဲ သတိျပဳမိမယ္ထင္ပါတယ္။ ဒီလိုုပါပဲ Android app တခုုကေန တခုုကိုု ေျပာင္းလဲခ်ိတ္ဆက္ကာ ေခၚယူအသုုံးျပဳနုုိင္ပါတယ္။ က်ေနာ္ တိုု ့Facebook application တခုုကိုုသုုံးေနတယ္ဆိုု ပါစိုု ့။ က်ေနာ္တိုု ့ဓါတ္ပုုံတင္ခ်င္တယ္ဆိုု camera application ကိုုခ်ိတ္ဆက္ျပီး ခုုဏရိုုက္ထားတဲ့ပုုံကိုု တင္မလား ဒါမွမဟုုတ္ အသစ္ရိုုက္မလားဆိုုျပီး application တခုုကေနတခုုကိုု ေျပာင္းလဲ ခ်ိတ္ဆက္ကာ ေခၚယူအသုုံးျပဳပါတယ္။

ေနာက္ ဥပမာ တခုုေပးရလ်ွင္ camera application မွာ ဓါတ္ပုုံကိုု email ပိုု ့ရန္အတြက္ mail app တခုုကိုုေခၚသုုံးသည္။ ထိုု mail app မွ mail ပိုု ့မည့္ လိပ္စာအတြက္ contact book app မွ contact list ကိုုရယူအသုုံးျပဳသည္။ ဒီလိုု အသစ္အသစ္ ေသာ activity ေတြဟာ user ရဲ ့interact ေပၚမူတည္ျပီးေျပာင္းလဲေနပါတယ္။ Activity တခုုအသစ္ေပၚလာတုုိင္း အရင္အသံုုးျပဳခဲ့တဲ့ Activity ဟာ pause state ျဖစ္သြားပါတယ္။ ဘာေၾကာင့္လဲဆိုုေတာ့ mobile မွာ screen ေသးေလး တခုုသာ ပိုုင္ဆိုုင္တာေၾကာင့္ တခုုနဲ ့တခုုကိုု အစားထိုုးျပသေနရတာ ေၾကာင့္ပဲျဖစ္ပါတယ္။


Activity Life Cycle
-------------------------

က်ေနာ္တိုု ့Android Application တခုုကိုု ပထမဆုုံး စဖြင့္လိုု္က္ျပီဆိုုပါစိုု ့။ ဒါActiviy တခုုကိုု mobile device မွာ launch လုုပ္လိုုက္ျခင္းျဖစ္ပါတယ္။ ဒီလိုုလုုပ္လုုိက္တဲ့အခါမွာ Mobile OS ေပၚမွာ Linux Process တခုုကိုုဖန္တီးရယူျခင္း၊ User Interface Object မ်ားအတြက္ Memory ကိုု ဖဲ့ယူသုုံးစြဲရျခင္း Screen တခုုလုုံးကိုု Set up လုုပ္ရျခင္း စသည္ျဖင့္ activity ျဖစ္လာဖိုု ့ဒီလိုု Resource ေတြ မ်ွယူသုုံစြဲရပါတယ္။ ယခုုလိုု အဆင္ဆင့္ ဖန္တီးထားတဲ့ actvity ဟာ ခဏေလး သာ ၾကည့္ဖိုု ့ျဖစ္သြားပါတယ္။ ဘာလိုု ့လဲဆိုုေတာ့ အသုုံးျပဳသူ (user) ဟာ ေနာက္ activity တခုုကိုု ကူးေျပာင္းသြားမွာျဖစ္ပါတယ္။ အသုုံးျပဳသူ ကလဲ ေနာက္ထပ္ အသစ္သစ္ေသာ activity ကိုုသာ ကူးေျပာင္း ကာသံုုးစြဲေနမွာျဖစ္ပါတယ္။ ဒီလိုု အဆင့္အဆင္ ဒုုကၡခံ ဖန္တီးထားတဲ့ activity ေတြဟာ ခဏၾကည့္ျပီး ျပန္ပိတ္ ျပန္ျပီးဖြင့္ ေနရရင္ Mobile ရဲ ့စြမ္းေဆာင္ရည္နဲ့ကေတာ့ လုုံး၀ မျဖစ္နုုိင္ေတာ့တာ အေသခ်ာပါပဲ။ ဒီလိုု ေတြ ျဖစ္ပ်က္ ျဖစ္ပ်က္ျဖစ္ေနတဲ့ Activity Life Cycle ကိုု ့Activity Manager ျဖင့္ ထိန္းခ်ဳပ္ရပါတယ္။


What is Activity Manager?

Activity Manager ဆိုုတဲ့အတုုိင္း Component Activity ေတြကိုု စီမံခန္ ့ခြဲပါတယ္။ Activity Manager က Activities မ်ားကိုု ဖန္တီးျခင္း၊ ဖ်က္သိမ္းျခင္း ထိန္းခ်ဳပ္ စီမံခ်င္းမ်ားကိုု လုုပ္ေဆာင္ပါတယ္။ က်ေနာ္တိုု ့ app တခုုကိုု စျပီး ဖြင့္လိုုက္ျပီဆိုုတာနဲ ့ Activity Manager ဟာ Activity တခုုကိုု ဖန္တီးလိုုက္ျပီး Screen ေပၚကိုု တင္ေပးလိုုက္ပါတယ္။ ေနာက္ က်ေနာ္တိုု ့ေနာက္ထပ္ Activity တခုကိုု ကူးေျပာင္းတဲ့အခါ Activity Manager ဟာ ပထမ activity ကိုု ခတၱ သိမ္းရာ Holding Place ေပၚတင္လိုုက္ျပီး ေနာက္ထပ္ activity တခုုကိုုဖန္တီးေပးပါတယ္။ တကယ္လိုု ့အသုုံးျပဳသူဟာ ယခင္ Activity ကိုု ျပန္သြားပါက အစအဆုုံးျပန္လည္ ဖန္တီးေနစရာမလိုုတဲ့အတြက္ ပိုုမိုု ျမန္ဆန္စြာ launch လုုပ္နုုိင္မွာပါ။ activity ေတြဟာ Pause state မွာရွိေနေပမယ့္လဲ Memory ကိုုေတာ့အနည္းနဲ ့အမ်ားကေတာ့ ယူသုုံးေနအုုံးမွာျဖစ္ပါတယ္ ဒါေၾကာင့္ မလိုုအပ္ေတာ့ဘူးလိုု ့ထင္တဲ့ မသုုံးတာ ၾကာတဲ့ Activity ေတြကို AM ကေန ဖ်က္သိမ္း( destroy ) လုုပ္လိုုက္ပစ္ပါတယ္။ ထိုု ့ေၾကာင့္ memory Free space ပိုုမုုိ ရရွိလာျပီး Performace ပိုုမိုုေကာင္းမြန္လာမွာျဖစ္ပါတယ္။ UI ရဲ ့ speed လဲသိသာစြာေကာင္းမြန္တိုုးတက္လာပါတယ္။ ဒါဟာ Activity Manager ရဲ ့အက်ဳိးေက်းဇူးေတြေပါ့။


Starting State
-----------------
Starting State ဆိုုတာ mobile device ရဲ ့Memory ေပၚမွာ app မရွိေသးဘူးဆိုုတ့ဲသေဘာပါပဲ။ app တခုုကိုု စဖြင့္လိုုက္တဲ့ သေဘာေပါ့။ အဲခ်ိန္မွာ callback Method အမ်ားၾကီး တျပိဳင္ထဲ run ေလ့ရွိတဲ့အတြက္ developer အေနနဲ ့callback method မ်ားကိုု ၾကိဳတင္ျပင္ဆင္နုုိင္ခြင့္ရွိပါတယ္။ ဒီလိုုအဆင့္ေတြျပီးရင္ေတ့ Running state ကိုု ေရာက္သြားပါျပီ။
ဒီလိုု starting state ကေန running state ကိုုေရာက္ဖိုု ့အတြက္ computing power ကို OS နဲ ့အတူ သုုံးစြဲပါတယ္။ ဒီလိုုပဲ Battery ကိုုလဲ အတူအသုုံးျပဳၾကတယ္။ computing time ဘက္ကၾကည့္မယ္ဆိုု အေတာ့္ကိုုသုုံးစြဲတဲ့အခ်ိန္ေပါ့။ က်ေနာ္တိုု ့app တခုုရဲ ့activity တခုုကိုုသုုံးေနျပီး ေနာက္တခုုကိုု ကူးေျပာင္းတဲ့အခါ ပထမ activity က holding place ေပၚေရာက္သြားတာ အေပၚမွာေျပာခဲ့ပါတယ္။ ဘာေၾကာင့္ တခါတည္း destroy မလုုပ္ဘဲ ဒီေနာက္ကြယ္က activity ေတြခ်န္ထားရလဲ ဆိုုေတာ့ staring state ကေန running state ကိုုေရာက္ဖိုု ့ Resource ေတြအရမ္းသုုံးရတယ္။ ကရိကထ နုုိင္တယ္ဆိုုရမွာေပါ့။ user က သူျပန္သုုံးတဲ့အခါ ဒီလိုုသာ အစအဆုုံးျပန္ျပီး စေနရရင္ Performace ပိုုင္းအရ ျပႆနာ ရွိေနျပီေပါ့။ ဒါေၾကာင့္ တခါတည္း Destroy မလုုပ္ပဲ ခ်န္ထားတာပါ။

Running State
---------------------
တခါတေလ Focus activity လိုု ့ေခၚေလ့ရွိပါတယ္။ က်ေနာ္တိုု ့Android app တခုုခုုကိုု အသုုံးျပဳေနတဲ့အခ်ိန္ က်ေနာ္တိုု ့စာရိုုက္ေနတာလဲျဖစ္မယ္ Website ၾကည့္ေနတာလဲျဖစ္မယ္၊ ဓါတ္ပုုံရိုုက္ေနတာလဲျဖစ္မယ္၊ အဲလိုုခ်ိန္မွာ User နဲ ့လုုံး၀ Interact ရွိေနပါတယ္။ User သုုံးေနတဲ့ Activity ကေတာ့ Focus Activity ပါပဲ။ အဲလိုုခ်ိန္မ်ဳိးမွသူက Focus ျဖစ္ေနတဲ့အတြက္ Memory နွင့္ အျခား Resource မ်ား ေတြကိုု လက္၀ါးၾကီးသိမ္းပိုုက္ထားတဲ့အခ်ိန္ေပါ့။ ဒီခ်ိန္မွာ သူက ခရာက်တယ္ေလ။ ဒါေပမယ့္ အခ်ိန္တခ်ိန္မွာ Running State Focus Activity တခုုပဲရွိပါတယ္ ဘာလိုု ့လဲဆိုုေတာ့ အသုုံးျပဳသူက ေနာက္ထပ္ Screen တခုုကိုုေျပာင္းလဲ သုုံးျပဳတာနွင့္တျပိဳင္နက္ ပထမ Activity လိုု ့ ဟာ Focus မဟုုတ္ေတာ့ပါဘူး။ သူက Pause State ကိုု ေျပာင္းလဲသြားရတယ္။ ဒါေတြအားလုုံးကိုု Activity Manager က ေကာင္းေကာင္း ေနာက္ကြယ္ကလုုပ္ေဆာင္ေပးေနတာပါ။

တခါတေလလဲ Running state Focus Activity ဆိုုတိုုင္း အရမ္းၾကီး အလုပ္ရွုုတ္ေနတဲ့ activity လို ့တရားေသ မယူဆ ေစခ်င္ပါဘူး။ တခါတေလ running focus activity ေတာင္မွ user ဆီက input ကိုုေစာင့္ဆိုုင္းေနရတဲ့ အခ်ိန္ အဲလိုုမ်ဳိး အခိုုက္အတန္ ့မ်ိဳးလဲ ရွိတက္တာပဲေလ။ ဒီလိုုပဲ
stopped state မွာရွိေနတဲ့ activity ဟာလဲ ဘာမွ အလုုပ္မလုုပ္ေတာ့ လိုု ့ပုုံေသကားျခပ္ ေျပာလိုု ့မရနုုိင္ပါဘူး။ ဒီလိုုသတ္မွတ္ဖိုု ့ဆိုုတာက activty ဟာ focus state တြင္ရွိျခင္း မရွိျခင္း screen ေပၚတြင္ ရွိျခင္းမရွိုုခင္းတိုု ့ အေပၚမွာသာ အေျခခံျခင္းျဖစ္ပါတယ္။


Pause Statement
---------------------

အေပၚမွာ ေဆြးေႏြးခဲ့သလိုုပဲ တကယ္လိုု ့Activity တခုုဟာ Focus အဆင့္ သုုံးေနတဲ့အဆင့္မွာမဟုုတ္ေတာ့ရင္ေတာင္မွ Screen ေပၚမွာရွိေနေသးပါတယ္။ Pause State မွာေတာ့ Resources ေတြကေတာ့ ၄င္း activity အတြက္ ဦးစားေပးအဆင့္တြင္ပင္ရွိပါေသးသည္။ ဘာေၾကာင့္လဲဆိုုေတာ့ ၄င္းကိုု လုုံး၀ဖ်က္သိမ္းလိုုက္ျခင္းမရွိေသးေသာေၾကာင့္ျဖစ္ပါသည္။

Stopped State
-------------------
၄င္း အဆင့္မွာ Activity ဟာ Screen ေပၚမွာရွိမေနေတာ့ေပမယ့္ Memory ရဲ ့ေနရာတခုုမွာေတာ့ရွိေနပါေသးတယ္။ Pause state ေလာက္ ဦးစားေပး အဆင့္မဟုုတ္ရင္ေတာင္ Stopped Activity ဟာ လက္ရွိ အလုုပ္လုုပ္ေနဆဲ Running Focus state Activity တခုုက ေခၚယူတဲ့အခါမွာ Focus Activity တခုုအျဖင့္ Screen ေပၚသိုု ့ျပန္လည္ေရာက္ရွိလာနုုိင္ပါေသးတယ္။ ဒီလိုုမွမဟုုတ္ဘဲ ေခၚယူသုုံးစြဲမွုု မရွိဘူး မရွိနုုိင္ေတာ့ဘူးလိုု ့ Activity Manager ထင္ရင္ လုုံး၀ destroy လုုပ္ျပီး Memory ေပၚက ဖယ္ရွားလိုုက္ပါတယ္။ Memory ေပၚမွာ Free space လိုုအပ္မွုုေပၚကိုုၾကည့္ျပီး AM က အလုုပ္လုုပ္ေဆာင္ေပးေနတာပါ။

ဥပမာ တခုုေပးရမယ္ဆိုုရင္ ျပဇာတ္ပြဲ တခုုဆိုုပါစိုု ့။ ပထမဆုုံး ပြဲထြက္ဖိုု ့ေတာ္ေတာ္ၾကာတယ္ဗ်။ က်ေနာ္ကေတာ့ဘယ္သူပါ ဘာသီခ်င္းဆိုုမွာဘာညာနဲ ့အခ်ိန္ေတာ္ေတာ္ၾကာတယ္ ဒါ Android App တခုုကိုု Launch လုုပ္လိုုက္တာနဲ ့ဆင္တယ္။ ။ state စင္ျမင့္ ကိုု Screen လိုု ့ယူစလိုုက္ပါ။ စင္ျမင့္ ေပၚမွာကျပ အသုုံးေတာ္ခံ (performance) လုုပ္ေနတဲ့သူက Running state focus activity ေပါ့။ အဲခ်ိန္ ၾကည့္ရွဳ ့ေနတ့ဲ မင္းပရိ္တ္သတ္နဲ ့တသားထဲၾကေနတာ user က activity တခုုနဲ ့ interact လုုပ္ေနတဲ့နဲ ့ဆင္တူပါတယ္။။ အဲသူ ကျပလိုု ့ျပီးေတာ့ ခဏ နားပါတယ္။ ေနာက္တစ္ေယာက္ က စင္ျမင့္ေပၚမွာေဖ်ာ္ျဖည္ေပါ့။ အဲခ်ိန္မွာ ပထမကတဲ့လူက ကလကာ ရဲ ့ေနာက္မွာ အက်ၤ ီလဲ ခဏနားေပါ့ဗ်ာ။ သူ ့ကိုု Pause state လိုု ့ေျပာလိုု ့ရတယ္ သူ Memory ေပၚမွာပဲရွိေသးတယ္ေလ သူျပန္ေဖ်ာ္ျဖည္ဖိုု ့အဆင္သင့္ျဖစ္ေနတဲ့အေနထားေပါ့။ သူအလွည့္ သူျပန္ ကျပမယ္ေပါ့။ တကယ္လိုု ့သူကျပဖိုု ့တာ၀န္ျပီးျပီဆိုု ရင္ သူအ၀တ္လဲျပီး နားေကာင္းနားမယ္ ကပြဲကိုုပရိတ္သတ္နဲ ့အတူၾကည့္ခ်င္ၾကည့္ေနမယ္။သူ ကဇာတ္ရုုံကေန အိမ္ျပန္သြားရင္ေတာ့ ဒါdestroy state ကိုုေရာက္သြားတာပါ။ က်ေနာ္တိုု ့အေပၚမွာေျပာခဲ့သလိုုဆိုု သူကိုုမလိုုအပ္ေတာ့လိုု ့Stopped လုုပ္ျပီး memory ေပၚကေနလုုံး၀ဖယ္ရွားလိုုက္တာပါ။ တကယ္လိုု ့destroy လုုပ္ျပီးမွ ျပန္ေခၚမယ္ဆိုု အစအဆုုံး Launch ျပန္လုုပ္ရမွာမိုု ့Resource ေကာ အခ်ိန္ေကာ ေပးရမွာေပါ့။ အိမ္ကလူ ျပန္ေခၚျပီး လာျပန္ကဆိုုသလိုုျဖစ္ေနမယ္ထင္တယ္။


Destroy State
-------------------
ဒီအဆင့္မွာေတာ့ destroy လုုပ္လိုုက္ျပီးတဲ့ activity ဟာ memory ေပၚမွာ မရွိေနေတာ့ပါ။ AM က မလိုုအပ္ေတာ့ဘူးထင္လိုု ့သူက Activity လုုံး၀ ဖ်က္သိမ္းလိုုက္တာျဖစ္ပါတယ္။ Developer တစ္ေယာက္အေနနဲ ့ ကိုုယ္ေရးသားမယ့္ app တခုုမွာ save process ကိုု pause state မတိုုင္ခင္ေရးသားသင့္တယ္လိုု ့က်ေနာ္ထင္ပါတယ္။ ဘာလိုု ့လဲဆိုုေတာ့ app တခုုရဲ ့component activity ကိုု destroy မလုုပ္ခင္ မသိမ္းဆည္း ရေသးတဲ့ အခ်က္အလက္ data ေတြကိုု သိမ္းဆည္းပါတယ္။ ဒါေပမယ့္ တခါတေလမွာေတာ့ pause state မွာ ရွိတဲ့ activity ဟာလဲ destroy လုုပ္ခံရနုုိင္ပါတယ္။ ဒါေၾကာင့္ အေရးပါတဲ့ save process ကိုု pause state မတိုုင္ခင္ေရးသားသင့္တယ္လိုု ့ က်ေနာ္ထင္ပါတယ္။

ေနာက္တပိုုင္းက်မွာပဲ Intent မ်ား Content Providers မ်ား Background service မ်ားအေၾကာင္းကိုု ေ၀မ်ွေရးသားလိုုပါတယ္။
Ref: M51A

No comments:

Post a Comment