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,SerializableBundlecho 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"