android开发中对于手机电量的优化

 关于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);
	}
}
然后模拟通过点击Button触发N个任务,交给JobService来处理:

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);
		}
	}
}





猜你喜欢

转载自blog.csdn.net/u011228868/article/details/79218373