[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:
– 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:
đâ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:
– 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 SubActivity1 và SubActivity2 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 …
+ 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:
+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:
+ 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.