在特定的日期和时间生成通知。

问题描述 投票:0回答:1

我正在尝试创建一个待办事项应用程序,用户可以为他们的任务设置日期和时间。一旦用户定义了他的任务并退出了应用程序,用户应该从应用程序中得到关于他在应用程序中定义的任务的通知。以下是我试过的片段。

todocreate.java

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_todo_create);
        getSupportActionBar().setTitle("ToDoList Create");

        myToDoHelper = new myDBHelper(todo_create.this);


        titleText = (EditText)findViewById(R.id.getTitle);
        dateText = (EditText)findViewById(R.id.getDate);
        timeText = (EditText)findViewById(R.id.getTime);

        pickDate = (Button)findViewById(R.id.pickDate);
        pickTime = (Button)findViewById(R.id.pickTime);

        c = Calendar.getInstance();
        pickDate.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                mDay = c.get(Calendar.DAY_OF_MONTH);
                mMonth = c.get(Calendar.MONTH);
                mYear = c.get(Calendar.YEAR);
                DatePickerDialog datePickerDialog = new DatePickerDialog(todo_create.this, new DatePickerDialog.OnDateSetListener() {
                    @Override
                    public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
                        dateText.setText(dayOfMonth +"-"+(month+1)+"-"+year);
                        c.set(Calendar.DAY_OF_MONTH,dayOfMonth);
                        c.set(Calendar.MONTH,month+1);
                        c.set(Calendar.YEAR,year);
                    }
                }, mYear, mMonth, mDay);
                datePickerDialog.show();
            }
        });

        pickTime.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                mHour = c.get(Calendar.HOUR_OF_DAY);
                mMinute = c.get(Calendar.MINUTE);
                TimePickerDialog timePickerDialog = new TimePickerDialog(todo_create.this, new TimePickerDialog.OnTimeSetListener() {
                    @Override
                    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
                        timeText.setText(hourOfDay +":"+minute);
                        c.set(Calendar.HOUR_OF_DAY,hourOfDay);
                        c.set(Calendar.MINUTE,minute);
                        c.set(Calendar.SECOND,0);
                        c.set(Calendar.MILLISECOND,0);
                    }
                }, mHour, mMinute, false);
                timePickerDialog.show();
            }
        });
    }

    //function to save todo task with alarm manager
    public void saveToDo(String todoTaskInput, String todoDateInput, String todoTimeInput){
        //createNotification(todoTaskInput);
        boolean isInserted = myToDoHelper.createToDo(todoTaskInput, todoDateInput,todoTimeInput);
        if(isInserted == true){
            AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
            Intent alarmShowIntent = new Intent(this, BroadcastReceiver.class);
            alarmShowIntent.putExtra("TodoTitle",todoTaskInput);
            PendingIntent pendingIntent = PendingIntent.getBroadcast(this,0,alarmShowIntent,0);
            Calendar c1 = Calendar.getInstance();
            long currentTime = c1.getTimeInMillis();
            alarmManager.set(AlarmManager.RTC_WAKEUP,c.getTimeInMillis()-currentTime,pendingIntent);
            Toast.makeText(getApplicationContext(),"ToDo Item created successfully",Toast.LENGTH_LONG).show();
        }else {
            Toast.makeText(getApplicationContext(),"Error occured ! Please try again after sometime",Toast.LENGTH_LONG).show();
        }
        this.finish();
    }

BroadcastManager.java

package com.example.mytodoapp;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.media.Ringtone;
import android.media.RingtoneManager;
import android.net.Uri;

import androidx.core.app.NotificationCompat;
import androidx.core.app.NotificationManagerCompat;

import java.io.Console;

public class BroadcastManager extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        createNotification(context,intent,"myToDo App",intent.getStringExtra("TodoTitle"));
    }

    public void createNotification(Context context,Intent intent,CharSequence ticker, CharSequence title){
        //Intent intent = new Intent(this,todo_home.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK);
        PendingIntent pendingIntent = PendingIntent.getActivity(context,0,intent,0);

        NotificationCompat.Builder builder = new NotificationCompat.Builder(context,"todoAppChannel");
        builder.setSmallIcon(R.drawable.ic_note_add_black_24dp);
        builder.setContentTitle("todo App");
        builder.setContentText(title);
        builder.setPriority(NotificationCompat.PRIORITY_DEFAULT);
        builder.setContentIntent(pendingIntent);
        builder.setAutoCancel(true);

        NotificationManagerCompat notificationManagerCompat = NotificationManagerCompat.from(context);
        notificationManagerCompat.notify(200,builder.build());
    }
}

首页.java创建了以下方法,在应用程序加载时创建通知通道。

public void createNotificationChannel(){
        if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O){
            CharSequence name = "todoAppChannel";
            String description = "temp";
            int importance = NotificationManager.IMPORTANCE_HIGH;
            NotificationChannel channel = new NotificationChannel("todoAppChannel",name,importance);
            channel.setDescription(description);
            NotificationManager manager = getSystemService(NotificationManager.class);
            manager.createNotificationChannel(channel);
        }
    }

AndroidManifest.xml文件中更新了以下一行。

<receiver android:name=".BroadcastManager"/>

我可以在点击按钮时生成通知,但不能在特定时间特定日期生成通知。但是,我无法在特定时间生成特定日期的通知。这可能是什么问题。

android android-notifications alarmmanager
1个回答
0
投票

你忘了为你的接收器添加意图过滤器(如果我错了,请纠正我)。

 <receiver
     android:name="BroadcastManager">
     <intent-filter>
         <action android:name="ALARM" />
         <category android:name="android.intent.category.DEFAULT" />
     </intent-filter>
</receiver>

同时添加这个权限

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
© www.soinside.com 2019 - 2024. All rights reserved.