您好我正在申请我已通过后台服务设置用户输入日期和时间的通知。现在我想在每天下午6点设置通知/闹钟,询问用户是否要添加其他条目? 我怎样才能做到这一点?我应该使用相同的后台服务还是广播接收器? 请给我更好的解决方案,教程将是个好主意。 提前谢谢。
答案 0 :(得分:56)
首先将警报管理器设置如下
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 18);
calendar.set(Calendar.MINUTE, 30);
calendar.set(Calendar.SECOND, 0);
Intent intent1 = new Intent(MainActivity.this, AlarmReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0,intent1, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager am = (AlarmManager) MainActivity.this.getSystemService(MainActivity.this.ALARM_SERVICE);
am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);
创建广播接收器类" AlarmReceiver"在这提高了 onReceive时的通知
public class AlarmReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
long when = System.currentTimeMillis();
NotificationManager notificationManager = (NotificationManager) context
.getSystemService(Context.NOTIFICATION_SERVICE);
Intent notificationIntent = new Intent(context, EVentsPerform.class);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder mNotifyBuilder = new NotificationCompat.Builder(
context).setSmallIcon(R.drawable.applogo)
.setContentTitle("Alarm Fired")
.setContentText("Events to be Performed").setSound(alarmSound)
.setAutoCancel(true).setWhen(when)
.setContentIntent(pendingIntent)
.setVibrate(new long[]{1000, 1000, 1000, 1000, 1000});
notificationManager.notify(MID, mNotifyBuilder.build());
MID++;
}
}
并在清单文件中,注册AlarmReceiver类的接收器:
<receiver android:name=".AlarmReceiver"/>
通过警报管理器提升事件无需特殊权限。
答案 1 :(得分:3)
N.V.Rao的回答是正确的,但不要忘记将receiver
标记放在AndroidManifest.xml文件中的应用程序标记内:
<receiver android:name=".alarm.AlarmReceiver" />
答案 2 :(得分:0)
2021 年 4 月
这是Android中特定时间(此处为上午8点)每日重复通知的示例代码:-
1.
MainActivity.class
package com.manab.notificationx;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import java.util.Calendar;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate (Bundle savedInstanceState) {
super .onCreate(savedInstanceState) ;
setContentView(R.layout.activity_main ) ;
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);//we are using alarm manager for the notification
Intent notificationIntent = new Intent(this, AlarmReceiver.class);//this intent will be called when taping the notification
PendingIntent broadcast = PendingIntent.getBroadcast(this, 100, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);//this pendingIntent will be called by the broadcast receiver
Calendar cal = Calendar.getInstance();//getting calender instance
cal.setTimeInMillis(System.currentTimeMillis());//setting the time from device
cal.set(Calendar.HOUR_OF_DAY, 8); // cal.set NOT cal.add
cal.set(Calendar.MINUTE,0);
cal.set(Calendar.SECOND, 0);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(),AlarmManager.INTERVAL_DAY,broadcast);//alarm manager will repeat the notification each day at the set time
}
}
AlarmReceiver.class // 这是后台进程需要的广播接收器
package com.manab.notificationx;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.TaskStackBuilder;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
public class AlarmReceiver extends BroadcastReceiver {
private static final String CHANNEL_ID = "this.is.my.channelId";//you can add any id you want
@Override
public void onReceive(Context context, Intent intent) {
Intent notificationIntent = new Intent(context, NotificationActivity.class);//on tap this activity will open
TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
stackBuilder.addParentStack(NotificationActivity.class);
stackBuilder.addNextIntent(notificationIntent);
PendingIntent pendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);//getting the pendingIntent
Notification.Builder builder = new Notification.Builder(context);//building the notification
Notification notification = builder.setContentTitle("Demo App Notification")
.setContentText("New Notification From Demo App..")
.setTicker("New Message Alert!")
.setSmallIcon(R.mipmap.ic_launcher)
.setContentIntent(pendingIntent).build();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
builder.setChannelId(CHANNEL_ID);
}
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
//below creating notification channel, because of androids latest update, O is Oreo
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel channel = new NotificationChannel(
CHANNEL_ID,
"NotificationDemo",
NotificationManager.IMPORTANCE_DEFAULT
);
notificationManager.createNotificationChannel(channel);
}
notificationManager.notify(0, notification);
}
}
NotificationActivity.class //记住这是一个活动,不是一个类,所以创建一个空活动。
package com.manab.notificationx;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class NotificationActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_notification);
}
}
AndroidManifest.xml // 只需在下面添加指示的行
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.manab.notificationx">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.NotificationX">
<activity android:name=".NotificationActivity"></activity>
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name=".AlarmReceiver" />//copy only this line of code
</application>
</manifest>
让我知道它是否有效