Android實(shí)現(xiàn)定時(shí)任務(wù)及鬧鐘
android中定時(shí)有很多種是實(shí)現(xiàn),常見的Handler 與Thread的結(jié)合,handler.postDelayed ,以及要使用的AlarmManger 等都可以實(shí)現(xiàn)定時(shí)任務(wù)的執(zhí)行,但是使用場景卻大不相同,這里主要是怎么用AlarmManager實(shí)現(xiàn)定時(shí)任務(wù)。
涉及知識(shí)點(diǎn):
1)BroadCastReceiver任務(wù)接收
2)CountDownTimer倒計(jì)時(shí)
3)AlertDialog 任務(wù)提醒
4)AlarmManager 定時(shí)任務(wù)
這里實(shí)現(xiàn)的需求時(shí)每天定時(shí)24點(diǎn)關(guān)機(jī),有設(shè)備是定制系統(tǒng),防止長時(shí)間的不關(guān)機(jī)導(dǎo)致應(yīng)用的卡頓,在關(guān)機(jī)時(shí)并給用戶以提示,如果無操作就自動(dòng)關(guān)機(jī)。
第一步是實(shí)現(xiàn)簡單布局,在布局中寫兩個(gè)Button,一個(gè)設(shè)置,一個(gè)取消
第二步:初始化頁面布局及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;
}
//設(shè)置定時(shí)執(zhí)行的任務(wù)
private void setAlarm(){
//android Api的改變不同版本中設(shè) 置有所不同
if(Build.VERSION.SDK_INT<19){
am.set(AlarmManager.RTC_WAKEUP,getTimeDiff(),pi);
}else{
am.setExact(AlarmManager.RTC_WAKEUP,getTimeDiff(),pi);
}
}
public long getTimeDiff(){
//這里設(shè)置的是當(dāng)天的15:55分,注意精確到秒,時(shí)間可以自由設(shè)置
Calendar ca=Calendar.getInstance();
ca.set(Calendar.HOUR_OF_DAY,15);
ca.set(Calendar.MINUTE,55);
ca.set(Calendar.SECOND,0);
return ca.getTimeInMillis();
}
//取消定時(shí)任務(wù)的執(zhí)行
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秒后關(guān)機(jī)")
.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();
//開啟倒計(jì)時(shí),并設(shè)置倒計(jì)時(shí)時(shí)間(秒)
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) {
//倒計(jì)時(shí)提示文字
Log.i(TAG,"onTick time :"+millisUntilFinished);
alertDialog.setMessage("將在"+(millisUntilFinished/1000)+"關(guān)機(jī)");
}
@Override
public void onFinish() {
//倒計(jì)時(shí)結(jié)束
Log.i(TAG,"倒計(jì)時(shí)結(jié)束!");
alertDialog.dismiss();
//倒計(jì)時(shí)結(jié)束執(zhí)行定時(shí)的任務(wù)
// shutdown(context);
}
};
timer.start();
}
//shoutDown需要 系統(tǒng)權(quán)限才能執(zhí)行否則會(huì)提示權(quán)限異常
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中聲明配置文件中聲明:
如實(shí)全部代碼實(shí)現(xiàn)定時(shí)任務(wù)
彈框需要如下權(quán)限:
< uses-permission android:name=”android.permission.SYSTEM_ALERT_WINDOW”/>
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android音樂播放器制作 點(diǎn)擊歌曲實(shí)現(xiàn)播放(二)
這篇文章主要為大家詳細(xì)介紹了Android音樂播放器的制作方法,點(diǎn)擊歌曲實(shí)現(xiàn)播放,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02
Android SeekBar控制視頻播放進(jìn)度實(shí)現(xiàn)過程講解
這篇文章主要介紹了Android SeekBar控制視頻播放進(jìn)度實(shí)現(xiàn)過程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-04-04
Android自定義View實(shí)現(xiàn)環(huán)形進(jìn)度條的思路與實(shí)例
最近看到豆瓣FM的音樂播放界面,有一個(gè)環(huán)形的進(jìn)度條挺不錯(cuò)的,最近有空就想著實(shí)現(xiàn)了,所以下面這篇文章主要給大家介紹了Android自定義View實(shí)現(xiàn)環(huán)形進(jìn)度條的思路與實(shí)例,需要的朋友可以參考借鑒,下面來一起看看吧。2017-04-04
Android自定義FloatingActionButton滑動(dòng)行為只隱藏不出現(xiàn)的問題小結(jié)
這篇文章主要介紹了Android自定義FloatingActionButton滑動(dòng)行為只隱藏不出現(xiàn)的問題小結(jié),需要的朋友可以參考下2017-01-01
Android實(shí)現(xiàn)發(fā)送短信功能實(shí)例詳解
這篇文章主要介紹了Android實(shí)現(xiàn)發(fā)送短信功能的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Android實(shí)現(xiàn)發(fā)送短信的原理、步驟與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-02-02
Android fragment實(shí)現(xiàn)多個(gè)頁面切換效果
這篇文章主要為大家詳細(xì)介紹了fragment實(shí)現(xiàn)多個(gè)頁面切換效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04
Android自定義控件之開關(guān)按鈕學(xué)習(xí)筆記分享
這篇文章主要為大家分享了Android自定義開關(guān)按鈕的學(xué)習(xí)筆記,內(nèi)容豐富,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-05-05

