• Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
711
On Slideshare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
30
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Part 3 Android Application’s Life CycleNotes are based on: Unlocking Android by Frank Ableson, Charlie Collins, and Robi Sen. ISBN 978-1-933988-67-2 Manning Publications, 2009. Android Developers http://developer.android.com/index.html
  • 2. 3. Android – Applications Life Cycle Outline• Android Applications • Activity, Service, Broadcast receiver, Content provider • process• Application’s Life Cycle • Activity Stack • Life Cycle States • Life Cycle Events • Application’s Lifetime: Visible Lifetime Foreground Lifetime • Life Cycle Methods: onCreate(), onStart(), onDestroy()... • Example: LifeCycleDemo 2
  • 3. 3. Android – Applications Life Cycle Android ApplicationsMột ứng dụng (application) bao gồm một hoặc vài componentđược định nghĩa trong manifest file của ứng dụng, gồm các loại: 1. Activity 2. Service 3. BroadcastReceiver 4. ContentProviderỨng dụng Android so với Java application: • Cũng viết 1 class để thực hiện một công việc nào đó • Không dùng hàm main khởi tạo một object thuộc class đó và gọi phương thức của nó • Tùy theo loại object (Activity, Service....), Android sẽ gọi constructor và quản lý vòng đời của object đó 3
  • 4. 3. Android – Applications Life Cycle Android Applications1. ActivityMột activity thường trình diễn một giao diện người dùng đơn bằng hình ảnhmà từ đó có thể thực hiện một số hành động (action).Tuy các activity cộng tác với nhau để hợp thành một giao diện người dùngthống nhất, mỗi activity có tính độc lập với các activity khác.Thông thường, một activity được đánh dấu làm activity đầu tiên – cái sẽ đượctrình diễn cho người dùng khi ứng dụng được bật lên.Việc gọi một activity từ bên trong một activity khác được thực hiện qua việcactivity hiện hành gọi activity tiếp theo qua cơ chế intent. (startActivity(Intent)) 4
  • 5. 3. Android – Applications Life Cycle Android Applications2. ServiceMột service không có giao diện người dùng bằng hình ảnh, thay vào đó, nó chạyẩn tại background trong một khoảng thời gian không xác định.Có thể kết nối (bind to) với một service đang chạy (hoặc chạy service đó nếu nóhiện chưa chạy).Trong khi đang kết nối, ta có thể liên lạc với service đó qua một giao diện mà nócung cấp. 5
  • 6. 3. Android – Applications Life Cycle Android Applications3. Broadcast receiverMột broadcast receiver là một component không làm gì ngoài việc nhận và phảnứng với các broadcast announcement.Nhiều broadcast bắt nguồn từ mã hệ thống (ví dụ “you got mail“), nhưng bấtcứ ứng dụng nào cũng có thể phát broadcast.Broadcast receiver không hiển thị giao diện người dùng. Tuy nhiên, chúng có thểbật một activity để đáp ứng thông tin mà chúng nhận được, hoặc - giống nhưcách làm của các service – chúng có thể dùng notification manager để thông báocho người dùng. 6
  • 7. 3. Android – Applications Life Cycle Android Applications4. Content providerMột content provider cung cấp một tập dữ liệu của một ứng dụng cho các ứngdụng khác.Dữ liệu thường được lưu trong hệ thống file, hoặc trong một CSDL SQLite.Mỗi content provider cài đặt một tập chuẩn các phương thức cho phép các ứngdụng khác lấy và lưu trữ dữ liệu thuộc loại mà nó kiểm soát.Tuy nhiên, các ứng dụng không gọi trực tiếp các phương thức này. Thay vào đó,chúng dùng một đối tượng content resolver và gọi các phương thức của đốitượng đó. Một content resolver có thể nói chuyện với một content provider bấtkì; nó cộng tác với provider để quản lý quá trình liên lạc xuyên tiến trình(interprocess communication) phát sinh. 7
  • 8. 3. Android – Applications Life Cycle Android ApplicationsMỗi ứng dụng Android chạy trong một tiến trình riêng(cùng với thực thể máy ảo Dalvik của riêng nó).Mỗi khi có một request cần được xử lý bởi một component cụ thể nào đó, • Android đảm bảo rằng tiến trình ứng dụng của component đó đang chạy, • khởi động nó nếu cần, và • đảm bảo rằng có sẵn một thực thể (instance) của component đó, nếu cần thì tạo ra thực thể đó. 8
  • 9. 3. Android – Applications Life Cycle Application’s Life CycleMột tiến trình Linux dành cho một ứng dụng Android được tạo ra choứng dụng đó khi có một số phần code của ứng dụng đó cần chạy.Tiến trình đó sẽ tồn tại cho đến khi 1. không còn cần đến nó nữa, HOẶC 2. hệ thống cần thu hồi bộ nhớ để cho các ứng dụng khác dùng. 9
  • 10. 3. Android – Applications Life Cycle Application’s Life CycleMột tính chất đặc biệt nhưng căn bản của Android là các tiến trìnhkhông trực tiếp kiểm soát vòng đời của chính mình.Thay vào đó, số phận của nó được hệ thống quyết định dựa trên thôngtin về 1. Các phần ứng dụng hiện đang chạy, 2. Tầm quan trọng của chúng đối với người dùng 3. Hệ thống còn bao nhiêu bộ nhớ. 10
  • 11. 3. Android – Applications Life Cycle Component LifecyclesCác component của ứng dụng có một vòng đời (lifecycle)1. bắt đầu: khi Android tạo thực thể của component để đáp ứng cácintent2. kết thúc: khi các thực thể đó bị hủy.3. giữa chừng: đôi khi chúng có thể active hoặc inactive, hay trongtrường hợp của các activity- visible hoặc invisible đối với ngườidùng. Life as an Android Application: Start Active / Inactive End Visible / Invisible 11
  • 12. 3. Android – Applications Life Cycle Activity Stack• Các activity trong hệ thống được quản lý bằng một activity stack.• Khi một activity mới được bật, nó được đặt trên đỉnh stack và trở thành running activity -- activity trước nó nằm bên dưới ở trong stack, và sẽ không hiện trở lại tại foreground (đỉnh stack) cho đến khi activity mới kết thúc.• Nếu người dùng nhấn phím Back, activity tiếp theo trong stack sẽ dịch lên và chuyển sang trạng thái hoạt động (active). 12
  • 13. 3. Android – Applications Life Cycle Activity Stack New Activity Running Activity New Activity Back button pushed or started running activity closed Last Running Activity Activity n-1 Activity Stack ... Previous Activity 3 Activities Removed to Activity 2 free resources Activity 1Figure 1. 13
  • 14. 3. Android – Applications Life Cycle Life Cycle StatesAn activity has essentiallythree states:1. It is active or running2. It is paused or3. It is stopped . Figure 2. 14
  • 15. 3. Android – Applications Life Cycle Life Cycle StatesMột activity về căn bản có ba trạng thái:1. Active / running: đang ở tại foreground của màn hình (trên đỉnh của activity stack), đang chạy.2. Paused: mất focus, vẫn được hiển thị trên màn hình nhưng một activity khác đang nằm trên nó và cái activity mới này hoặc có nền trong suốt hoặc không phủ kín màn hình. Một activity ở trạng thái paused có thể bị hệ thống kill nếu ở tình trạng rất thiếu bộ nhớ.3. Dừng (stopped) bị một activity khác che khuất hoàn toàn. Nó vẫn giữ tất cả các thông tin về trạng thái và member. Hệ thống thường kill nó nếu cần bộ nhớ cho việc khác. 15
  • 16. 3. Android – Applications Life CycleApplication’sLife Cycle Figure 3. 16
  • 17. 3. Android – Applications Life Cycle Life Cycle EventsSummary: APP MILESTONESNếu một activity ở trạng thái paused hay stopped, hệ thống có thể loại nó ra khỏibộ nhớ bằng cách yêu cầu nó kết thúc (gọi phương thức finish() của nó), hoặc đơngiản là kill tiến trình của nó.Khi nó lại được hiển thị trở lại cho người dùng, nó phải được bật lại (restart) từđầu và khôi phục về trạng thái cũ.Khi một activity chuyển trạng thái, nó được hệ thống thông báo về sự thay đổi đóbằng các lời gọi tới các phương thức sau (transition methods): void onCreate(Bundle savedInstanceState) void onPause() void onStart() void onStop() void onRestart() void onDestroy() void onResume() 17
  • 18. 3. Android – Applications Life Cycle Life Cycle Events Ta có thể override tất cả các phương thức đó để ứng dụng có hoạt độngthích hợp khi trạng thái thay đổi. (BẮT BUỘC) Tất cả các activity phải cài đặt onCreate() để thực hiện khởi tạo khi đối đượng vừa được tạo (instantiated). (Rất nên) Nhiều activity cài onPause() để ghi nhận các thay đổi về dữ liệu (commit) và chuẩn bị cho việc ngừng tương tác với người dùng. 18
  • 19. 3. Android – Applications Life Cycle Application’s LifetimeEntire LifetimeBảy phương thức chuyển trạng thái (Figure 3) xác định toàn bộ cuộc đờicủa một activity. • Toàn bộ cuộc đời của một activity bắt đầu từ lời gọi onCreate() đầu tiên tới một lời gọi onDestroy() duy nhất cuối cùng. • Một activity thực hiện toàn bộ công việc khởi tạo trạng thái "global" tại onCreate(), và trả lại tất cả các tài nguyên còn giữ tại onDestroy(). 19
  • 20. 3. Android – Applications Life Cycle Visible LifetimeVisible Lifetimevisible lifetime của một activity kéo dài từ một lời gọi onStart() tới lời gọitương ứng tới onStop(). Trong khoảng thời gian này, người dùng có thể nhìn thấy activity đó trên màn hình, tuy nó có thể không nằm tại foreground và tương tác với người dùng. • Các phương thức onStart() và onStop() có thể được gọi nhiều lần, khi activity chuyển giữa hai trạng thái hiện và bị che đối với người dùng. • Giữa hai phương thức này, ta có thể giữ các tài nguyên cần thiết cho việc hiển thị activity trên màn hình. 20
  • 21. 3. Android – Applications Life Cycle Foreground LifetimeForeground Lifetimeforeground lifetime của một activity bắt đầu từ một lời gọi onResume() vàkết thúc bởi lời gọi tương ứng tới onPause(). Trong khoảng thời gian này, activity đó đứng trước mọi activity khác trên màn hình và nó tương tác với người dùng.Một activity có thể thường xuyên chuyển qua lại giữa các trạng tháiresumed và paused 21
  • 22. 3. Android – Applications Life Cycle Life Cycle MethodsMethod: onCreate()•Được gọi khi activity được tạo.•Đây là nơi ta nên thực hiện khởi tạo tĩnh thông thường — tạo giaodiện người dùng (các view), nối dữ liệu với các danh sách, v.v..•Tham số được truyền một đối tượng Bundle chứa trạng thái cũ củaactivity, nếu như trạng thái đã được ghi lại.•onStart() luôn được gọi sau đó. 22
  • 23. 3. Android – Applications Life Cycle Life Cycle MethodsMethod: onRestart()•Được gọi ngay trước khi activity được khởi động lại sau khi đã bịdừng (stopped).•onStart() luôn được gọi sau đó.Method: onStart()•Được gọi ngay trước khi activity được hiện trên màn hình (visible).•Tiếp theo là onResume() nếu activity lên foreground, hoặc onStop()nếu nó bị che. 23
  • 24. 3. Android – Applications Life Cycle Life Cycle MethodsMethod: onResume()1.Được gọi ngay trước khi activity bắt đầu tương tác với ngườidùng.2.Tại thời điểm này, activity nằm trên đỉnh activity stack và nhậninput của người dùng.3.Tiếp theo bao giờ cùng là onPause(). 24
  • 25. 3. Android – Applications Life Cycle Life Cycle MethodsMethod: onPause()1.Được gọi khi hệ thống chuẩn bị chuyển sang một activity khác.2.Phương thức này thường dùng để ghi các thay đổi chưa được lưu,dừng hoạt hình và những công việc tốn CPU khác, v.v..3.Nó nên làm công việc của mình thật nhanh vì activity tiếp theophải đợi nó kết thúc thì mới resume được.4.Tiếp theo là onResume() nếu activity quay lại, hoặc onStop() nếunó không còn được hiển thị đối với người dùng.5.Activity trong trạng thái này có thể bị hệ thống kill. 25
  • 26. 3. Android – Applications Life Cycle Life Cycle MethodsMethod: onStop()1.Được gọi khi activity không còn hiển thị đối với người dùng.2.Việc này có thể xảy ra khi nó bị hủy (destroyed), hoặc do mộtactivity khác (cũ hoặc mới) đã được resume và che nó.3.Tiếp theo là onRestart() nếu activity tương tác trở loại với ngườidùng, hoặc onDestroy() nếu nó không quay lại.4.Hệ thống có thể kill activity trong trạng thái này. 26
  • 27. 3. Android – Applications Life Cycle Life Cycle MethodsMethod: onDestroy()1.Được gọi trước khi activity bị hủy.2.Đây là lời gọi hàm cuối cùng mà activity nhận được.3.Nó có thể được gọi vì activity đang kết thúc (hàm finish() củaactivity được gọi), hoặc vì hệ thống đang tạm thời hủy thực thể hiệntại của activity để tiết kiệm không gian bộ nhớ.4.Ta có thể phân biệt hai tình huống trên bằng cách dùng phươngthức isFinishing().5.Hệ thống có thể kill activity trong trạng thái này. 27
  • 28. 3. Android – Applications Life Cycle Life Cycle MethodsKillable States – các trạng thái mà hệ thống kill được•Activity ở trạng thái killable có thể bị hệ thống kết thúc bất cứ lúc nàosau khi phương thức trả về mà không thực thi thêm một dòng lệnh nàotrong mã của activity.•Ba phương thức onPause(), onStop(), và onDestroy() dẫn đến trạngthái killable.•onPause() là phương thức duy nhất đảm bảo được gọi trước khi tiếntrình bị hủy (killed) — onStop() và onDestroy() có thể không được gọi.•Do đó, ta nên dùng onPause() để lưu dữ liệu cần giữ lại (chẳng hạncác sửa đổi của người dùng). 28
  • 29. 3. Android – Applications Life Cycle Life Cycle Methods As an aside…Android PreferencesPreference là một cơ chế gọn nhẹ để lưu trữ và đọc các cặp key-value thuộccác kiểu dữ liệu cơ bản. Nó thường được dùng để lưu các preference của ứngdụng, chẳng hạn như lời chào mừng mặc định hoặc một font chữ cần nạp khiứng dụng được bật lên.Gọi Context.getSharedPreferences() để đọc và ghi các giá trị.Gán tên cho tập preference của mình nếu ta muốn dùng chúng tại cáccomponent khác trong cùng một ứng dụng, hoặc dùngActivity.getPreferences() không có tên để dùng riêng cho activity đang gọi.Ta không thể chia sẻ preference cho các ứng dụng khác (trừ khi dùng contentprovider). 29
  • 30. LAYOUT3. Android – Applications Life CycleExample <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"Life Cycle android:id="@+id/myScreen" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#ff000000" > <TextViewExample android:layout_width="fill_parent" android:layout_height="wrap_content"Ứng dụng sau trình diễn android:text="@string/hello" />một số tình huống <EditText android:id="@+id/txtColorSelect"chuyển trạng thái android:hint="Background color (red, green, blue)" android:layout_width="wrap_content" android:layout_height="wrap_content">xảy ra trong một chu </EditText> <TextViewtrình sống của một android:id="@+id/txtToDo" android:layout_width="fill_parent"activity điển hình. android:layout_height="wrap_content" android:background="#00000000"> <!-- transparent --> </TextView> <Button android:text=" Finish " android:id="@+id/btnFinish" android:layout_width="wrap_content" android:layout_height="wrap_content"> </Button> </LinearLayout> 30
  • 31. 3. Android – Applications Life Cycle Example: Life CycleCode: Life Cycle Demo. Part 1package es.demo;import android.app.Activity;import android.content.SharedPreferences;import android.os.Bundle;import android.view.View;import android.widget.*;//GOAL: show the following life-cycle events in action//protected void onCreate(Bundle savedInstanceState);//protected void onStart();//protected void onRestart();//protected void onResume();//protected void onPause();//protected void onStop();//protected void onDestroy(); 31
  • 32. 3. Android – Applications Life Cycle Example: Life CycleCode: Life Cycle Demo. Part 2 private LinearLayout myScreen; private TextView txtToDo; private EditText txtColorSelect; private Button btnFinish; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); myScreen = (LinearLayout) findViewById(R.id.myScreen); txtToDo = (TextView) findViewById(R.id.txtToDo); String msg = "Instructions: n "+ "0. New instance (onCreate, onStart, onResume) n "+ "1. Back Arrow (onPause, onStop, onDestroy) n "+ "2. Finish (onPause, onStop, onDestroy) n "+ "3. Home (onPause, onStop) n "+ "4. After 3 > App Tab > re-execute current app n "+ " (onRestart, onStart, onResume) n "+ "5. Run DDMS > Receive a phone call or SMS n "+ " (onRestart, onStart, onResume) n "+ "6. Enter some data - repeat steps 1-5 n "; txtToDo.setText(msg); 32
  • 33. 3. Android – Applications Life Cycle Example: Life CycleCode: Life Cycle Demo. Part 3 txtColorSelect = (EditText) findViewById(R.id.txtColorSelect); // you may want to skip discussing the listener until later txtColorSelect.addTextChangedListener(new TextWatcher(){ public void onTextChanged(CharSequence s, int start, int before, int count) { // TODO Auto-generated method stub } public void beforeTextChanged(CharSequence s, int start, int count,int after) { // TODO Auto-generated method stub } public void afterTextChanged(Editable s) { changeBackgroundColor(s.toString()); } }); btnFinish = (Button) findViewById(R.id.btnFinish); btnFinish.setOnClickListener(new OnClickListener() { public void onClick(View arg0) { finish(); } }); Toast.makeText(getApplicationContext(), "onCreate", 1).show();} 33
  • 34. 3. Android – Applications Life Cycle Example: Life CycleCode: Life Cycle Demo. Part 4@Overrideprotected void onPause() { super.onPause(); saveDataFromCurrentState(); Toast.makeText(this, "onPause", 1).show();}@Overrideprotected void onRestart() { super.onRestart(); Toast.makeText(this, "onRestart", 1).show();}@Overrideprotected void onResume() { super.onResume(); Toast.makeText(this, "onResume", 1).show();} 34
  • 35. 3. Android – Applications Life Cycle Example: Life CycleCode: Life Cycle Demo. Part 5@Overrideprotected void onStart() { // TODO Auto-generated method stub super.onStart(); updateFromSavedState(); Toast.makeText(this, "onStart", 1).show();}@Overrideprotected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); Toast.makeText(this, "onDestroy", 1).show();}@Override protected void onStop() { // TODO Auto-generated method stub super.onStop(); Toast.makeText(this, "onStop", 1).show();} 35
  • 36. 3. Android – Applications Life Cycle Example: Life CycleCode: Life Cycle Demo. Part 6protected void saveDataFromCurrentState() { SharedPreferences myPrefs = getSharedPreferences(MYPREFSID, actMode); SharedPreferences.Editor myEditor = myPrefs.edit(); myEditor.putString("myBkColor", txtColorSelect.getText().toString()); myEditor.commit();} // saveDataFromCurrentStateprotected void updateFromSavedState() { SharedPreferences myPrefs = getSharedPreferences(MYPREFSID, actMode); if ((myPrefs != null) && (myPrefs.contains("myBkColor"))) { String theChosenColor = myPrefs.getString("myBkColor",""); txtColorSelect.setText(theChosenColor); changeBackgroundColor(theChosenColor); }} // updateFromSavedStateprotected void clearMyPreferences() { SharedPreferences myPrefs = getSharedPreferences(MYPREFSID, actMode); SharedPreferences.Editor myEditor = myPrefs.edit(); myEditor.clear(); myEditor.commit(); 36} // clearMyPreferences
  • 37. 3. Android – Applications Life Cycle Example: Life CycleCode: Life Cycle Demo. Part 7private static String MYPREFSID; //used in part 6private static int actMode; //used in part 6private void changeBackgroundColor (String theChosenColor){ // change background color if (theChosenColor.contains("red")) myScreen.setBackgroundColor(0xffff0000); else if (theChosenColor.contains("green")) myScreen.setBackgroundColor(0xff00ff00); else if (theChosenColor.contains("blue")) myScreen.setBackgroundColor(0xff0000ff); else { //reseting user preferences clearMyPreferences(); myScreen.setBackgroundColor(0xff000000); }} 37
  • 38. 3. Android – Applications Life Cycle Example: Life CycleCode: Life Cycle Demo. Part 8 /* protected void onRestoreInstanceState(Bundle savedInstanceState) This method is called after onStart() when the activity is being re-initialized from a previously saved state. The default implementation of this method performs a restore of any view state that had previously been frozen by onSaveInstanceState(Bundle). Phương thức này được gọi sau onStart() khi activity đang được khởi tạo lại từ trạng thái đã lưu lại trước đó. Cài đặt mặc định của phương thức này khôi phục trạng thái view đã được lưu bởi onSaveInstanceState(Bundle). */@Overrideprotected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); Toast.makeText(getBaseContext(), "onRestoreInstanceState ...BUNDLING", Toast.LENGTH_LONG).show();} 38
  • 39. 3. Android – Applications Life Cycle Example: Life CycleCode: Life Cycle Demo. Part 9/*protected void onSaveInstanceState(Bundle outState)Called to retrieve per-instance state from an activity before being killedso that the state can be restored in onCreate(Bundle) or onRestoreInstanceState(Bundle) (the Bundle populated by this method will be passed to both).This method is called before an activity may be killed so that when it comesback some time in the future it can restore its state. For example, if activity Bis launched in front of activity A, and at some point activity A is killed toreclaim resources, activity A will have a chance to save the current state ofits user interface via this method so that when the user returns to activity A,the state of the user interface can be restored via:onCreate(Bundle) or onRestoreInstanceState(Bundle).Phương thức này được gọi trước khi một activity có thể bị kill sao cho khi nó quay lạinó có thể phục hồi trạng thái của mình. Ví dụ, khi activity A bị hệ thống kill để lấytài nguyên, A sẽ có cơ hội lưu trạng thái hiện hành của giao diện người dùng bằngphương thức này, để khi người dùng quay lại activity A, trạng thái của giao diện ngườidùng có thể được khôi phục qua các phương thức onCreate(Bundle) hoặconRestoreInstanceState(Bundle). (Đối tượng Bundle mà phương thức này xây dựng sẽ đượctruyền cho cả hai phương thức khôi phục đó) 39*/
  • 40. 3. Android – Applications Life Cycle Example: Life CycleCode: Life Cycle Demo. Part 10@Overrideprotected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); Toast.makeText(getBaseContext(), "onSaveInstanceState ...BUNDLING", Toast.LENGTH_LONG).show();} // onSaveInstanceState}//LifeCycleDemo 40
  • 41. 3. Android – Applications Life Cycle Example: Life Cycle onCreate… onStart… onResume… 41
  • 42. 3. Android – Applications Life Cycle Example: Life Cycle onPause… onStop… onDestroy… After pressing “Back Arrow” 42
  • 43. Application’s Life Cycle Questions ? 43
  • 44. Application’s Life CycleAppendixLưu các thông tin trạng thái khác@Overridepublic void onCreate(Bundle savedInstanceState) { ... somevalue = savedInstanceState.getString(SOME_KEY); ...}...@Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putString(SOME_KEY, "blah blah blah");} 44
  • 45. 3. Android – Applications Life CycleHomework Your turn! Teaching notes EXPERIMENT 1. 1.Viết một ứng dụng Android. (“PuraVida”) để thử nghiệm các vòng đời khác nhau của ứng dụng. 2.Layout tại main.xml cần có một Button (text: “Finish”, id: btnFinish) và một EditText container (txt: “” , id: txtMsg). 3.Dùng phương thức onCreate để nối button và textbox với chương trình. Thêm dòng mã sau: Toast.makeText(this, "onCreate", 1).show(); 4.Phương thức click chỉ có một lệnh: finish(); dùng để kết thúc ứng dụng. Thêm một lệnh Toast (tương tự như trên) cho từng event trong 6 event còn lại. Để đơn giản, hãy dùng menu Source > Override/Implement Methods… của Eclipse 5.Tại cửa sổ option, đánh dấu các event sau: onStart, onResume, onPause, onStop, onDestroy, onRestart (để ý xem có bao nhiêu phương thức onEvent… tại đó!!!) 6.Lưu chương trình. 45
  • 46. 3. Android – Applications Life CycleHomework Your turn! Teaching notes EXPERIMENT 1 (cont.) 7.Dịch và chạy ứng dụng. 8.Ghi lại chuỗi các message hiển thị bởi các lệnh Toast. 9.Nhấn nút FINISH. Quan sát chuỗi các trạng thái. 10.Chạy lại ứng dụng 11.Nhấn nút HOME của emulator. Chuyện gì xảy ra? 12.Click vào launch pad, tìm icon và quay lại ứng dụng “PuraVida”. Chuỗi message nào được hiển thị? 13.Click phím CALL của emulator. Ứng dụng ở trạng thái paused hay stopped? 14.Click phím BACK để quay lại ứng dụng. 15.Long-tap vào nút HANG-UP. Chuyện gì xảy ra? 46
  • 47. 3. Android – Applications Life CycleHomework Your turn! Teaching notes EXPERIMENT 2 16. Chạy emulator thứ hai. 1. Thực hiện một voice-call tới emulator thứ nhất hiện vẫn hiển thị ứng dụng của bạn. Chuyện gì xảy ra? (yêu cầu đồng bộ thời gian thực) 2. Gửi một text-message tới emulator thứ nhất (yêu cầu không đồng bộ - asynchronous attention request) 17. Viết một câu vào EditText box (“these are the best moments of my life….”). 18. Chạy lại ứng dụng. Chuyện gì xảy ra đối với dòng text? 47
  • 48. 3. Android – Applications Life CycleHomework Your turn! Teaching notes EXPERIMENT 3 Đảm bảo tính bền vững của dữ liệu (data persistency). 19. Thêm vào phương thức onPause đoạn sau SharedPreferences myFile1 = getSharedPreferences("myFile1", Activity.MODE_PRIVATE); SharedPreferences.Editor myEditor = myFile1.edit(); String temp = txtMsg.getText().toString(); myEditor.putString("mydata", temp); myEditor.commit(); 20. Thêm vào phương thức onResume đoạn sau SharedPreferences myFile = getSharedPreferences("myFile1", Activity.MODE_PRIVATE); if ( (myFile != null) && (myFile.contains("mydata")) ) { String temp = myFile.getString("mydata", "***"); txtMsg.setText(temp); } 21. Giờ thì chuyện gì xảy ra với dữ liệu đã nhập vào text box? 48