android中定时有很多种是实现,常见的Handler 与Thread的结合,handler.postDelayed ,以及要使用的AlarmManger 等都可以实现定时任务的执行,但是使用场景却大不相同,这里主要是怎么用AlarmManager实现定时任务。

涉及知识点 :
1)BroadCastReceiver任务接收

2)CountDownTimer倒计时

3)AlertDialog 任务提醒

4)AlarmManager 定时任务

这里实现的需求是每天定时24点关机,有设备是定制系统,防止长时间的不关机导致应用的卡顿,在关机时并给用户以提示,如果误操作就自动关机。

第一步:实现简单布局,在布局中写两个Button,一个设置,一个取消

第二步 :初始化页面布局及Button

public class MainActivity extends AppCompatActivityimplements View.OnClickListener{Button btn_set,btn_cancel;AlarmManager am;PendingIntent pi;long time;@Overrideprotected 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();}@Overridepublic void onClick(View v) {switch(v.getId()){case R.id.btn_Set:setAlarm();break;case R.id.btn_Cancel:cancelAlarm();break;}}// 初始化Alarmprivate 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;@Overridepublic 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() {@Overridepublic 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) {@Overridepublic void onTick(long millisUntilFinished) {//倒计时提示文字Log.i(TAG,“onTick time :+millisUntilFinished);alertDialog.setMessage(“将在”+(millisUntilFinished/1000)+“关机”);}@Overridepublic 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”/>

更多相关文章

  1. Android(安卓)设置dialog背景全透明无边框
  2. Android(安卓)应用中执行cd命令
  3. Android-UI——TextView各属性详解
  4. Android三种动画详解
  5. Android控件TextView中ellipsize属性(设置当文字长度超过textview
  6. Android之TextView 详细字典
  7. android preferenceActivity用法
  8. android绘图
  9. Android完美解决输入框EditText隐藏密码打勾显示密码问题

随机推荐

  1. java.lang.OutOfMemoryError:Java heap s
  2. Android 使用git下载源码报错解决方法
  3. Android(安卓)View绘制过程
  4. 基于android的人脸识别
  5. Android 之文件夹排序(基于名称、最近修改
  6. android Timer使用方法
  7. android的注意点
  8. Android 实现清除缓存
  9. android透明状态栏效果
  10. Android 桌面部件