Android实现定时任务及闹钟
android中定时有很多种是实现,常见的Handler与Thread的结合,handler.postDelayed,以及要使用的AlarmManger等都可以实现定时任务的执行,但是使用场景却大不相同,这里主要是怎么用AlarmManager实现定时任务。
涉及知识点:
1)BroadCastReceiver任务接收
2)CountDownTimer倒计时
3)AlertDialog任务提醒
4)AlarmManager定时任务
这里实现的需求时每天定时24点关机,有设备是定制系统,防止长时间的不关机导致应用的卡顿,在关机时并给用户以提示,如果无操作就自动关机。
第一步是实现简单布局,在布局中写两个Button,一个设置,一个取消
第二步:初始化页面布局及Button
publicclassMainActivityextendsAppCompatActivity implementsView.OnClickListener{ Buttonbtn_set,btn_cancel; AlarmManageram; PendingIntentpi; longtime; @Override protectedvoidonCreate(@NullableBundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } privatevoidinitView(){ btn_set=findViewById(R.id.btn_Set); btn_cancel=findViewById(R.id.btn_Cancel); btn_set.setOnClickListener(this); btn_cancel.setOnClickListener(this); initAlarm(); } @Override publicvoidonClick(Viewv){ switch(v.getId()){ caseR.id.btn_Set: setAlarm(); break; caseR.id.btn_Cancel: cancelAlarm(); break; } } //初始化Alarm privatevoidinitAlarm(){ pi=PendingIntent.getBroadcast(this,0,getMsgIntent(),0); time=System.currentTimeMillis(); am=(AlarmManager)getSystemService(ALARM_SERVICE); } privateIntentgetMsgIntent(){ //AlarmReceiver为广播在下面代码中 Intentintent=newIntent(this,AlarmReceiver.class); intent.setAction(AlarmReceiver.BC_ACTION); intent.putExtra("msg","闹钟开启"); returnintent; } //设置定时执行的任务 privatevoidsetAlarm(){ //androidApi的改变不同版本中设置有所不同 if(Build.VERSION.SDK_INT<19){ am.set(AlarmManager.RTC_WAKEUP,getTimeDiff(),pi); }else{ am.setExact(AlarmManager.RTC_WAKEUP,getTimeDiff(),pi); } } publiclonggetTimeDiff(){ //这里设置的是当天的15:55分,注意精确到秒,时间可以自由设置 Calendarca=Calendar.getInstance(); ca.set(Calendar.HOUR_OF_DAY,15); ca.set(Calendar.MINUTE,55); ca.set(Calendar.SECOND,0); returnca.getTimeInMillis(); } //取消定时任务的执行 privatevoidcancelAlarm(){ am.cancel(pi); } }
广播主要代码
importandroid.app.AlertDialog; importandroid.content.BroadcastReceiver; importandroid.content.Context; importandroid.content.DialogInterface; importandroid.content.Intent; importandroid.os.Build; importandroid.os.CountDownTimer; importandroid.util.Log; importandroid.view.WindowManager; importandroid.widget.Toast; publicclassAlarmReceiverextendsBroadcastReceiver{ privateStringTAG=this.getClass().getSimpleName(); publicstaticfinalStringBC_ACTION="com.ex.action.BC_ACTION"; privateAlertDialog.Builderbuilder; CountDownTimertimer; @Override publicvoidonReceive(Contextcontext,Intentintent){ Stringmsg=intent.getStringExtra("msg"); Log.i(TAG,"getReceivermsg:"+msg); Toast.makeText(context,msg,Toast.LENGTH_LONG).show(); showConfirmDialog(context); } privatevoidshowConfirmDialog(Contextcontext){ builder=newAlertDialog.Builder(context); builder.setTitle("提示") .setMessage("将在30秒后关机") .setCancelable(false) .setPositiveButton("取消", newDialogInterface.OnClickListener(){ @Override publicvoidonClick(DialogInterfacedialog,intwhich){ if(timer!=null)timer.cancel(); } }); setShowDialogType(context,builder.create()); } privatevoidsetShowDialogType(Contextcontext,AlertDialogalertDialog){ inttype; if(Build.VERSION.SDK_INT>24){ type=WindowManager.LayoutParams.TYPE_PHONE; }elseif(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); } privatevoidstartCountDownTimer(finalContextcontext,finalAlertDialogalertDialog,inttime){ timer=newCountDownTimer(time*1000,1000){ @Override publicvoidonTick(longmillisUntilFinished){ //倒计时提示文字 Log.i(TAG,"onTicktime:"+millisUntilFinished); alertDialog.setMessage("将在"+(millisUntilFinished/1000)+"关机"); } @Override publicvoidonFinish(){ //倒计时结束 Log.i(TAG,"倒计时结束!"); alertDialog.dismiss(); //倒计时结束执行定时的任务 //shutdown(context); } }; timer.start(); } //shoutDown需要系统权限才能执行否则会提示权限异常 publicvoidshutDown(Contextcontext){ Stringaction="android.intent.action.ACTION_REQUEST_SHUTDOWN"; StringextraName="android.intent.extra.USER_REQUESTED_SHUTDOWN"; Intentintent=newIntent(action); intent.putExtra(extraName,true); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent); } }
在AndroidManifest.xml中声明配置文件中声明:
如实全部代码实现定时任务
弹框需要如下权限:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。