Android blog: Activity

Giới thiệu

Activity là một thành phần ứng dụng cung cấp một màn hình mà người dùng có thể tương tác. Mỗi Activity trong ứng dụng được chạy trong một cửa sổ là nơi để hiển thị giao diện của nó. Cửa sổ này thường lấp đầy màn hình, nhưng có thể nhỏ hơn màn hình và nổi bên trên các cửa sổ khác.

Activity lifecycle

Ứng dụng thường bao gồm nhiều Activity được liên kết với nhau. Một Activity sẽ được quy định là Activity “chính”, nó được hiển thị ngay khi khởi chạy ứng dụng lần đầu, và các Activity khác có thể được tạo và chạy sau đó. Khi Activity mới bắt đầu, Activity trước đó sẽ bị dừng lại, nhưng hệ thống vẫn giữ nguyên Activity đó trong một ngăn xếp (“back stack”). Khi người dùng kết thúc Activity hiện tại và nhấn nút “Back”, nó sẽ được đẩy ra khỏi ngăn xếp (và bị hủy) và Activity trước đó sẽ tiếp tục hoạt động.

Khi một Activity bị dừng vì một Activity mới bắt đầu, nó được thông báo về sự thay đổi trạng thái này qua các phương thức trong vòng đời của Activity (Activity lifecycle). Hình dưới là mô tả đầy đủ về vòng đời của Activity.

Activity lifecycle
Activity lifecycle

Tạo một Activity mới

Activity cũng là một class java. Tuy nhiên nó thừa kế class Activity của Android. Cụ thể, bạn hãy mở lại project TextViewDemo trong bài blog trước. Class MainActivity là một ví dụ về Activity trong Android.

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Thiết lập giao diện người dùng trong file layout activity_main và đặt nó vào MainActivity.
        setContentView(R.layout.activity_main);

        // Thay đổi TextView khi ứng dụng đang chạy.
        TextView tvDemo = (TextView) findViewById(R.id.tvDemo); // Xác định đối tượng TextView sẽ thực hiện thay đổi.
        tvDemo.setText("Text content has been changed."); // Thay đổi nội dung text.
        tvDemo.setTextColor(Color.BLACK); // Thay đổi màu chữ.
        tvDemo.setBackgroundColor(Color.YELLOW); // Thay đổi màu background.
    }

    public void onClickButton(View view) {
        Toast.makeText(this, "Clicked", Toast.LENGTH_SHORT).show();
    }
}

Ở đây class MainActivity thừa kế class AppCompatActivity. AppCompatActivity thừa kế từ class Activity trong Android. Vì vậy MainActivity vẫn được coi là một Activity.

Xem lại vòng đời của Activity bạn sẽ thấy khi Activity khởi chạy nó sẽ chạy qua hàm onCreate. Tại đây chúng ta sẽ định nghĩa giao diện cho Activity (setContentView). Toàn bộ giao diện người dùng hiển thị trong Activity này được thiết kế trong file layout activity_main. Bạn có thể tham khảo lại các bài blog trước để tự thiết kế một giao diện tương ứng mỗi chức năng trong ứng dụng của bạn.

Sau khi đã tạo được một Activity mới bạn phải khai báo nó trong file AndroidManifest.xml. Việc này vô cùng quan trọng. Trường hợp bạn không khai báo, bạn không thể sử dụng được Activity đó. Khi khởi chạy Activity chưa khai báo, ứng dụng sẽ ngay lập tức bị dừng lại (crash). Hãy khai báo Activity trong AndroidManifest.xml như sau:

<manifest ...>
    <application ...>
        <activity android:name=".MainActivity">
            ...
        </activity>
    </application>
</manifest>

Trong phần khai báo MainActivity bạn sẽ thấy nó được định nghĩa thêm bộ lọc:

<activity android:name=".MainActivity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

Như đã nói ở phần đầu, một ứng dụng sẽ có một Activity “chính”, và MainActivity đã được định nghĩa là Activity chính thông qua bộ lọc intent-filter khai báo như trên. Activity này sẽ được khởi chạy ngay khi mở ứng dụng.

Điều khiển Activity

Bây giờ bạn đã biết cách tạo một Activity. Hãy tạo một Activity mới, đặt tên là SecondActivity, không cần định nghĩa bộ lọc khi khai báo trong AndroidManifest.xml. setContentView cho SecondActivity là activity_second. Trong layout đó bạn hãy hiển thị dòng chữ “Đây là SecondActivity”. (Bạn có thể tham khảo code demo của tôi phía dưới).

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Thiết lập giao diện trong file layout activity_second.
        setContentView(R.layout.activity_second);
    }
}
<manifest ...>

    <application ...>
        ...
        <activity android:name=".SecondActivity" />
    </application>

</manifest>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="@dimen/activity_vertical_margin"
        android:gravity="center"
        android:text="Đây là SecondActivity"
        android:textColor="@android:color/holo_red_light"
        android:textSize="20sp"
        android:textStyle="bold" />

</RelativeLayout>

Đã xong phần tạo SecondActivity mới. Bạn sẽ thực hiện khởi chạy Activity này từ MainActivity bằng cách bấm vào Button trong MainActivity. Hãy thêm vào hàm onClickButton trong MainActivity như sau:

public void onClickButton(View view) {
    Toast.makeText(this, "Clicked", Toast.LENGTH_SHORT).show();
    Intent secondActivityIntent = new Intent(this, SecondActivity.class);
    startActivity(secondActivityIntent);
}

Chạy ứng dụng và bấm vào nút “CLICK ME” bạn sẽ thấy SecondActivity được khởi chạy và kết quả là:

SecondActivity
SecondActivity

Bấm vào nút Back trên thiết bị Android, bạn sẽ thấy ứng dụng huỷ đi SecondActivity và hiển thị lại MainActivity như trước đó.

Vậy là bạn đã biết cách khởi chạy một Activity mới rồi đó.

Trường hợp bạn muốn tắt một Activity thì sao? Rất đơn giản, trong Activity bạn muốn tắt chỉ cần gọi hàm finish() là xong. Giả sử bạn muốn tắt MainActivity khi bấm vào nút “CLICK ME”. Bạn chỉ cần sửa lại hàm onClickButton như sau:

public void onClickButton(View view) {
    Toast.makeText(this, "Clicked", Toast.LENGTH_SHORT).show();
    // Kết thúc Activity.
    finish();
}

Chạy ứng dụng và bấm vào nút “CLICK ME” xem. Bạn sẽ thấy MainActivity được tắt đi. Bình thường ứng dụng sẽ hiển thị lại Activity nào chạy trước MainActivity. Tuy nhiên, MainActivity là Activity khởi chạy đầu tiên khi ta mở ứng dụng vì thế trong trường hợp này chúng ta đã thoát khỏi ứng dụng.

Kết luận

Trên đây tôi đã giới thiệu cho các bạn những điều cơ bản nhất về Activity trong Android. Hãy ghi nhớ để ứng dụng trong dự án của riêng mình, đặc biệt liên quan đến Activity lifecycle. Nó sẽ rất hữu ích trong việc xử lý từng Activity trong ứng dụng của bạn đó.
Chúc các bạn vui vẻ!

Tags:

Add a Comment

Scroll Up