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

Gửi tham số từ thông báo đến Activity Android

Giới thiệu

Ví dụ này minh họa cách truyền dữ liệu (parameters) từ thông báo đến Activity khi người dùng nhấn vào thông báo. Sử dụng Intent.putExtra() và xử lý trong onNewIntent() của Activity.

Các bước thực hiện

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

Tạo project Android Studio mới.

Bước 2: Layout với TextView hiển thị dữ liệu (res/layout/activity_main.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=".MainActivity">

    <TextView
        android:id="@+id/tvNotify"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_above="@id/btnNotify"
        android:layout_margin="16dp"
        android:text="Chờ thông báo..."
        android:textSize="16sp" />

    <Button
        android:id="@+id/btnNotify"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:layout_margin="16dp"
        android:onClick="createNotification"
        android:text="Tạo thông báo có tham số" />

</RelativeLayout>

Bước 3: MainActivity xử lý Intent (src/MainActivity.java)

package app.tutorialspoint.com.notifyme;

import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.NotificationCompat;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    public static final String NOTIFICATION_CHANNEL_ID = "10001";
    private final static String default_notification_channel_id = "default";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // Xử lý Intent khi Activity lần đầu tạo
        onNewIntent(getIntent());
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        // XỬ LÝ DỮ LIỆU TỪ THÔNG BÁO
        Bundle extras = intent.getExtras();
        if (extras != null) {
            if (extras.containsKey("NotificationMessage")) {
                String msg = extras.getString("NotificationMessage");
                TextView tvNotify = findViewById(R.id.tvNotify);
                tvNotify.setText("Nhận từ Notification: " + msg);
            }
        }
    }

    public void createNotification(View view) {
        Intent notificationIntent = new Intent(MainActivity.this, MainActivity.class);
        // TRUYỀN THAM SỐ QUAN TRỌNG
        notificationIntent.putExtra("NotificationMessage", "Tôi đến từ Notification");
        notificationIntent.addCategory(Intent.CATEGORY_LAUNCHER);
        notificationIntent.setAction(Intent.ACTION_MAIN);
        notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);

        PendingIntent resultIntent = PendingIntent.getActivity(
            MainActivity.this, 0, notificationIntent, PendingIntent.FLAG_IMMUTABLE);

        NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
            MainActivity.this, default_notification_channel_id)
            .setSmallIcon(R.drawable.ic_launcher_foreground)
            .setContentTitle("Test Tham Số")
            .setContentText("Nhấn để xem tham số truyền qua")
            .setContentIntent(resultIntent)
            .setAutoCancel(true);

        NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
            int importance = NotificationManager.IMPORTANCE_HIGH;
            NotificationChannel notificationChannel = new NotificationChannel(
                NOTIFICATION_CHANNEL_ID, "NOTIFICATION_CHANNEL_NAME", importance);
            mBuilder.setChannelId(NOTIFICATION_CHANNEL_ID);
            assert mNotificationManager != null;
            mNotificationManager.createNotificationChannel(notificationChannel);
        }

        assert mNotificationManager != null;
        mNotificationManager.notify((int) System.currentTimeMillis(), mBuilder.build());
    }
}

Bước 4: AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
    package="app.tutorialspoint.com.notifyme">

    <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=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>
</manifest>

Giải thích cơ chế

Thành phần Vai trò
Intent.putExtra() Gắn dữ liệu (key-value) vào Intent
PendingIntent.getActivity() Bọc Intent để hệ thống thực thi sau
FLAG_ACTIVITY_SINGLE_TOP Không tạo instance mới nếu Activity đã ở top
onNewIntent() Nhận Intent mới khi Activity đã chạy (singleTop)

Các kiểu dữ liệu hỗ trợ

  • Primitive: putExtra(String, int/boolean/long/float...)
  • String, Parcelable, Serializable
  • Bundle cho dữ liệu phức tạp
  • Mảng: putExtra(String, int[]), String[], v.v.

Chạy thử nghiệm

Chạy app → Nhấn "Tạo thông báo có tham số" → Vuốt thanh thông báo → Nhấn vào thông báo → TextView sẽ hiển thị: "Nhận từ Notification: Tôi đến từ Notification"