问题描述
我在Android-Xamarin Forms Project上的计划通知中有一个小问题。我想将每日通知安排在17:00。它可以在模拟器上正常运行,但是当我将其部署在Samsung S7 Edge-Android 8.0上时,它将在17:00通知我,并且在打开通知后,它将在每分钟左右通知。
这是我的代码MainActivity.cs:
[Activity(Label = "SpiritMobile",Icon = "@mipmap/icon",Theme = "@style/MainTheme",MainLauncher = true,ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
static readonly string CHANNEL_ID = "location_notification";
internal static readonly string COUNT_KEY = "count";
protected override void OnCreate(Bundle savedInstanceState)
{
TabLayoutResource = Resource.Layout.Tabbar;
ToolbarResource = Resource.Layout.Toolbar;
base.OnCreate(savedInstanceState);
Xamarin.Essentials.Platform.Init(this,savedInstanceState);
global::Xamarin.Forms.Forms.Init(this,savedInstanceState);
LoadApplication(new App());
CreateNotificationChannel();
Intent alarmIntent = new Intent(this,typeof(AlarmReceiver));
PendingIntent pending = PendingIntent.Getbroadcast(this,alarmIntent,PendingIntentFlags.UpdateCurrent);
AlarmManager alarmManager = GetSystemService(AlarmService).JavaCast<AlarmManager>();
var calendar = Calendar.Instance;
calendar.TimeZone = Java.Util.TimeZone.GetTimeZone("Europe/Bucharest");
calendar.Set(CalendarField.HourOfDay,17);
calendar.Set(CalendarField.Minute,00);
alarmManager.SetRepeating(AlarmType.RtcWakeup,calendar.TimeInMillis,AlarmManager.IntervalDay,pending);
}
public override void OnRequestPermissionsResult(int requestCode,string[] permissions,[GeneratedEnum] Android.Content.PM.Permission[] grantResults)
{
Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode,permissions,grantResults);
ServicePointManager.ServerCertificateValidationCallback += (o,cert,chain,errors) => true;
base.OnRequestPermissionsResult(requestCode,grantResults);
}
void CreateNotificationChannel()
{
if (Build.VERSION.SdkInt < BuildVersionCodes.O)
{
return;
}
var channel = new NotificationChannel(CHANNEL_ID,"reminders",NotificationImportance.Default)
{
Description = "reminder's channel"
};
var notificationmanager = (notificationmanager)GetSystemService(NotificationService);
notificationmanager.CreateNotificationChannel(channel);
}
}
然后我有了AlarmReceiver.cs:
[broadcastReceiver]
public class AlarmReceiver : broadcastReceiver
{
public override void OnReceive(Context context,Intent intent)
{
var message = "Don't forget to submit your daily rates.";
Intent backIntent = new Intent(context,typeof(MainActivity));
backIntent.SetFlags(ActivityFlags.NewTask);
var resultIntent = new Intent(context,typeof(MainActivity));
PendingIntent pending = PendingIntent.GetActivities(context,new Intent[] { backIntent,resultIntent },PendingIntentFlags.Oneshot);
var builder = new NotificationCompat.Builder(context,"location_notification")
.SetAutoCancel(true)
.SetContentTitle("Submit your daily feeling!")
.SetContentText(message)
.SetSmallIcon(Resource.Drawable.icon);
builder.SetContentIntent(pending);
var notificationmanager = notificationmanagerCompat.From(context);
notificationmanager.Notify(1000,builder.Build());
}
}
能否请您告诉我这里出了什么问题?可能是什么原因造成的?
解决方法
您正在通过“活动”的OnCreate
方法设置重复警报。因此,每次启动应用程序时,都会向AlarmManager
注册一个新的警报。由于它是重复警报,您只需设置一次即可。