Android實現(xiàn)定時任務(wù)及鬧鐘
android中定時有很多種是實現(xiàn),常見的Handler 與Thread的結(jié)合,handler.postDelayed ,以及要使用的AlarmManger 等都可以實現(xiàn)定時任務(wù)的執(zhí)行,但是使用場景卻大不相同,這里主要是怎么用AlarmManager實現(xiàn)定時任務(wù)。
涉及知識點:
1)BroadCastReceiver任務(wù)接收
2)CountDownTimer倒計時
3)AlertDialog 任務(wù)提醒
4)AlarmManager 定時任務(wù)
這里實現(xiàn)的需求時每天定時24點關(guān)機(jī),有設(shè)備是定制系統(tǒng),防止長時間的不關(guān)機(jī)導(dǎo)致應(yīng)用的卡頓,在關(guān)機(jī)時并給用戶以提示,如果無操作就自動關(guān)機(jī)。
第一步是實現(xiàn)簡單布局,在布局中寫兩個Button,一個設(shè)置,一個取消
第二步:初始化頁面布局及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è)置定時執(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è)置 Calendar ca=Calendar.getInstance(); ca.set(Calendar.HOUR_OF_DAY,15); ca.set(Calendar.MINUTE,55); ca.set(Calendar.SECOND,0); return ca.getTimeInMillis(); } //取消定時任務(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(); //開啟倒計時,并設(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) { //倒計時提示文字 Log.i(TAG,"onTick time :"+millisUntilFinished); alertDialog.setMessage("將在"+(millisUntilFinished/1000)+"關(guān)機(jī)"); } @Override public void onFinish() { //倒計時結(jié)束 Log.i(TAG,"倒計時結(jié)束!"); alertDialog.dismiss(); //倒計時結(jié)束執(zhí)行定時的任務(wù) // shutdown(context); } }; timer.start(); } //shoutDown需要 系統(tǒng)權(quán)限才能執(zhí)行否則會提示權(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中聲明配置文件中聲明:
如實全部代碼實現(xiàn)定時任務(wù)
彈框需要如下權(quán)限:
< uses-permission android:name=”android.permission.SYSTEM_ALERT_WINDOW”/>
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android使用AudioRecord實現(xiàn)暫停錄音功能實例代碼
本篇文章主要介紹了Android使用AudioRecord實現(xiàn)暫停錄音功能實例代碼,具有一定的參考價值,有興趣的可以了解一下2017-06-06Android Retrofit實現(xiàn)多圖片/文件、圖文上傳功能
Retrofit是Square開發(fā)的一個Android和Java的REST客戶端庫。這個庫非常簡單并且具有很多特性,相比其他的網(wǎng)絡(luò)庫,更容易讓初學(xué)者快速掌握2017-03-03Android實現(xiàn)炫酷的網(wǎng)絡(luò)直播彈幕功能
這篇文章主要為大家詳細(xì)介紹了Android仿網(wǎng)絡(luò)直播彈幕功能的實現(xiàn)方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-11-11Android ContentProvider實現(xiàn)獲取手機(jī)聯(lián)系人功能
這篇文章主要為大家詳細(xì)介紹了Android ContentProvider實現(xiàn)獲取手機(jī)聯(lián)系人功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-07-07