Bài tập 6: Phân biệt Foreground Lifetime và Visible Lifetime


Để củng cố thêm sự hiểu biết về Lifetime Cycle trong bài tập 5,  bài tập này Tôi sẽ Demo cho các bạn một ứng dụng để bạn có thể hiểu rõ hơn về Lifetime Cycle, đặc biệt là nhận biết được Foreground Lifetime và Visible Lifetime:

Bạn tạo một ứng dụng tên là “LearnAndroidLifetime“, với cấu trúc như hình dưới:

6_Life_cycle_1– Nhìn vào hình bên trên thì ứng dụng này sẽ có tổng cộng 3 Activities. Chú ý là ta sẽ cấu hình  SubActivity1 để hiển thị dưới dạng Dialog (khi SubActivity1 kích hoạt thì nó sẽ nằm phía trên MainActivity, nhưng mà vẫn nhìn thấy màn hình MainActivity – tức là đồng thời nhìn thấy 2 Activity). Còn khi SubActivity2 hiển thị thì nó sẽ chiếm toàn bộ màn hình, không thể thấy được MainActivity.

– Giao diện và xml layout của MainActivity sẽ như bên dưới:

6_Life_cycle_2

đây là activity_main.xml của MainActivity

<LinearLayout xmlns:android=http://schemas.android.com/apk/res/android

xmlns:tools=http://schemas.android.com/tools

android:id=“@+id/LinearLayout1”

android:layout_width=“match_parent”

android:layout_height=“match_parent”

android:orientation=“horizontal”

tools:context=“.MainActivity” >

<Button

android:id=“@+id/button1”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”

android:layout_weight=“1”

android:text=“SubActivity1” />

<Button

android:id=“@+id/button2”

android:layout_weight=“1”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”

android:text=“SubActivity2” />

</LinearLayout>

– Tại MainActivity: Khi chọn nút SubActivity1, chương trình sẽ mở SubActivity với dạng Dialog như hình bên dưới:

6_Life_cycle_3

– Khi màn hình SubActivity1 hiển thị lên như trên, nếu chọn “Trở về MainActivity”, ứng dụng sẽ đóng SubActivity1.

– Bạn xem cấu hình AndroidManifest.xml để cho phép SubActivity1 hiển thị dưới dạng Dialog:

<?xml version=”1.0″ encoding=”utf-8″?>
<manifest xmlns:android=”http://schemas.android.com/apk/res/android
package=”tranduythanh.com”
android:versionCode=”1″
android:versionName=”1.0″ >

<uses-sdk
android:minSdkVersion=”14″
android:targetSdkVersion=”17″ />

<application
android:allowBackup=”true”
android:icon=”@drawable/ic_launcher”
android:label=”@string/app_name”
android:theme=”@style/AppTheme” >
<activity
android:name=”tranduythanh.com.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=”tranduythanh.com.SubActivity1
android:label=”@string/title_activity_sub_activity1″
android:theme=”@android:style/Theme.Dialog”>
</activity>
<activity
android:name=”tranduythanh.com.SubActivity2″
android:label=”@string/title_activity_sub_activity2″ >
</activity>
</application>

</manifest>

– Bạn xem code xử lý nút “SubActivity1” và “SubActivity2” trong class MainActivity:

package tranduythanh.com;

import android.os.Bundle;

import android.app.Activity;

import android.content.Intent;

import android.view.View;

import android.widget.Button;

import android.widget.Toast;

public class MainActivity extends Activity {

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

Button btn1=(Button) findViewById(R.id.button1);

btn1.setOnClickListener(new View.OnClickListener() {

public void onClick(View arg0) {

Intent intent=new Intent(MainActivity.this,

SubActivity1.class);

startActivity(intent);

}

});

Button btn2=(Button) findViewById(R.id.button2);

btn2.setOnClickListener(new View.OnClickListener() {

public void onClick(View arg0) {

Intent intent=new Intent(MainActivity.this,

SubActivity2.class);

startActivity(intent);

}

});

}

}

–          Phương thức findViewById để trả về View theo đúng Id truyền vào, mọi Control trong Android đều kế thừa từ View, ở đây ta ép kiểu về cho đúng kiểu Button.

–          Dùng phương thức startActivity để mở một Activity, chú ý là Activity này được đưa vào một Intent với cách khai báo như trên.

–          Cách chạy SubActivity1SubActivity2 là hoàn toàn giống nhau. Chỉ khác nhau ở lúc hiển thị lên màn hình điện thoại (như đã giải thích ở trên).

–          Ta sẽ học rõ hơn về Intent trong phần sau, tạm thời phần này chưa cần phải hiểu sâu về nó. Chỉ cần biết rằng để chạy 1 Activity nào đó thì phải tiến hành như vậy.

*** Tiếp tục làm việc với class MainActivity:

Bạn tạo Override thêm một số hàm : onResume, onPause, onStop, onDestroy…:

