关于android开发的app中,特别是直播类型的app耗电的情况,所以一定要优化手机耗电方面的问题
先说一下app耗电的原因吧
第一,大数据量的传输;
第二,不停的在网络间切换
第三,解析大量的文本数据;
知道耗电原因了,那么就说一下相关的优化建议
1,在需要网络连接的程序中,首先检查网络连接是否正常,如果没有网络连接,那么就不需要执行相应的程序;
2,判断网络类型,针对特定的数据在特定的网络下请求:例如,大量数据传输的时候在wifi下请求;wifi下下载数据耗电量之后
2,3,4G的1/3
3,使用效率高的数据格式和解析方法,推荐使用JSON
4,在进行大数据量下载时,尽量使用GZIP方式下载;
5,使用推送,代替循环请求
6,其他:
尽量不用使用浮点运算;
回收java对象,特别是较大的java对象,使用reset方法;
主动回收java对象,特别是较大的,例如bitmap,减少GC的工作效率;
避免内存抖动,内存抖动是因为大量的对象呗创建又在短时间内马上被释放;
避免在for循环,onDraw方法中创建对象;无法避免的可以创建对象池,然后再不使用的时候释放
对定位要求不是太高的话,尽量不要使用GPS定位,可以使用wifi和移动网络cell定位即可
获取屏幕尺寸等信息可以使用缓存技术,不需要多次进行请求
使用AlarmManager来定时情动服务替代使用sleep方式的定时任务
4,限制app对电量的影响:
当没有网络连接的时候,禁用后台服务更新
当电池电量过低时,减少更新的频率,确保自己的app对电池的影响降到最低
检查是否在充电
<receiver android:name=".PowerConnectReceiver">
<intent-filter>
<action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
<action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/>
</intent-filter>
</receiver>
public class PowerConnectionReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING || status == BatteryManager.BATTERY_STATUS_FULL;
int chargeFlag = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
boolean usbCharge = chargeFlag == BATTERY_PLUGGED_USB;
boolean acCharge = chargeFlag == BATTERY_PLUGGED_AC;
}
}
//获取程序是否充电
int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS,-1);
boolean isCharging = (status == BatteryManager.BATTERY_STATUS_CHARGING||status == BatteryManager.BATTERY_STATUS_FULL);
// 充电方式,usb还是电源
int chargeFlag = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
boolean usbCharge = chargeFlag == BATTERY_PLUGGED_USB;
boolean acCharge = chargeFlag == BATTERY_PLUGGED_AC;
不断的检测电量也会影响电池的使用时间,我们也可以这样做
<receiver android:name=".BatteryLevelReceiver">
<intent-filter>
<action android:name="android.intent.action.ACTION_BATTERY_LOW"/>// 电量过低
<action android:name="android.intent.action.ACTION_BATTERY_OKAY"/>
</intent-filter>
</receiver>
使用JobScheduler合理分配任务
写一个JobService
public class MyJobService extend sJobService {
private static final String LOG_TAG="MyJobService";
@Override
public void onCreate() {
super.onCreate();
Log.i(LOG_TAG,"MyJobServicecreated");
}
@Override
public void onDestroy() {
super.onDestroy();
Log.i(LOG_TAG,"MyJobServicedestroyed");
}
@Override
public boolean onStartJob(JobParameters params) {
Log.i(LOG_TAG,"Totallyandcompletelyworkingonjob"+params.getJobId());
if(isNetworkConnected()) {
new SimpleDownloadTask().execute(params);
return true;
} else {
Log.i(LOG_TAG,"Noconnectiononjob"+params.getJobId()+";sadface");
}
returnfalse;
}
@Override
public boolean onStopJob(JobParameters params) {
Log.i(LOG_TAG,"Whelp,somethingchanged,soI'mcallingitonjob"+params.getJobId());
return false;
}
private boolean isNetworkConnected() {
ConnectivityManager manager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = manager.getActiveNetworkInfo();
return(networkInfo!=null&&networkInfo.isConnected());
}
}
private class SimpleDownloadTask extends AsyncTask<JobParameters,Void,String> {
protected JobParameters mJobParam;
@Override
protected String doInBackground(JobParameters...params) {
mJobParam = params[0];
InputStream is=null;
try {
int len=50
URL url=new URL("https://www.google.com");
HttpURLConnection conn=(HttpURLConnection)url.openConnection();
conn.setReadTimeout(10000);//10sec
conn.setConnectTimeout(15000);//15sec
conn.setRequestMethod("GET");
conn.connect();
int responseCode=conn.getResponseCode();
Log.d(LOG_TAG,"Theresponseis:"+responseCode);
is=conn.getInputStream();
Reader reader = new InputStreamReader(is,"UTF-8");
char[] buffer=new char[len];
reader.read(buffer);
return new String(buffer);
} catch(IOExceptione) {
return"Unabletoretrievewebpage.";
}
}
@Override
protected void onPostExecute(String result) {
jobFinished(mJobParam,false);
Log.i(LOG_TAG,result);
}
}
public class FreeTheWakelockActivity extends ActionBarActivity {
public static final String LOG_TAG="FreeTheWakelockActivity";
TextView mWakeLockMsg;
ComponentName mServiceComponent;
@Override
protected void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_wakelock);
mWakeLockMsg = (TextView)findViewById(R.id.wakelock_txt);
mServiceComponent = new ComponentName(this,MyJobService.class);
Intent startServiceIntent = new Intent(this,MyJobService.class);
startService(startServiceIntent);
Button btn = (Button)findViewById(R.id.wakelock_poll);
btn.setText(R.string.poll_server_button);
btn.setOnClickListener(new View.OnClickListener() {
@Override
publicvoidonClick(Viewv) {
pollServer();
}
});
}
public void pollServer() {
JobScheduler scheduler = (JobScheduler)getSystemService(Context.JOB_SCHEDULER_SERVICE);
for(int i=0; i<10; i++) {
JobInfo jobInfo=new JobInfo.Builder(i,mServiceComponent)
.setMinimumLatency(5000)//5seconds
.setOverrideDeadline(60000)//60seconds(for brevity in the sample)
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)//WiFi or data connections
.build();
mWakeLockMsg.append("Schedulingjob"+i+"!n");
scheduler.schedule(jobInfo);
}
}
}