Чтобы получить данные из календаря в OnDestroy или OnPause

У меня есть этот код:

namespace TestB
{
    [Activity(Label = "TestB", MainLauncher = true, Icon = "@drawable/icon")]
    public class MainActivity : Activity
    {
        Java.Util.Calendar calendar;
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);
            SetContentView(Resource.Layout.Main);
            Button button = FindViewById<Button>(Resource.Id.MyButton);

            try
            {
                calendar = Java.Util.Calendar.Instance;
                calendar.TimeInMillis = Java.Lang.JavaSystem.CurrentTimeMillis();
            }
            catch (Exception ex)
            {
                Toast.MakeText(this, ex.Message.ToString(), ToastLength.Short).Show();
            }
        }
        protected override void OnDestroy()
        {
            base.OnDestroy();
            if (calendar.Get(Java.Util.CalendarField.HourOfDay) == 13 && calendar.Get(Java.Util.CalendarField.Minute) == 33)
                Toast.MakeText(this, calendar.Get(Java.Util.CalendarField.HourOfDay).ToString() + " " + calendar.Get(Java.Util.CalendarField.Minute).ToString(), ToastLength.Short).Show();
        }
        protected override void OnPause()
        {
            base.OnPause();
            if (calendar.Get(Java.Util.CalendarField.HourOfDay) == 13 && calendar.Get(Java.Util.CalendarField.Minute) == 33)
                Toast.MakeText(this, calendar.Get(Java.Util.CalendarField.HourOfDay).ToString() + " " + calendar.Get(Java.Util.CalendarField.Minute).ToString(), ToastLength.Short).Show();
        }

Когда время подойдет к 13 и 33 минутам, сообщение выдаваться не будет. Я хочу вызвать alarmManager таким образом. Я хочу иметь calendar.Set(Java.Util.CalendarField.HourOfDay, 13) и calendar.Set(Java.Util.CalendarField.Minute, 33) и вызывать alarmManager таким образом.

РЕДАКТИРОВАТЬ 1:

Я отредактировал этот код:

System.Timers.Timer t;
                if (t == null)
                {
                    t = new System.Timers.Timer();
                    //t.Elapsed += new System.Timers.ElapsedEventHandler(t_Elapsed);
                    //t.Elapsed += (sender, args) => FireTheMissiles();
                    t.Elapsed += new System.Timers.ElapsedEventHandler(OnTimeEvent);
                    t.Interval = 1000;
                    t.Enabled = true;
                }
                t.Start();
        protected override void OnStop()
        {
            base.OnStop();
            flag = 3;
        }
        private void OnTimeEvent(object source, ElapsedEventArgs e)
        {
            h = DateTime.Now.Hour;
            m = DateTime.Now.Minute;

            RunOnUiThread(delegate
            {
                if (flag == 3)
                {
                    if (calendar.Get(Java.Util.CalendarField.HourOfDay) == h && calendar.Get(Java.Util.CalendarField.Minute) == m)
                        Toast.MakeText(this, "3 " + calendar.Get(Java.Util.CalendarField.HourOfDay).ToString() + " " + calendar.Get(Java.Util.CalendarField.Minute).ToString(), ToastLength.Short).Show();
                }
            });
        }

Я попросил своих друзей реализовать этот проект на другом приложении и посмотреть, появится ли сообщение, если приложение не открывается в течение 24 часов, но никакого сообщения не появится.

РЕДАКТИРОВАТЬ 2:

Я использовал ваш код.
Я также использовал таймер.
Я сохранил информацию, такую ​​​​как время и дата установки, в базе данных.
Я хотел, чтобы будильник появлялся по времени и дате.
Но после нескольких попыток я не получил никакого предупреждающего сообщения.