@Override

protected void onResume() {

super.onResume();

Toast.makeText

(this, “onResume”, Toast.LENGTH_LONG)

.show();

}

@Override

protected void onPause() {

super.onPause();

Toast.makeText

(this, “onPause”, Toast.LENGTH_LONG)

.show();

}

@Override

protected void onStop() {

super.onStop();

Toast.makeText

(this, “onStop”, Toast.LENGTH_LONG)

.show();

}

@Override

protected void onDestroy() {

super.onDestroy();

Toast.makeText

(this, “onDestroy”, Toast.LENGTH_LONG)

.show();

}

– Bạn thiết kế SubActivity1 sao cho giống như hình . Bạn cần lưu ý là mỗi khi chúng ta tạo mới 1 Activity thì nó sẽ tự động tạo ra 1 Layout cho nó luôn:

+ 1 – Bấm chuột phải vào Project / chọn New / chọn Other

6_Life_cycle_4

+ 2 – sau khi bấm Other thì màn hình New được hiển thị lên, tại màn hình này bạn chọn Android Activity rồi bấm next:

6_Life_cycle_5

+3 – tiếp tục bấm Next cho tới màn hình bên dưới, trong màn hình này bạn đặt tên Activity mà bạn mong muốn, để ý là bên dưới tên Activity sẽ cho phép bạn đặt tên Layout cho Activity này, thông thường tên Layout sẽ đi kèm với tên Activity do đó bạn không cần thiết phải đổi tên Layout:

6_Life_cycle_6

+ 4- bấm Finish, và quan sát ứng dụng sẽ xuất hiện Activity và Layout cho bạn. Bây giờ bạn tha hồ thiết kế.

Trong ví dụ của Tôi thì bạn chỉ cần kéo 1 Button vào Layout của SubActivity1

Bạn đặt tên Button trong SubActivity1 là btntrove, để cho giống với Code trở về MainActivity dưới này:

package tranduythanh.com;

import android.os.Bundle;

import android.app.Activity;

import android.view.View;

import android.widget.Button;

public class SubActivity1 extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_sub_activity1);

Button btn=(Button) findViewById(R.id.btntrove);

btn.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View arg0) {

finish();

}

});

}

}

– Bạn thấy trong SubActivity1 Tôi gọi hàm finish() khi chọn “Trở về MainActivity”. Công dụng của hàm  finish() là tắt màn hình hiện tại–> như vậy nó tự động mở MainActivity vì theo cơ chế Activities Stack.

– Bây giờ bạn thực thi chương trình và làm các thao tác sau:

1) Chọn nút SubActivity1 để mở Activity này lên, quan sát hiện tượng sảy ra (chú ý những hàm nào được gọi)

2) Khi chọn nút “Trở về MainActivity”, quan sát hiện tượng sảy ra (chú ý những hàm nào được gọi)

3) Chọn nút SubActivity2 để mở Activity này lên, quan sát hiện tượng sảy ra (chú ý những hàm nào được gọi)

4) nhấn nút “Back” của điện thoại, quan sát hiện tượng (chú ý những hàm nào được gọi)

*** Tới đây Tôi sẽ không giải thích thứ tự các hàm sảy ra như thế nào, mà để dành cho các bạn tự giải thích. Bạn sẽ thấy rõ sự khác biệt trong 2 trường hợp này. Và dĩ nhiên bạn sẽ tự động hiểu được Foreground Lifetime và Visible Lifetime

Các bạn có thể tải coding mẫu ở đây:http://www.mediafire.com/download/7ra8h7vyttkjq6u/LearnAndroidLifetime.rar

Trong bài tập kế tiếp Tôi sẽ hướng dẫn  các bạn cách sử dụng XML Layout và một số control căn bản thường dùng cũng như các kiểu lập trình sự kiện.

Chúc các bạn thành công.

