Android編程實(shí)現(xiàn)添加低電流提醒功能的方法
本文實(shí)例講述了Android編程實(shí)現(xiàn)添加低電流提醒功能的方法。分享給大家供大家參考,具體如下:
特殊需求,檢測(cè)電流是否正常。
監(jiān)聽如下廣播:
Intent.ACTION_BATTERY_CHANGED
plugType = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0);
if(mLowElectricityRemind == null){
mLowElectricityRemind = new LowElectricityRemind(BatteryMeterView.this.getContext());
}
mLowElectricityRemind.changePlugType(plugType);
添加LowElectricityRemind類
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)容感興趣的讀者可查看本站專題:《Android硬件相關(guān)操作與應(yīng)用總結(jié)》、《Android文件操作技巧匯總》、《Android開發(fā)入門與進(jìn)階教程》、《Android資源操作技巧匯總》、《Android視圖View技巧總結(jié)》及《Android控件用法總結(jié)》
希望本文所述對(duì)大家Android程序設(shè)計(jì)有所幫助。
- Android4.4開發(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 開發(fā)之Dialog,Toast,Snackbar提醒
- Android開發(fā)之使用通知欄顯示提醒信息的方法
相關(guān)文章
gradle配置國(guó)內(nèi)鏡像的實(shí)現(xiàn)
這篇文章主要介紹了gradle配置國(guó)內(nèi)鏡像的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
NestScrollView嵌套R(shí)ecyclerView實(shí)現(xiàn)淘寶首頁滑動(dòng)效果
這篇文章主要介紹了NestScrollView嵌套R(shí)ecyclerView實(shí)現(xiàn)淘寶首頁滑動(dòng)效果,主要實(shí)現(xiàn)淘寶首頁嵌套滑動(dòng),中間tab吸頂效果,以及介紹NestScrollView嵌套R(shí)ecyclerView處理滑動(dòng)沖突的方法,需要的朋友可以參考下2021-12-12
Android中ViewPager你所不知道的優(yōu)化技巧分享
提到ViewPager想必各位同學(xué)一點(diǎn)都不陌生,它是Android中最常用的組件之一,這篇文章小編就帶大家一起來看看ViewPager一些新的優(yōu)化方式吧2024-04-04
Android RadioGroup多行顯示效果 解決單選問題
這篇文章主要為大家詳細(xì)介紹了Android RadioGroup多行顯示效果,解決單選問題,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11
Android開發(fā)實(shí)現(xiàn)圖片的上傳下載
這篇文章主要為大家詳細(xì)介紹了Android開發(fā)實(shí)現(xiàn)圖片的上傳下載,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-09-09
Android JNI處理圖片實(shí)現(xiàn)黑白濾鏡的方法
這篇文章主要介紹了Android JNI處理圖片實(shí)現(xiàn)黑白濾鏡的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-01-01
如何利用Android Studio將moudle變成jar示例詳解
這篇文章主要給大家介紹了關(guān)于如何利用Android Studio將moudle變成jar的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來跟著小編一起學(xué)習(xí)學(xué)習(xí)吧。2017-08-08
Android 簡(jiǎn)單的照相機(jī)程序的實(shí)例代碼
終于經(jīng)過多次找錯(cuò),修改把一個(gè)簡(jiǎn)單的照相機(jī)程序完成了,照相類代碼如下:2013-05-05

