1. 程式人生 > 程式設計 >Android實現定時任務及鬧鐘

Android實現定時任務及鬧鐘

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,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,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”/>

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。