32 responses

  1. Em chào thầy. Bài viết qua đó thầy.

  2. Cám ơn thầy về bài viết

  3. […] Bạn phải nhớ lại vòng đời của một ứng dụng Android ở bài tập 5 và bài tập 6 để làm ví dụ này tốt […]

  4. Thầy ơi. Bài này em không rõ lắm. Vì em mới bắt đầu học android mà. Cái phần onResum,onPause,onStop,Ondetroy ấy ạ. Tiếp tục làm với Activity cứ báo lỗi ạ

    1. Dương Ý Nguyện | Reply

      Khi làm bạn thấy lỗi thì cứ Clean Project lại, nhiều khi cái Eclipse bị “tưng tưng” như thầy nói đó.
      Lúc đầu mình làm cũng gặp mấy trường hợp đó, không biết đã làm sai chỗ nào nên nản luôn :v

      1. Dùng android studio ít bị lỗi tưng tưng hơn Eclipse đấy bạn 😉

      2. Android studio đây mà cũng bị lỗi. Mà soft này nặng thật. Build toàn đơ đơ.

  5. […] Bạn phải nhớ lại vòng đời của một ứng dụng Android ở bài tập 5 và bài tập 6 để làm ví dụ này tốt […]

  6. […] Bạn phải nhớ lại vòng đời của một ứng dụng Android ở bài tập 5 và bài tập 6 để làm ví dụ này tốt […]

  7. […] tại vì sao???? sẽ bị 0 điểm lý do là Tôi đã giải thích rõ ở bài tập 5 và bài tập 6 rồi. Bạn tự xem […]

  8. bài viết rất hữu ích em cám ơn thầy

  9. Cản ơn thầy rất nhiều bài viết của thầy rất hay

  10. Bài viết rất chi tiết. Thanks

  11. Thank ! Bài viết rất bổ ích.

  12. Thầy ơi e làm như thầy nhưng khi gọi SubActivity1 dưới dạng dialog thì không được và luôn báo lỗi thế này : “You need to use a Theme.AppCompat”

  13. thầy cho e hỏi tại sao e thêm đoạn code này vào AndroidManifest.xml. thì nó lại báo lỗi ơ android:name=”minhquang.com.SubActivity1“. Lỗi nó báo là : “Open quote is expected for attribute “{1}” associated with an element type “android:name”.”. xin thầy giúp đỡ. :((

  14. Mình làm tất cả đều chạy ổn. Riêng việc cho SubActivity1 mở kiểu Dialog thì khi nhấn nút nó báo lỗi và buộc dừng chương trình. Có bạn nào biết tại sao không ?

    1. Check AndroidManifiest.xml xem có add theme dialog cho SubActivity1 chưa?

    2. Chào bạn, mình cũng gặp vấn đề tương tự.
      Chắc bạn đang cài trên Android skd version 19.

      Bạn xem trong các file MainActive.java ; Sub1.Java; sub2.Java.
      (trong thư mục SRC), các class này kế thừa từ: ActionBarActivity
      ————————————–
      public class ……. extends ActionBarActivity
      ————————————–

      Bạn sửa lại thành:
      ———————————————————–
      public class ….. extends Activity
      ———————————————————–

      Và import thêm thư viên: import android.app.Activity;

      Sửa cho cả sub1, sub 2 như thế nhé.

      Nguyên nhân theo như mình hiểu, thì do Theme.Dialog không có trong “ActionBarActivity” , nên báo lỗi.
      Do đó phải sử dụng: “Activity “

    3. Thanks nhân.
      Nhờ cậu mà mình đã chạy được.
      >:D<

  15. Thưa thầy, em tạo SubActivity 1 và 2 rồi,nhưng cả 2 và MainActivity.java đều xuất hiện dâu thang ở đầu hết.
    Em copy đoạn code của thầy ở đoạn onRuseum, on Pause….thì nó hiện lỗi là “Toast cannot be resolved”.
    Ngay cả lúc em chọn chèn code ở Source/Override-Implement Methods thì nó chỉ hiện ra 2 dòng của mỗi loại (onRuseum, onPause…) là
    “protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();”
    Em chưa hiểu lắm, mong thầy giải đáp giúp em. Em cám ơn

    1. Theo mình thì b xem thử mấy cái thư viện này:
      import android.os.Build;
      import android.support.v7.app.ActionBarActivity;
      import android.support.v7.app.ActionBar;

      nó báo dấu thang vì mình chưa cần xài tới nên nó thông báo cảnh báo thôi.
      Muốn hết thì bỏ nó đi.

  16. […] Bạn phải nhớ lại vòng đời của một ứng dụng Android ở bài tập 5 và bài tập 6 để làm ví dụ này tốt […]

  17. […] do là Tôi đã giải thích rõ ở bài tập 5và bài tập 6 rồi. Bạn tự xem […]

  18. […] tại vì sao???? sẽ bị 0 điểm lý do là Tôi đã giải thích rõ ở bài tập 5và bài tập 6 rồi. Bạn tự xem […]

  19. […] Bạn phải nhớ lại vòng đời của một ứng dụng Android ở bài tập 5 và bài tập 6 để làm ví dụ này tốt […]

  20. Thưa thầy cho em hỏi làm sao để biết HÀM nào được gọi? Em chạy rồi nhưng không thấy nó ở đâu hết. Cảm ơn thầy!

  21. Bài viết hay quá, Cảm ơn thầy!

  22. Cảm ơn rất nhiều Thầy rất dể hiểu. Hi vọng Thầy luôn có sức khỏe để úp bài Dạy tụi em dài dài.

  23. mọi người cho mình hòi trong một project có bao nhiêu file manifest vậy mình tạo đề án sau đó add thêm 2 activity thì nhìn lại có tới 2 file manifest. nhưng không biết viết bên nào.

    1. Hi em. Trong 1 Project chỉ có duy nhất 1 Manifest thôi (không quan tâm số lượng Activity).

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: