Android实现定时任务及闹钟
作者:TimeJury 时间:2023-05-20 13:34:45
android中定时有很多种是实现,常见的Handler 与Thread的结合,handler.postDelayed ,以及要使用的AlarmManger 等都可以实现定时任务的执行,但是使用场景却大不相同,这里主要是怎么用AlarmManager实现定时任务。
涉及知识点:
1)BroadCastReceiver任务接收
2)CountDownTimer倒计时
3)AlertDialog 任务提醒
4)AlarmManager 定时任务
这里实现的需求时每天定时24点关机,有设备是定制系统,防止长时间的不关机导致应用的卡顿,在关机时并给用户以提示,如果无操作就自动关机。
第一步是实现简单布局,在布局中写两个Button,一个设置,一个取消
第二步:初始化页面布局及Button
public class MainActivity extends AppCompatActivity
implements View.OnClickListener{
Button btn_set,btn_cancel;
AlarmManager am;
PendingIntent pi;
long time;
@Override
protected void onCreate(@NullableBundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView(){
btn_set=findViewById(R.id.btn_Set);
btn_cancel=findViewById(R.id.btn_Cancel);
btn_set.setOnClickListener(this);
btn_cancel.setOnClickListener(this);
initAlarm();
}
@Override
public void onClick(View v) {
switch(v.getId()){
case R.id.btn_Set:
setAlarm();
break;
case R.id.btn_Cancel:
cancelAlarm();
break;
}
}
// 初始化Alarm
private void initAlarm(){
pi=PendingIntent.getBroadcast(this,0,getMsgIntent(),0);
time=System.currentTimeMillis();
am= (AlarmManager) getSystemService(ALARM_SERVICE);
}
private Intent getMsgIntent(){
//AlarmReceiver 为广播在下面代码中
Intent intent=newIntent(this,AlarmReceiver.class);
intent.setAction(AlarmReceiver.BC_ACTION);
intent.putExtra("msg","闹钟开启");
return intent;
}
//设置定时执行的任务
private void setAlarm(){
//android Api的改变不同版本中设 置有所不同
if(Build.VERSION.SDK_INT<19){
am.set(AlarmManager.RTC_WAKEUP,getTimeDiff(),pi);
}else{
am.setExact(AlarmManager.RTC_WAKEUP,getTimeDiff(),pi);
}
}
public long getTimeDiff(){
//这里设置的是当天的15:55分,注意精确到秒,时间可以自由设置
Calendar ca=Calendar.getInstance();
ca.set(Calendar.HOUR_OF_DAY,15);
ca.set(Calendar.MINUTE,55);
ca.set(Calendar.SECOND,0);
return ca.getTimeInMillis();
}
//取消定时任务的执行
private void cancelAlarm(){
am.cancel(pi);
}
}
广播主要代码
import android.app.AlertDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Build;
import android.os.CountDownTimer;
import android.util.Log;
import android.view.WindowManager;
import android.widget.Toast;
public class AlarmReceiver extends BroadcastReceiver {
private String TAG=this.getClass().getSimpleName();
public static final String BC_ACTION="com.ex.action.BC_ACTION";
private AlertDialog.Builder builder;
CountDownTimer timer;
@Override
public void onReceive(Context context,Intent intent) {
String msg=intent.getStringExtra("msg");
Log.i(TAG,"get Receiver msg :"+msg);
Toast.makeText(context,msg,Toast.LENGTH_LONG).show();
showConfirmDialog(context);
}
private void showConfirmDialog(Context context){
builder=newAlertDialog.Builder(context);
builder.setTitle("提示")
.setMessage("将在30秒后关机")
.setCancelable(false)
.setPositiveButton("取消",
newDialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, intwhich) {
if(timer!=null)timer.cancel();
}
});
setShowDialogType(context,builder.create());
}
private void setShowDialogType(Context context,AlertDialog alertDialog){
int type;
if(Build.VERSION.SDK_INT>24){
type= WindowManager.LayoutParams.TYPE_PHONE;
}else if(Build.VERSION.SDK_INT>18){
type= WindowManager.LayoutParams.TYPE_TOAST;
}else{
type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
}
alertDialog.getWindow().setType(type);
alertDialog.show();
//开启倒计时,并设置倒计时时间(秒)
startCountDownTimer(context,alertDialog,30);
}
private void startCountDownTimer(final Context context,final AlertDialog alertDialog,inttime){
timer=newCountDownTimer(time*1000,1000) {
@Override
public void onTick(long millisUntilFinished) {
//倒计时提示文字
Log.i(TAG,"onTick time :"+millisUntilFinished);
alertDialog.setMessage("将在"+(millisUntilFinished/1000)+"关机");
}
@Override
public void onFinish() {
//倒计时结束
Log.i(TAG,"倒计时结束!");
alertDialog.dismiss();
//倒计时结束执行定时的任务
// shutdown(context);
}
};
timer.start();
}
//shoutDown需要 系统权限才能执行否则会提示权限异常
public void shutDown(Context context) {
String action ="android.intent.action.ACTION_REQUEST_SHUTDOWN";
String extraName ="android.intent.extra.USER_REQUESTED_SHUTDOWN";
Intent intent =newIntent(action);
intent.putExtra(extraName, true);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
}
在AndroidManifest.xml中声明配置文件中声明:
如实全部代码实现定时任务
弹框需要如下权限:
< uses-permission android:name=”android.permission.SYSTEM_ALERT_WINDOW”/>
来源:https://blog.csdn.net/zdc9023/article/details/78861724
标签:Android,定时任务,闹钟
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Java Synchronized的偏向锁详细分析
2021-07-09 00:35:23
![](https://img.aspxhome.com/file/2023/9/70969_0s.png)
利用AOP实现SqlSugar自动事务
2021-11-24 11:56:42
C#中跨线程访问控件问题解决方案分享
2021-06-27 18:47:24
Java annotation元注解原理实例解析
2022-09-08 00:42:45
java如何获得redis所有的key-value
2022-03-13 12:22:14
![](https://img.aspxhome.com/file/2023/3/60823_0s.jpg)
SpringBoot整合XxlJob分布式任务调度平台
2022-07-09 09:47:37
![](https://img.aspxhome.com/file/2023/5/84165_0s.png)
C#截图程序类似腾讯QQ截图实现代码
2023-05-07 04:01:01
![](https://img.aspxhome.com/file/2023/1/100191_0s.jpg)
Java nacos动态配置实现流程详解
2021-06-04 19:18:30
![](https://img.aspxhome.com/file/2023/5/83555_0s.png)
JAVA中的字符串常量池使用操作代码
2021-11-24 02:00:57
![](https://img.aspxhome.com/file/2023/2/66932_0s.png)
Java基础学习之方法的重载知识总结
2023-10-27 01:45:15
![](https://img.aspxhome.com/file/2023/2/96132_0s.png)
SpringBoot动态更新yml文件
2022-02-23 00:34:23
浅谈一下Java中的悲观锁和乐观锁
2023-08-12 05:54:27
C# web.config之<customErrors>节点说明案例详解
2023-07-06 20:20:15
c#集合快速排序类实现代码分享
2023-03-30 13:38:51
一篇文章带你搞定JAVA注解
2023-03-15 05:22:23
![](https://img.aspxhome.com/file/2023/2/63012_0s.png)
Java多线程的其他知识_动力节点Java学院整理
2023-09-06 06:01:58
![](https://img.aspxhome.com/file/2023/2/68032_0s.png)
Java实现的质因数分解操作示例【基于递归算法】
2023-08-19 03:22:12
![](https://img.aspxhome.com/file/2023/1/116131_0s.png)
HelloSpringMVC注解版实现步骤解析
2021-07-21 01:58:42
LeetCode程序员面试题之无重复字符的最长子串
2021-09-12 05:26:36
Maven安装及MyEclipse中使用Maven
2023-06-20 04:29:07
![](https://img.aspxhome.com/file/2023/7/69307_0s.png)