Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Android

Đưa Activity lên foreground (đỉnh back stack) trên Android

Giới thiệu

Ví dụ này minh họa cách đưa một Activity đã tồn tại trong back stack lên foreground (trở thành activity trên cùng) thay vì tạo instance mới, sử dụng flag Intent.FLAG_ACTIVITY_REORDER_TO_FRONT.

Bước 1: Tạo dự án mới

Tạo project Android Studio: File → New Project.

Bước 2: Layout MainActivity (res/layout/activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:app="https://schemas.android.com/apk/res-auto"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

Bước 3: MainActivity - Khởi động MyActivity với flag REORDER_TO_FRONT

import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Intent i = new Intent(this, MyActivity.class);
        i.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
        startActivity(i);
    }
}

Bước 4: Tạo MyActivity (MyActivity.java)

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;

public class MyActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my_acitivity);
    }
}

Bước 5: Layout MyActivity (activity_myacitivity.xml)

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

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="MYACTIVITY"
        android:layout_centerInParent="true"
        android:textAlignment="center"
        android:textSize="24sp"
        android:textStyle="bold"/>

</RelativeLayout>

Bước 6: Manifest - Khai báo cả 2 Activity

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android" package="app.com.sample">
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MyActivity"></activity>
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

Chạy ứng dụng

App khởi động MainActivity, ngay lập tức start MyActivity với flag REORDER_TO_FRONT. Nếu MyActivity đã có trong stack, nó sẽ được kéo lên trên cùng. Thử bấm Home, mở lại app từ launcher sẽ thấy MyActivity (không phải MainActivity).

Các flag liên quan khác

  • FLAG_ACTIVITY_SINGLE_TOP: Không tạo mới nếu activity đã ở đỉnh stack.
  • FLAG_ACTIVITY_CLEAR_TOP: Xóa các activity trên đỉnh, đưa activity đích lên top.
  • FLAG_ACTIVITY_NEW_TASK: Khởi động trong task mới.