Xamarin.Android通过闹钟(AlarmManager)实现定时功能

目录

  • 1、说明
  • 2、效果
    • 2.1 实现效果
    • 2.2 功能说明
  • 3、代码实现
    • 3.1 定义广播接收器
    • 3.2 layout文件
    • 3.3 Activity代码
  • 4、代码下载
  • 5、其他说明
    • 6.1 其他说明
  • 6、参考

1、说明

在安卓程序中会用到定时做某事的功能。方法有很多种,闹钟是其中一种。简单介绍下。

2、效果

2.1 实现效果

Xamarin.Android通过闹钟(AlarmManager)实现定时功能_第1张图片

2.2 功能说明

第一输入框代表,从现在开始几秒后,启动这个闹钟。
第二个输入框代表,这个闹钟是一个重复闹钟,重复的时间是多少秒

3、代码实现

3.1 定义广播接收器

主要作用监听闹钟,若闹钟响了,就触发对应事件。

using Android.Content;
using Android.Widget;

namespace AlarmDemo
{
    [BroadcastReceiver]
    public class MyReceiver : BroadcastReceiver
    {
        public override void OnReceive(Context context, Intent intent)
        {
            Toast.MakeText(context, "闹铃响了!", ToastLength.Short).Show();
        }
    }
}

3.2 layout文件

界面的控件及布局


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">


     <EditText
        android:id="@+id/timeTxt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="28dp"
        android:textSize="25dp"
        android:textStyle="bold"
        android:ems="10"
        android:hint="设置秒数"
        android:inputType="numberDecimal" />


     <EditText
        android:id="@+id/initTime"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="28dp"
        android:textSize="25dp"
        android:textStyle="bold"
        android:layout_below="@+id/timeTxt"
        android:ems="10"
        android:hint="设置间隔(请>=60)秒"
        android:inputType="numberDecimal" />


    <Button
        android:id="@+id/startBtn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginRight="60dp"
        android:layout_marginTop="180dp"
        android:text="开始" />


RelativeLayout>

3.3 Activity代码

using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Widget;
using AndroidX.AppCompat.App;
using Java.Lang;
using System;

namespace AlarmDemo
{
    [Activity(Label = "@string/app_name", Theme = "@style/AppTheme", MainLauncher = true)]
    public class MainActivity : AppCompatActivity
    {
        //DECLARE WIDGETS
        private Button startBtn;
        private EditText timeTxt,internalTxt;
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            Xamarin.Essentials.Platform.Init(this, savedInstanceState);
            // Set our view from the "main" layout resource
            SetContentView(Resource.Layout.activity_main);

            this.initializeViews();
        }
        public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
        {
            Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);

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

        private void initializeViews()
        {
            timeTxt = FindViewById<EditText>(Resource.Id.timeTxt);
            internalTxt = FindViewById<EditText>(Resource.Id.initTime);
            
            startBtn = FindViewById<Button>(Resource.Id.startBtn);

            startBtn.Click += startBtn_Click;

        }

        void startBtn_Click(object sender, EventArgs e)
        {
            go();
        }

        private void go()
        {
            //获取界面设置
            int time = Convert.ToInt32(timeTxt.Text);
            int intervalTime = Convert.ToInt32(internalTxt.Text);

            Intent i = new Intent(this, typeof(MyReceiver));           
            PendingIntent pi = PendingIntent.GetBroadcast(this, 0, i, 0);         
            AlarmManager alarmManager = (AlarmManager)GetSystemService(AlarmService);

            //设置间隔
            alarmManager.SetRepeating(AlarmType.RtcWakeup, JavaSystem.CurrentTimeMillis() + (time * 1000), intervalTime*1000, pi);

            Toast.MakeText(this, "闹钟将在" + time + " 秒之后启动!", ToastLength.Short).Show();
        }
    }
}

4、代码下载

代码有个bug,间隔时间的internalTxt,未能初始化和使用。修改一下即可。

代码下载

5、其他说明

6.1 其他说明

1、 间隔不要小于60秒。安卓为了省电,会将小于60秒的定时闹钟,扩大到60秒。
2、若程序中需要用到小于60秒的,可以使用以下方法(TimerHandler

// Frequent operation using .NET Timer.
System.Timers.Timer t = new System.Timers.Timer (1000);
t.AutoReset = true;
t.Elapsed += (object sender, System.Timers.ElapsedEventArgs e) => {
    t.Interval = 2000;
    RunOnUiThread (() => Toast.MakeText (this, "Hi", ToastLength.Short).Show ());
};
t.Start ();

// Frequent operation using Android.OS.Handler
handler = new Handler ();
Action callback = null;
callback = () => {
    //Do something after 100ms
    Toast.MakeText(this, "Hi", ToastLength.Short).Show();  
    handler.PostDelayed(callback, 2000);
};
handler.PostDelayed(callback, 1000);

6、参考

参考资料1
参考资料2

你可能感兴趣的:(Xamarin,Xamarin.Android,AlarmManager)