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

[polldaddy poll=9764234]

Để 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 thoughts on “Bài tập 6: Phân biệt Foreground Lifetime và Visible Lifetime”

  1. 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. 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

  2. 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 đỡ. :((

  3. 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. 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 “

  4. 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.

  5. 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!

  6. 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.

  7. 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.

Leave a Reply

Your email address will not be published.