让Android融入我的生活!
前两篇博客介绍了一些大的方面,本篇博客给大家说一些小的细节,对于提升我们APP的体验和性能也是很重要的,当然这些细节性的工作,大家就放在后期作就可以了!
1:一些可以通用的UI、操作、数据处理放在BaseActivity中,这样可以非常方便的管理,而且可以减少代码量
package com.uhuibao.hupeng;
/**
* @ClassName: BaseFragmentActivity
* @Description: TODO Fragment基础类,Activity基础类,所有Activity的实现类均继承此基础类
* @author huangmz
* @date 2014-12-16 上午9:31:41
*/
import java.io.File;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.graphics.Bitmap;
import android.graphics.Rect;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.os.Vibrator;
import android.support.v4.app.FragmentActivity;
import android.view.View;
import android.view.Window;
import com.uhuibao.hupeng.config.Commons;
import com.uhuibao.hupeng.config.Constants;
import com.uhuibao.hupeng.me.FeedBackActivity;
import com.uhuibao.hupeng.selectpic.BitmapUtils;
import com.uhuibao.hupeng.utils.SharedPreUtils;
import com.uhuibao.hupeng.utils.StorageUtils;
import com.umeng.analytics.MobclickAgent;
public class BaseFragmentActivity extends FragmentActivity implements
SensorEventListener {
private SensorManager sensorManager;
// 是否正在摇动手机
private boolean flag = true;
// 倒计时器
private CountDownTimer cTimer;
// 声明震动
private Vibrator vibrator;
// 震动停止 开启 时长
private static long[] pattern = { 10, 100 };
private int sensorCount = 0;
@Override
protected void onCreate(Bundle arg0) {
// TODO Auto-generated method stub
super.onCreate(arg0);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
initSensor();
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
MobclickAgent.onResume(this); //友盟统计时长
MobclickAgent.onPageStart(getClass().getSimpleName()); //友盟统计页面
sensorManager.registerListener(this,
sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_NORMAL);
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
MobclickAgent.onPause(this);
MobclickAgent.onPageEnd(getClass().getSimpleName()); // 保证 onPageEnd 在onPause 之前调用,因为 onPause 中会保存信息
sensorManager.unregisterListener(this);
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
sensorManager.unregisterListener(this);
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
}
/**
* 返回按钮事件
*
* @param v
* 返回按钮控件
*/
public void onBackClick(View v) {
finish();
}
private void initSensor() {
// 震动
vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
// 摇一摇
sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
cTimer = new CountDownTimer(2000, 2000) {
public void onTick(long millisUntilFinished) {
}
public void onFinish() {
flag = true;
}
};
}
@Override
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
if(BaseApplication.getApp().mUser.getUserinfoid()==0){
return;
}
int sensorType = event.sensor.getType();
float[] values = event.values;
// values[0]:X轴,values[1]:Y轴,values[2]:Z轴
if (sensorType == Sensor.TYPE_ACCELEROMETER) {
if ((Math.abs(values[0]) > Constants.Sensitivity
|| Math.abs(values[1]) > Constants.Sensitivity || Math
.abs(values[2]) > Constants.Sensitivity) && flag == true) {
if (sensorCount >= 2) {
// 标志位设为false,之后在计时器里面改为true,这样的目的是解决连续摇一摇连续执行的问题
boolean isHack = SharedPreUtils.getInstance().getBoolean(
Constants.xmlIsHack, true);
if (!isHack) {// 摇一摇开关
return;
}
sensorCount = 0;
flag = false;
cTimer.start();
// 震动
vibrator.vibrate(pattern, -1);
takeScreenShot();
startActivity(new Intent(this, FeedBackActivity.class).putExtra(
"type", 0));
} else {
sensorCount++;
}
}
}
}
@SuppressWarnings("deprecation")
private void takeScreenShot() {
Activity activity = BaseFragmentActivity.this;
// View是你需要截图的View
View view = activity.getWindow().getDecorView();
view.setDrawingCacheEnabled(true);
view.buildDrawingCache();
Bitmap b1 = view.getDrawingCache();
// 获取状态栏高度
Rect frame = new Rect();
activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
int statusBarHeight = frame.top;
System.out.println(statusBarHeight);
// 获取屏幕长和高
int width = activity.getWindowManager().getDefaultDisplay().getWidth();
int height = activity.getWindowManager().getDefaultDisplay().getHeight();
int contentTop = activity.getWindow()
.findViewById(Window.ID_ANDROID_CONTENT).getTop();
// statusBarHeight是上面所求的状态栏的高度
int titleBarHeight = contentTop - statusBarHeight;
int cutHeight = titleBarHeight + statusBarHeight;
int bHeight = b1.getHeight();
int nHeight = height - cutHeight;
//
if ((cutHeight + nHeight) > bHeight) {
nHeight = bHeight - cutHeight;
}
// 去掉标题栏
// Bitmap b = Bitmap.createBitmap(b1, 0, 25, 320, 455);
Bitmap b = Bitmap.createBitmap(b1, 0, cutHeight, width, nHeight);
Constants.screenImg = Bitmap.createBitmap(b1, 0, cutHeight, width, nHeight);
// java.lang.IllegalArgumentException: y + height must be <= bitmap.height()
// Bitmap source, int x, int y, int width, int height
File imageFile=StorageUtils.getImageDir();
BitmapUtils.saveBitmap2file(b, imageFile.getPath());
Commons.freeBmp(b);
view.destroyDrawingCache();
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}
}
2:开发前,要尽可能大的考虑到本地的缓存机制的使用,使用好缓存,对提升我们APP的性能有非常大的帮助,但是这一点要提醒一下大家,是
在使用好的前提下,如果使用不好,那么会导致特别多的问题,请大家谨慎!
3:项目整体框架尽量用现有的,因为市场上现在的框架是前人总结好的,且经过很多改进,非常方便,功能也非常强大,在这里给大爱推荐一些
比如XUtils、KJLibrary、Volley、SYNC-Http、Afinal、thinkAndroid,其中着重给大家推荐Xutils和KJLibrary,因为这两款框架中集成了特别多的功能
,有网络请求、图片处理、数据库存储等等,非常好用!
4:注意自己APP布局优化,这些就是提升我们APP性能的细节方面了,因为Davlik在加载应用时,解析XML也是需要时间的,优化XML布局,将
节省更多时间,具体的可以参看
http://blog.csdn.net/ZZ7ZZ7ZZ/article/details/9175141