Làm sao để gửi dữ liệu sang BroadcastReciver với AlarmManager?

Chào mọi người em có 2 class
MainActivity

package com.example.reminder;

import androidx.appcompat.app.AppCompatActivity;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.TimePicker;

import java.util.Calendar;

public class MainActivity extends AppCompatActivity {
    Calendar calendar;
    TimePicker timePicker;
    PendingIntent pendingIntent;
    AlarmManager alarmManager;
    Button btnSetTime;
    TextView textView;
    EditText editText;
    public static final String CONTENT = "CONTENT";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btnSetTime = findViewById(R.id.btnSetTime);
        textView = findViewById(R.id.textView);
        editText = findViewById(R.id.editText);
        calendar = Calendar.getInstance();
        alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
        timePicker = findViewById(R.id.timePicker);
        btnSetTime.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, Alarm.class);
                calendar.set(Calendar.HOUR_OF_DAY, timePicker.getCurrentHour());
                calendar.set(Calendar.MINUTE, timePicker.getCurrentMinute());
                String contentText = editText.getText().toString();
                intent.putExtra(CONTENT, contentText);
                sendBroadcast(intent);
                int gio = timePicker.getCurrentHour();
                int phut = timePicker.getCurrentMinute();
                textView.setText("Gio ban dat la " + gio + " :" + phut);
                pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
                alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
            }
        });

    }
}

và class Alarm

package com.example.reminder;

import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Build;

import androidx.core.app.NotificationCompat;

public class Alarm extends BroadcastReceiver {
    public static final String CHANNEL_1_ID = "channel1";
    public static final String CHANNEL_2_ID = "channel2";
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        String getContent = intent.getStringExtra(MainActivity.CONTENT);
        creatNotificationChannel(context);
        creatNotification(getContent, context);
    }
    private void creatNotificationChannel(Context context) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationChannel channel1 = new NotificationChannel(
                    CHANNEL_1_ID,
                    "Channel 1",
                    NotificationManager.IMPORTANCE_HIGH
            );
            channel1.setDescription("This is channel 1");

            NotificationChannel channel2 = new NotificationChannel(
                    CHANNEL_2_ID,
                    "Channel 2",
                    NotificationManager.IMPORTANCE_LOW
            );
            channel1.setDescription("This is channel 2");
            NotificationManager manager = context.getSystemService(NotificationManager.class);
            manager.createNotificationChannel(channel1);
            manager.createNotificationChannel(channel2);
        }
    }
    private void creatNotification(String s, Context context){
        NotificationCompat.Builder builder = new NotificationCompat.Builder(context, CHANNEL_1_ID)
                .setSmallIcon(R.drawable.ic_launcher_background)
                .setContentTitle("Hello")
                .setContentText(s)
                .setPriority(NotificationCompat.PRIORITY_DEFAULT);
        NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        notificationManager.notify(0, builder.build());
    }
}

Em muốn gửi cái dữ liệu ở cái EditText nhập vào ở class MainActivity và gắn cái dữ liệu mình nhập đó vào nội dung thông báo ở class Alarm nhưng mà nó lại bị cái là khi em ấn vào button btnSetTime để hẹn giờ hiển thị thông báo thì nó hiển thị luôn thông báo mà không đợi đến khi đến đúng giờ mình hẹn nó mới hiện ạ.Có ai giúp em vấn đề này với không ạ?

Bạn đã ấn định thời gian đúng chưa? Nếu tính toán mà sai, thời gian tính bằng mili-giây nhỏ hơn thời gian hiện tại thì nó hiện luôn là phải rồi.
Giờ bạn thử cộng thêm thôi. Lấy thời gian hện tại cộng thêm vài giây.

alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMilis() + 5000 , pendingIntent); // sau 5 giây

Ơ kìa, sao lại có dòng sendBroadcast(intent); luôn vậy?

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?