应用关闭时的Android本地通知操作

时间:2020-02-19 12:49:31

标签: c# android xamarin xamarin.forms xamarin.android

我正在使用Xamarin来创建Android应用程序,但我坚持使用通知。

我要实现的目标:

  1. 通知每天在特定时间出现
  2. 它有两个按钮“是”和“否”
  3. 用户可以单击它们,我的应用程序将使用此数据进行操作。

问题:

出现通知,我关闭该应用程序(只需将其从“最近使用的应用程序”屏幕上滑开),然后点击通知按钮-没有任何反应。如果我点击通知正文-应用将打开,但是我需要使用这些按钮执行一些操作。

这是我的一些源文件:

MainActivity.cs

nums[ix-1]

AlarmReceiver.cs

ix

AnswerReciever.cs

public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
    {
        AnswerReciever receiver;
        public static long reminderInterval = 30 * 1000; //every 30 seconds for test

        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());
            CreateNotificationFromIntent(Intent);
            receiver = new AnswerReciever();

            //trying to schedule notification for specific time of the day
            var alarmIntent = new Intent(this, typeof(AlarmReceiver));
            var pending = PendingIntent.GetBroadcast(this, 0, alarmIntent, PendingIntentFlags.UpdateCurrent);
            var alarmManager = GetSystemService(AlarmService).JavaCast<AlarmManager>();
            alarmManager.SetInexactRepeating(AlarmType.RtcWakeup, FirstReminder(), reminderInterval, pending);
        }

        public static long FirstReminder()
        {
            var dt = DateTime.Now;
            //dt = dt.Date.AddHours(22).AddMinutes(00).AddSeconds(0);
            //TODO set from user settings

            var timestamp = (long)(dt.ToUniversalTime().Subtract(new DateTime(1970, 1, 1))).TotalMilliseconds;

            return timestamp;
        }

        public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Permission[] grantResults)
        {
            Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);

            base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
        }

        protected override void OnNewIntent(Intent intent)
        {
            CreateNotificationFromIntent(intent);
        }

        protected override void OnResume()
        {
            try
            {
                UnregisterReceiver(receiver);
            }
            catch (IllegalArgumentException) { }

            RegisterReceiver(receiver, new IntentFilter(Constants.ANDROID_NOTIFICATION_ACTION));

            base.OnResume();
        }

        protected override void OnDestroy()
        {
            UnregisterReceiver(receiver);
            base.OnDestroy();
        }

        protected override void OnPause()
        {
            base.OnPause();
        }

        void CreateNotificationFromIntent(Intent intent)
        {
            if (intent?.Extras != null)
            {
                string title = intent.Extras.GetString(AndroidNotificationManager.TitleKey);
                string message = intent.Extras.GetString(AndroidNotificationManager.MessageKey);
                DependencyService.Get<INotificationManager>().ReceiveNotification(title, message);
            }
        }
    }

AndroidNotificationManager.cs

[BroadcastReceiver]
    public class AlarmReceiver : BroadcastReceiver
    {
        public override void OnReceive(Context context, Intent intent)
        {
            DependencyService.Get<INotificationManager>().ScheduleNotification(Constants.NOTIFICATION_TITLE, Constants.NOTIFICATION_TEXT);
        }
    }

我创建了一个示例项目来重现我的问题(如果有帮助的话):https://github.com/Immelstorn/NotificationsTest

0 个答案:

没有答案