我正在尝试创建一个待办事项应用程序,用户可以为他们的任务设置日期和时间。一旦用户定义了他的任务并退出了应用程序,用户应该从应用程序中得到关于他在应用程序中定义的任务的通知。以下是我试过的片段。
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"/>
我可以在点击按钮时生成通知,但不能在特定时间特定日期生成通知。但是,我无法在特定时间生成特定日期的通知。这可能是什么问题。
你忘了为你的接收器添加意图过滤器(如果我错了,请纠正我)。
<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"/>