1、说明
在安卓程序中会用到定时做某事的功能。方法有很多种,闹钟是其中一种。简单介绍下。
2、效果
2.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文件
界面的控件及布局
<?xml version="1.0" encoding="utf-8"?>
<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秒的,可以使用以下方法(Timer
和Handler
)
// 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);