private void OnTimeEvent(object source, ElapsedEventArgs e)
{
    RunOnUiThread(delegate
    {
        if (flag == 1)
        {
        }
        int h = DateTime.Now.Hour;
        int m = DateTime.Now.Minute;
        DateTime today = DateTime.Today;
        dc = today.AddDays(1).Day;
        mc = today.AddDays(1).Month;
        yc = today.AddDays(1).Year;
        var data = mydb.Table<DatB>();
        var data1 = data.Where(x => x.DWSeen == dc).Where(x => x.MWSeen == mc).FirstOrDefault();
        if (flag == 3 && data1 != null && data1.RFSeen == 0)
        {
            startAlertAtParticularTime(data1.HourSeen, data1.MinuteSeen, "-1");
            if (calendar.Get(Java.Util.CalendarField.HourOfDay) == h && calendar.Get(Java.Util.CalendarField.Minute) == m && calendar.Get(Java.Util.CalendarField.DayOfMonth) == dc && calendar.Get(Java.Util.CalendarField.Month) == mc && calendar.Get(Java.Util.CalendarField.Year) == yc && data1.RFSeen == 0)
            {
                startAlertAtParticularTime(data1.HourSeen, data1.MinuteSeen, data1.RFSeen.ToString());
            }
        }
    });
}

"-1" означает, что тревога не появится
"0" означает, что тревога появится

namespace TestB
{
    [BroadcastReceiver(Enabled = true)]
    public class MyBR: BroadcastReceiver
    {
        public override void OnReceive(Context context, Intent intent)
        {
            string dataSeenResult = intent.GetStringExtra("dataSeen");
            if ((MyApp.isActivityVisible() == "Stopped" || MyApp.isActivityVisible() == "Destroyed") && dataSeenResult == "0")
            {
                Toast.MakeText(context, MyApp.isActivityVisible().ToString(), ToastLength.Short).Show();
            }
        }
    }
}

person arz    schedule 09.10.2017    source источник
comment
Не знаете, что вы хотите сделать, вы хотите установить будильник со временем 13:33 из вашего приложения?   -  person Grace Feng    schedule 10.10.2017
comment
Да, я хочу, чтобы приложение оповещало в определенное время, пока оно закрыто   -  person arz    schedule 13.10.2017
comment
Вы проверили мой ответ, какие-либо обновления?   -  person Grace Feng    schedule 16.10.2017
comment
Я тестирую свою программу. Я объявлю.   -  person arz    schedule 16.10.2017
comment
@Grace Feng - MSFT Здравствуйте. Я сделал РЕДАКТИРОВАТЬ 2.   -  person arz    schedule 22.10.2017


Ответы (1)


Да, я хочу, чтобы приложение оповещало в определенное время, пока оно закрыто

Во-первых, вам нужно будет создать BroadcastReceiver для обработки уведомлений о тревоге из системы. Затем вы можете использовать AlarmManager для установки будильника в OnPause или OnDestroy:

Intent myintent = new Intent(this, typeof(AlarmReceiver));
var pendingintent = PendingIntent.GetBroadcast(this, 0, myintent, PendingIntentFlags.UpdateCurrent);

Java.Util.Date date = new Java.Util.Date();
Java.Util.Calendar cal = Java.Util.Calendar.Instance;
calendar.TimeInMillis = Java.Lang.JavaSystem.CurrentTimeMillis();
cal.Set(Java.Util.CalendarField.HourOfDay, 13);
cal.Set(Java.Util.CalendarField.Minute, 33);
cal.Set(Java.Util.CalendarField.Second, 0);
AlarmManager alarmManager = this.GetSystemService(AlarmService) as AlarmManager;
alarmManager.Set(AlarmType.RtcWakeup, cal.TimeInMillis, pendingintent);

Для части BroadcastReceiver вы можете обратиться к ответу Cheesebaron в этом случае: Xamarin AlarmManager Android.

person Grace Feng    schedule 13.10.2017
comment
Привет. Я сделал РЕДАКТИРОВАТЬ 2. - person arz; 24.10.2017