android監聽電量
Ⅰ Android 怎樣控制電量百分比是否顯示
我的Android版本是5.1。
我是這樣去實現的:
首先-----》我在priv-app/Settings裡面的battery裡面加一條SwitchPreference,這個是是否顯示的開關。
通過這個開關將值寫入資料庫中。然後SystemUI就可以取到這個值控制是否顯示
這個battery控制界面是PowerUsageSummary,它是一個PreferenceFragment。
它的界面的繪制是通過好幾種途徑,最後都通過addPreference加到一個PreferenceGroup裡面了。
然後-----》我需要改frameworks層的東西,
1>在android.provider.Settings類的System下面加一個String類型的名字,
System對應的是資料庫的名字
例如BATTERY_POWER_PERCENTAGE
2>要修改SettingsProvider這個應用,它是Settings的資料庫管理應用,
主要提供了一系列操作資料庫的方法,先在defaults.xml裡面添加一個integer變數,
給他一個初始值0,0對應不顯示,1對應顯示。然後找打DatabaseHelper這個類,
它是一個sqliteOpenHelper,它封裝了一系列操作sqlite資料庫的方法,
我們在loadSystemSettings方法裡面可以將直接在defaults.xml定義的值寫入資料庫。
3>我們要修改SystemUI這個應用,看過源碼才知道,其實狀態欄是分3個顯示的,
鎖屏的時候是一個,對應的類是KeyguardStatusBarView,它是一個RelativeLayout,
對應的布局是Keyguard_status_bar.xml
進入後是一個,對應的類是PhoneStatusBar,它是BaseStatusBar的子類
對應的布局是status_bar.xml.xml
下拉通知菜單的時候又是一個,對應的類是StatusBarHeaderView,它是一個RelativeLayout
它對應的布局是Status_bar_expanded_header.xml
要想監聽到電量的變化,必須實現BatteryController.BatteryStateChangeCallback這個介面,
它有兩個方法,其中onBatteryLevelChanged方法就是監聽電量變化的
BatteryController是一個BroadcastReceiver,當電量變化時可以收到
PowerManager.ACTION_POWER_SAVE_MODE_CHANGED這個action,
這時就會走onBatteryLevelChanged方法,所有我們只要實現這個介面就可以監聽到。
KeyguardStatusBarView和StatusBarHeaderView是有實現的,所以在這里我將
PhoneStatusBar也實現了這個介面。當然這不是控制電量百分比是否顯示,
在設置裡面我們已經加了一個控制開關,它會將值寫入資料庫,我們在PhoneStatusBar
類中只需要寫一個ContentObserver來監聽改變來控制,其實這個百分比是一個textview,
PhoneStatusBar對應的布局是status_bar.xml,在裡面加一個textview在自定義電池圖標的下面,
在代碼中只需要用setVisibility方法就可以控制。
KeyguardStatusBarView也是一樣這樣實現。
好了說了這么多,其實要編譯和push的有4個東西,frameworks.jar Setting.apk
SettingsProvider.apk SystemUI.apk
Ⅱ Android開發中 在Activity中 如何實時監聽 Service 中某個變數的變化
舉個例子你會理解的更快:X, Y兩個listview,X里有1,2,3,4這4個item,Y里有a,b,c,d這4個item。
如果你點了b這個item。如下:
public void onItemClick (AdapterView<?> parent, // parent相當於listview Y適配器的一個指針,可以通過它來獲得Y里裝著的一切東西,再通俗點就是說告訴你,你點的是Y,不是X - -、
View view, // view是你點b item的view的句柄,就是你可以用這個view,來獲得b里的控制項的id後操作控制項
int position, // position是b在Y適配器里的位置(生成listview時,適配器一個一個的做item,然後把他們按順序排好隊,在放到listview里,意思就是這個b是第position號做好的)
long id // id是b在listview Y里的第幾行的位置(很明顯是第2行),大部分時候position和id的值是一樣的,如果需要的話,你可以自己加個log把position和id都弄出來在logcat里瞅瞅,看了之後心裡才踏實
)
Ⅲ Flutter與Android通信的三種方式
一、 MethodChannel
主要是flutter端調用android方法。flutter調取android方法,也可以android主動跟flutter通信,但是這個只能是傳遞數據,不是調方法。MethodChannel的flutter調取android方法,我之前寫過,可以查看如下鏈接, https://www.jianshu.com/p/6b677ff3350e
Android主動跟flutter通信,如下
二、 BasicMessageChannel
它是可以雙端通信的,flutter端可以給Android發送消息,Android也可以給Flutter發送消息。
三、EventChannel
只能是原生發送消息給Flutter端,例如監聽手機電量變化,網路變化,感測器等。
列印結果如下:
總結一下:
MethodChannel 用於傳遞方法調用(method invocation),是flutter調取原生方法的,也可以原生主動傳遞數據給Flutter。
BasicMessageChannel 用於傳遞字元串和半結構化的信息。是兩個端相互發送數據,接收數據的。
EventChannel 用於數據流(event streams)的通信。通長用於Nativie向flutter的通信,如:手機電量變化,網路連接變化,陀螺儀,感測器等;
tip:多種類型的通道混用可能會出現報錯問題。
Ⅳ 有沒有什麼方法能夠快速,實時的獲取android手機的電量值
這個是獲取android電量的DEMO:
package com.android.batterywaster;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.BatteryManager;
import android.os.Bundle;
import android.os.PowerManager;
import android.view.View;
import android.widget.CheckBox;
import android.widget.TextView;
import java.text.DateFormat;
import java.util.Date;
/**
* So you thought sync used up your battery life.
*/
public class BatteryWaster extends Activity {
TextView mLog;
DateFormat mDateFormat;
IntentFilter mFilter;
PowerManager.WakeLock mWakeLock;
SpinThread mThread;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Set the layout for this activity. You can find it
// in res/layout/hello_activity.xml
setContentView(R.layout.main);
findViewById(R.id.checkbox).setOnClickListener(mClickListener);
mLog = (TextView)findViewById(R.id.log);
mDateFormat = DateFormat.getInstance();
mFilter = new IntentFilter();
mFilter.addAction(Intent.ACTION_BATTERY_CHANGED);
mFilter.addAction(Intent.ACTION_BATTERY_LOW);
mFilter.addAction(Intent.ACTION_BATTERY_OKAY);
mFilter.addAction(Intent.ACTION_POWER_CONNECTED);
PowerManager pm = (PowerManager)getSystemService(POWER_SERVICE);
mWakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "BatteryWaster");
mWakeLock.setReferenceCounted(false);
}
@Override
public void onPause() {
stopRunning();
}
View.OnClickListener mClickListener = new View.OnClickListener() {
public void onClick(View v) {
CheckBox checkbox = (CheckBox)v;
if (checkbox.isChecked()) {
startRunning();
} else {
stopRunning();
}
}
};
void startRunning() {
log("Start");
registerReceiver(mReceiver, mFilter);
mWakeLock.acquire();
if (mThread == null) {
mThread = new SpinThread();
mThread.start();
}
}
void stopRunning() {
log("Stop");
unregisterReceiver(mReceiver);
mWakeLock.release();
if (mThread != null) {
mThread.quit();
mThread = null;
}
}
void log(String s) {
mLog.setText(mLog.getText() + "\n" + mDateFormat.format(new Date()) + ": " + s);
}
BroadcastReceiver mReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
String title = action;
int index = title.lastIndexOf('.');
if (index >= 0) {
title = title.substring(index + 1);
}
if (Intent.ACTION_BATTERY_CHANGED.equals(action)) {
int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
int icon = intent.getIntExtra(BatteryManager.EXTRA_ICON_SMALL,-1);
log(title + ": level=" + level + "\n" + "icon:" + icon);
} else {
log(title);
}
}
};
class SpinThread extends Thread {
private boolean mStop;
public void quit() {
synchronized (this) {
mStop = true;
}
}
public void run() {
while (true) {
synchronized (this) {
if (mStop) {
http://www.dewen.io/q/1428
wipe電池如下:
1、把電池充滿,充滿滿的,在開機狀態下沖到滿,然後拔下充電器,手機關機,再插上充電器充電,直至再次顯示充滿,拔下充電器,開機再充電,這樣反復幾次就能把電池充到盡量滿的狀態。
2、然後關機,開機進入Recovery模式。
選擇advanced(高級功能) -> wipe battery stats(清空電池狀態)->yes(是)
然後++++ Go Back(返回上級) ++++ --> - reboot system now(重啟系統) -
Ⅳ Android 中流量,電量,弱網環境怎麼測
用Charles工具做弱網的測試,或者模擬2G、3G的網路情況。
通過抓包是流量測試直接的方法。在App運行器件,把手機收發的所有報文抓取下來,在計算收發報文總大小,即app消耗的流量。如果我們需要測試某個app消耗 的流量需要禁用其他app的連網許可權。
1)限制其他app的連網許可權,因為有些app的進程是常駐後台的,即使不運行,也會有網路報文。可以藉助一些手機管家軟體禁用網路。
2)手機上抓包,下載tcpmp,手機鏈接電腦,獲得root許可權
3)將tcpmp(forAndroid)上傳至android手機上,在命令提示符窗口中輸入命令:adbpush <LocalPath of tcpmp> /data/local/tcpmp
4)給tcpmp增加可執行許可權
adb shell
su
chmod 6755 /data/local/tcpmp
5)啟動抓包,使用命令/data/local/tcpmp-v -i any -s 0 -w /sdcard/zhangyu.pcap
Got後面的數字表示當前抓到的包的數量。如果有變化,表示有網路流量
6)導出抓包結果adb pull /sdcard/zhangyu.pcap <LocalPathof PcapFile >
7)用Wireshark打開剛才的抓包結果,點擊StatisticsàSummary,流量的數值為Bytes一行的Displayed一欄。
Ⅵ android 系統里是間隔多長時間去更新電池信息的。在代碼里哪部份實現的呢
這個時間不固定吧。如果系統的監聽器監聽到電量發生不會,就會發布廣播的。
private OnCheckedChangeListener listener=new OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
// TODO Auto-generated method stub
if(isChecked){
registerReceiver(myBroadcast, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
}else{
bar.setProgress(0);
unregisterReceiver(myBroadcast);
}
}
};
Ⅶ android怎麼充電時檢測電池電量
撥號界面輸入*#*#4636#*#*進入手機信息選擇電池信息,可以看到電池相關信息包括電壓,電池容量,溫度等信息。