Android編程實(shí)現(xiàn)添加低電流提醒功能的方法
本文實(shí)例講述了Android編程實(shí)現(xiàn)添加低電流提醒功能的方法。分享給大家供大家參考,具體如下:
特殊需求,檢測(cè)電流是否正常。
監(jiān)聽(tīng)如下廣播:
Intent.ACTION_BATTERY_CHANGED plugType = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0); if(mLowElectricityRemind == null){ mLowElectricityRemind = new LowElectricityRemind(BatteryMeterView.this.getContext()); } mLowElectricityRemind.changePlugType(plugType);
添加LowElectricityRemind類(lèi)
package com.android.systemui; import android.content.Context; import android.content.DialogInterface; import android.os.BatteryManager; import android.os.Handler; import android.util.Slog; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import com.android.systemui.statusbar.phone.SystemUIDialog; /** * add low electricity remind * Created by fanlj on 2017-2-18. */ public class LowElectricityRemind { private static final String TAG = LowElectricityRemind.class.getSimpleName(); private static final int LOW_ELECTRICITY_REMIND_DELAYED = 50000; private static final long REMIND_INTERVAL = 3 * 1000 * 60; //Three minutes private static final int MAX_CURRENT_COUNT = 3; private static final boolean DEBUG = true; private boolean isFirstInitialize = true; private Context mContext; private Handler mHandler; private int[] mCurrent = new int[MAX_CURRENT_COUNT]; private File mCurrentNowFile = null; private SystemUIDialog mRemidDialog; private long mLastPlugCurrent = 0; private long mLastRemindTime = 0; //if mRemidDialog is showed, mLastRemindTime != 0 private boolean isIgnore = false; LowElectricityRemind(Context context){ mContext = context; mHandler = new Handler(); mCurrentNowFile = new File("/sys/class/power_supply/battery/current_now"); } public void changePlugType(int type){ if(DEBUG) { Slog.e(TAG, "change plug type to " + type); } mHandler.removeCallbacks(lowElectricityRemindRunnable); if(type == BatteryManager.BATTERY_PLUGGED_AC || (DEBUG && type == BatteryManager.BATTERY_PLUGGED_USB)){ if(DEBUG) { Slog.e(TAG, "start runnable"); } if(isFirstInitialize){ isFirstInitialize = false; } mHandler.postDelayed(lowElectricityRemindRunnable, LOW_ELECTRICITY_REMIND_DELAYED); } else { cleanAllCache(); } } private Runnable lowElectricityRemindRunnable = new Runnable() { @Override public void run() { if(!needShowRemindDialog(true)){ postDelayed(); return; } boolean isFull = true; int cbattNow = readCurrent(); if(mLastPlugCurrent == cbattNow){ postDelayed(); return; } mLastPlugCurrent = cbattNow; if(mCurrent[MAX_CURRENT_COUNT - 1] != 0){ int minIndex = 0; int maxIndex = 0; for (int i = MAX_CURRENT_COUNT; i > 1; i--){ int curr = mCurrent[i]; if(mCurrent[minIndex] > curr){ minIndex = i; } if(mCurrent[maxIndex] < curr){ maxIndex = i; } } if(cbattNow < 0){ //In the charging int min = mCurrent[minIndex]; int max = mCurrent[maxIndex]; if((min < 0 && min < cbattNow) || (min > 0 && min > cbattNow)){ //-1600 < -1400 900 > 800 if true, replace min value. mCurrent[minIndex] = cbattNow; } else if((max < 0 && max < cbattNow) || (max > 0 && max > cbattNow)){ //-1600 < -1400 900 > 800 mCurrent[maxIndex] = cbattNow; } } } else { for (int i = 0; i < MAX_CURRENT_COUNT; i++){ if(mCurrent[i] == 0){ mCurrent[i] = cbattNow; if(i != MAX_CURRENT_COUNT - 1) { isFull = false; } else { isFull = true; } break; } } } //if(isFull && needShowRemindDialog(false)){ if(isFull && needShowRemindDialog(true)){ if(mRemidDialog == null){ mRemidDialog = new SystemUIDialog(mContext); mRemidDialog.setTitle(R.string.charge_current_warning_title); mRemidDialog.setPositiveButton(R.string.charge_current_warning_yes, null); mRemidDialog.setNegativeButton(R.string.charge_current_warning_ignore, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { isIgnore = true; } }); } if(DEBUG && mRemidDialog.isShowing()){ mRemidDialog.dismiss(); } if(!mRemidDialog.isShowing()){ String message = mContext.getString(R.string.charge_current_warning_content); if(DEBUG){ message += "\n"; for (int i = 0; i < MAX_CURRENT_COUNT; i++){ message += mCurrent[i]; message += " "; } } mRemidDialog.setMessage(message); mRemidDialog.show(); } //clean all save cleanAllCache(); mLastRemindTime = System.currentTimeMillis(); } postDelayed(); } }; private void postDelayed(){ mHandler.removeCallbacks(lowElectricityRemindRunnable); mHandler.postDelayed(lowElectricityRemindRunnable, LOW_ELECTRICITY_REMIND_DELAYED); } private void cleanAllCache(){ for (int i = 0; i < MAX_CURRENT_COUNT; i++){ mCurrent[i] = 0; } mLastPlugCurrent = 0; } /** * read battery current * @return battery current */ private int readCurrent(){ int cbattNow = 0; FileReader fileReader; BufferedReader br; try { fileReader = new FileReader(mCurrentNowFile); br = new BufferedReader(fileReader); cbattNow = Integer.parseInt(br.readLine()); cbattNow = cbattNow / 1000; //uA to mA br.close(); fileReader.close(); if(DEBUG) { Slog.e(TAG, "last plug current : " + cbattNow); } } catch (FileNotFoundException e) { Slog.e(TAG, "Failure in reading battery current", e); } catch (IOException e) { Slog.e(TAG, "Failure in reading battery current", e); } return cbattNow; } private boolean needShowRemindDialog(boolean filterData){ if(isIgnore){ return false; } boolean isNeedShow = true; if(!filterData){ for (int i = 0; i < MAX_CURRENT_COUNT; i++){ if(mCurrent[i] <= 0){ isNeedShow = false; break; } } } if(isNeedShow){ long currTime = System.currentTimeMillis(); if(DEBUG){ Slog.e(TAG, "mLastRemindTime = " + mLastRemindTime + " currTime = " + currTime); } if(mLastRemindTime == 0){ isNeedShow = true; } else if(mLastRemindTime + REMIND_INTERVAL <= currTime){ isNeedShow = true; } else{ isNeedShow = false; } } if(DEBUG){ Slog.e(TAG, "need show remind dialog = " + isNeedShow); } return isNeedShow; } }
更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《Android硬件相關(guān)操作與應(yīng)用總結(jié)》、《Android文件操作技巧匯總》、《Android開(kāi)發(fā)入門(mén)與進(jìn)階教程》、《Android資源操作技巧匯總》、《Android視圖View技巧總結(jié)》及《Android控件用法總結(jié)》
希望本文所述對(duì)大家Android程序設(shè)計(jì)有所幫助。
- Android4.4開(kāi)發(fā)之電池低電量告警提示原理與實(shí)現(xiàn)方法分析
- Android后臺(tái)定時(shí)提醒功能實(shí)現(xiàn)
- Android基于廣播事件機(jī)制實(shí)現(xiàn)簡(jiǎn)單定時(shí)提醒功能代碼
- android獲取情景模式和鈴聲 實(shí)現(xiàn)震動(dòng)、鈴聲提醒
- 詳解Android中Notification通知提醒
- Android編程設(shè)置提醒事件的方法
- Android高仿微信5.2.1主界面及消息提醒
- Android實(shí)現(xiàn)每天定時(shí)提醒功能
- Android提醒微技巧你真的了解Dialog、Toast和Snackbar嗎
- Android 開(kāi)發(fā)之Dialog,Toast,Snackbar提醒
- Android開(kāi)發(fā)之使用通知欄顯示提醒信息的方法
相關(guān)文章
gradle配置國(guó)內(nèi)鏡像的實(shí)現(xiàn)
這篇文章主要介紹了gradle配置國(guó)內(nèi)鏡像的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09NestScrollView嵌套R(shí)ecyclerView實(shí)現(xiàn)淘寶首頁(yè)滑動(dòng)效果
這篇文章主要介紹了NestScrollView嵌套R(shí)ecyclerView實(shí)現(xiàn)淘寶首頁(yè)滑動(dòng)效果,主要實(shí)現(xiàn)淘寶首頁(yè)嵌套滑動(dòng),中間tab吸頂效果,以及介紹NestScrollView嵌套R(shí)ecyclerView處理滑動(dòng)沖突的方法,需要的朋友可以參考下2021-12-12Android中ViewPager你所不知道的優(yōu)化技巧分享
提到ViewPager想必各位同學(xué)一點(diǎn)都不陌生,它是Android中最常用的組件之一,這篇文章小編就帶大家一起來(lái)看看ViewPager一些新的優(yōu)化方式吧2024-04-04Android RadioGroup多行顯示效果 解決單選問(wèn)題
這篇文章主要為大家詳細(xì)介紹了Android RadioGroup多行顯示效果,解決單選問(wèn)題,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11Android開(kāi)發(fā)入門(mén)之Service用法分析
這篇文章主要介紹了Android中Service用法,較為詳細(xì)的分析了Service的功能、相關(guān)函數(shù)使用及注意事項(xiàng),需要的朋友可以參考下2016-07-07Android開(kāi)發(fā)實(shí)現(xiàn)圖片的上傳下載
這篇文章主要為大家詳細(xì)介紹了Android開(kāi)發(fā)實(shí)現(xiàn)圖片的上傳下載,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-09-09Android JNI處理圖片實(shí)現(xiàn)黑白濾鏡的方法
這篇文章主要介紹了Android JNI處理圖片實(shí)現(xiàn)黑白濾鏡的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-01-01如何利用Android Studio將moudle變成jar示例詳解
這篇文章主要給大家介紹了關(guān)于如何利用Android Studio將moudle變成jar的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)跟著小編一起學(xué)習(xí)學(xué)習(xí)吧。2017-08-08Android 簡(jiǎn)單的照相機(jī)程序的實(shí)例代碼
終于經(jīng)過(guò)多次找錯(cuò),修改把一個(gè)簡(jiǎn)單的照相機(jī)程序完成了,照相類(lèi)代碼如下:2013-05-05