簡體   English   中英

Xamarin安卓 - 開關切換開/關振動來自MainActivity的AlarmReceiver中的通知

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM