【问题标题】:Creating an alarm in android to fire at a particular date and time在android中创建警报以在特定日期和时间触发
【发布时间】:2022-06-16 22:39:26
【问题描述】:

实际上,我在创建应用程序时得到了一些。在这个应用程序中,我想在用户已经选择的特定日期和时间向用户发送通知。为此,我使用了警报管理器类并创建了一个单独的广播接收器类,但广播接收器没有触发。 这是我的主要活动代码

package com.yashwanth.android.rememberme;

import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.DialogFragment;
import androidx.recyclerview.widget.RecyclerView;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.TextView;

import com.google.android.material.floatingactionbutton.FloatingActionButton;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.LinkedList;
import java.util.Locale;

public class note_detail extends AppCompatActivity {
    private EditText note;
    private TextView time;
    private FloatingActionButton timeButton;
    private CheckBox checkToday;
    private TextView date;
    private FloatingActionButton dateButton;
    private AlarmManager alarmManager;
    public static Calendar calendar;
    public static int notificationId = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_note_detail);
        note = findViewById(R.id.note);
        time = findViewById(R.id._time);
        timeButton = findViewById(R.id.time_button);
        date = findViewById(R.id._date);
        dateButton = findViewById(R.id.date_button);
        alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
        calendar = Calendar.getInstance();

        timeButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DialogFragment timeDialog = new timePickerFragment(time);
                timeDialog.show(getSupportFragmentManager(),"Time Picker");
            }
        });
        dateButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DialogFragment dateDialog = new datePickerFragment(date);
                dateDialog.show(getSupportFragmentManager(),"Date Picker");
            }
        });
        checkToday = findViewById(R.id.today);
        if(checkToday.isChecked()){
            Calendar c = Calendar.getInstance();
            String mDate = ""+c.get(Calendar.DAY_OF_MONTH)+"/"+c.get(Calendar.MONTH)+"/"+c.get(Calendar.YEAR);
            Log.d("date", ""+mDate);
            date.setText(mDate);

        }
        checkToday.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(checkToday.isChecked()){
                    Calendar c = Calendar.getInstance();
                    String mDate = ""+c.get(Calendar.DAY_OF_MONTH)+"/"+c.get(Calendar.MONTH)+"/"+c.get(Calendar.YEAR);
                    Log.d("date", ""+mDate);
                    date.setText(mDate);

                }
                else{
                    date.setText("");
                    date.setVisibility(View.VISIBLE);
                    dateButton.setVisibility(View.VISIBLE);
                }
            }
        });

    }

    public void log(View view) {
        //Setting pending intent to send alarm at a particular time
        Intent i = new Intent(this,AlarmReceiver.class);
        PendingIntent pi = PendingIntent.getBroadcast(this,notificationId,i,PendingIntent.FLAG_UPDATE_CURRENT);
        alarmManager.set(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(),pi);
        SimpleDateFormat simpleTimeFormat = new SimpleDateFormat("yy MM dd hh:mm a", Locale.getDefault());
        String timel = simpleTimeFormat.format(calendar.getTimeInMillis());
        Log.d("alarm", " "+timel);
        notificationId++;
        // creating intent and sending data to the main activity to display this list as notes
        MainActivity.data.addLast(new word(note.getText().toString(),time.getText().toString(),date.getText().toString()));
        MainActivity.mRecyclerView.getAdapter().notifyDataSetChanged();
        MainActivity.mRecyclerView.smoothScrollToPosition(MainActivity.data.size());
        Intent intent = new Intent(this,MainActivity.class);
        startActivity(intent);
    }
}

这是广播接收器类

package com.yashwanth.android.rememberme;

import android.app.AlarmManager;
import android.app.NotificationManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

import androidx.core.app.NotificationCompat;

import static android.content.Context.NOTIFICATION_SERVICE;

public class AlarmReceiver extends BroadcastReceiver {
    private String remember = "Have you forgotten rose";

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d("alarm", "alarm broadcast recived and building the notification");
        NotificationManager notificationManager = (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE);
        NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
        builder.setSmallIcon(R.drawable.bulb)
                .setContentTitle("Have you forgotten")
                .setContentText(remember)
                .setPriority(NotificationCompat.PRIORITY_HIGH)
                .setAutoCancel(true)
                .setDefaults(NotificationCompat.DEFAULT_ALL);
        notificationManager.notify(note_detail.notificationId,builder.build());
    }
}

我给出的日期是绝对正确的,因为我通过打印日期日志进行了检查。但我没有收到通知。而且我观察到警报接收器类在用户给出的时间根本没有触发。任何人都可以更正我的代码并帮助推进这个应用程序。 提前感谢您的帮助。

【问题讨论】:

    标签: java android broadcastreceiver alarmmanager android-alarms


    【解决方案1】:

    您是否在清单文件中注册了警报接收器?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-22
      相关资源
      最近更新 更多