[英]Xamarin Android - Switch Toggle On/Off Vibration of a notification in AlarmReceiver from MainActivity
GrayBark说: “如果你的活动被扼杀并且警报被触发,那么就没有任何活动可以停止铃声。” 如何????
我做了一个简单的通知和切换按钮。
1.首先,我没有包含开关按钮,它工作正常。 我的代码就像这个
主要活动
private void MRemindMe_Click(object sender, EventArgs e) { //StartReminder 1-6hrs intRemind = new Intent(this, typeof(AlarmReceiver)); pendInt = PendingIntent.GetBroadcast(this, 0, intRemind, PendingIntentFlags.UpdateCurrent); alarmManager = (AlarmManager)GetSystemService(AlarmService); alarmManager.SetInexactRepeating(AlarmType.ElapsedRealtimeWakeup, SystemClock.ElapsedRealtime() + (1000 * mSeekBar.Progress), (1000 * mSeekBar.Progress), pendInt); mCancelNotif.Visibility = ViewStates.Visible; }
AlarmReceiver
public override void OnReceive(Context context, Intent intent) { Intent Intent = new Intent(context, typeof(MainActivity)); PendingIntent BuildPendingIntent = PendingIntent.GetActivity(context, 0, Intent, PendingIntentFlags.CancelCurrent); manager = NotificationManager.FromContext(context); ISharedPreferences pref = Application.Context.GetSharedPreferences("MyApp", FileCreationMode.Private); ISharedPreferencesEditor editor = pref.Edit(); builder = new NotificationCompat.Builder(context) .SetAutoCancel(true) .SetContentIntent(BuildPendingIntent) .SetContentTitle("Remind Me!") .SetTicker("Checklist: Remind Me!") .SetContentText("It's time to check your CheckList!") .SetSmallIcon(Resource.Drawable.Icon) .SetVisibility((int)NotificationVisibility.Public) .SetFullScreenIntent(BuildPendingIntent, true) .SetPriority((int)NotificationPriority.High) .SetDefaults((int)NotificationDefaults.All); manager.Notify(0, builder.Build()); }
2。
然后我终于添加了一个开关切换按钮。 当应用程序处于活动状态时,它可以很好地工作,最小化。但是,当它被杀死时,通知会停止,应用程序将停止工作。 代码是这样的:
AlarmReceiver
public override void OnReceive(Context context, Intent intent)
{
Intent Intent = new Intent(context, typeof(MainActivity));
PendingIntent BuildPendingIntent = PendingIntent.GetActivity(context, 0, Intent, PendingIntentFlags.CancelCurrent);
manager = NotificationManager.FromContext(context);
ISharedPreferences pref = Application.Context.GetSharedPreferences("MyApp", FileCreationMode.Private);
ISharedPreferencesEditor editor = pref.Edit();
builder = new NotificationCompat.Builder(context)
.SetAutoCancel(true)
.SetContentIntent(BuildPendingIntent)
.SetContentTitle("Remind Me!")
.SetTicker("Checklist: Remind Me!")
.SetContentText("It's time to check your CheckList!")
.SetSmallIcon(Resource.Drawable.Icon)
.SetVisibility((int)NotificationVisibility.Public)
.SetFullScreenIntent(BuildPendingIntent, true)
.SetPriority((int)NotificationPriority.High);
//added Switch Toggle
if (MainActivity.mvibrateSW.Checked)
{
builder.SetDefaults((int)NotificationDefaults.Vibrate);
}
manager.Notify(0, builder.Build());
}
我怎样才能解决这个问题? 我可以感觉到我的问题在我的鼻子底下..而且,我已经看到了类似的问题,但是我太模糊了解如何通过在切换按钮之间切换来停止播放声音?
最后,我得到了答案,感谢上帝。首先,要了解问题......我的BroadCastReceiver似乎依赖于MainActivity。 如上所述:
如果切换振动被切换,则MainActivity被杀死但是警报触发,因此,由于BroadCastReceiver无法找到Toggle是否已切换,因此警报不会触发
To put it Simply
Switch is On (SetVibration = true)
↳ Click to Turn On alarm
↳ Alarm Service is fired
↳ You want to exit App? = Yes
↳ Alarm Still Firing (but Where is Toggle? is it On/Off?)
↳ Alarm Dies and "Unfortunately, App is not Working"
因此我们应该使MainActivity取决于BroadCastReceiver。
解决方案是..让他们使用Intent Strings进行通信。
主要活动
private void MRemindMe_Click(object sender, EventArgs e) { intRemind = new Intent(this, typeof(AlarmReceiver)); //ToggleSwitch if (mvibrateSW.Checked) { intRemind.PutExtra("vChecked", "On"); } //StartReminder 1-6hrs pendInt = PendingIntent.GetBroadcast(this, 0, intRemind, PendingIntentFlags.UpdateCurrent); alarmManager = (AlarmManager)GetSystemService(AlarmService); alarmManager.SetInexactRepeating(AlarmType.ElapsedRealtimeWakeup, SystemClock.ElapsedRealtime() + (1000 * mSeekBar.Progress), (1000 * mSeekBar.Progress), pendInt); mCancelNotif.Visibility = ViewStates.Visible; }
AlarmReceiver
public override void OnReceive(Context context, Intent intent) { Intent Intent = new Intent(context, typeof(MainActivity)); PendingIntent BuildPendingIntent = PendingIntent.GetActivity(context, 0, Intent, PendingIntentFlags.CancelCurrent); manager = NotificationManager.FromContext(context); ISharedPreferences pref = Application.Context.GetSharedPreferences("MyApp", FileCreationMode.Private); ISharedPreferencesEditor editor = pref.Edit(); string VOn = intent.GetStringExtra("vChecked"); builder = new NotificationCompat.Builder(context) .SetAutoCancel(true) .SetContentIntent(BuildPendingIntent) .SetContentTitle("Remind Me!") .SetTicker("Checklist: Remind Me!") .SetContentText("It's time to check your CheckList!") .SetSmallIcon(Resource.Drawable.Icon) .SetVisibility((int)NotificationVisibility.Public) .SetFullScreenIntent(BuildPendingIntent, true) .SetPriority((int)NotificationPriority.High); //Receive Command by String string OnVib = intent.GetStringExtra("vChecked"); if (OnVib == "On") { builder.SetDefaults((int)NotificationDefaults.Vibrate); } else { builder.SetDefaults((int)NotificationDefaults.Lights); } manager.Notify(0, builder.Build()); }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.