Android项目开发前准备工作(三)

     让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


  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

红-旺永福

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值