[英]Generating a Notification at specific date and time
我正在嘗試創建一個待辦事項應用程序,用戶可以在其中為其任務設置日期和時間。 一旦用戶定義了他的任務並退出了應用程序,用戶應該從應用程序獲得關於他在應用程序中定義的任務的通知。 下面是我嘗試過的片段。
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());
}
}
home.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"/>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.