android项目《刷刷手环》代码review

很多程序很多程序猿可能会和我一样,当公司开发项目时,完成功能是第一位,从而总会出现这样的话,这里应该可以写的更好,下版本再说。最近项目接近尾声,感觉需要重新审视一下这个项目,这应该是提升自己和优化项目的最好的办法之一。

废话结束。。。。

一、分享

方案一:直接使用友盟分享

http://dev.umeng.com/social/android/quick-integration

方案二:分别调用各个平台的sdk


 1、分享朋友圈和微信
private void regToWx() {
		api = WXAPIFactory.createWXAPI(this, APP_ID, true);// 获得IWXAPI实例
		api.registerApp(APP_ID);
	}
//分享微信
	private void sendReq(boolean ryan) {
		regToWx();
		Bitmap bmp = captureWebView(wb);
		WXImageObject imgObj = new WXImageObject(bmp);
		WXMediaMessage msg = new WXMediaMessage();
		msg.mediaObject = imgObj;
		Bitmap thumbBmp = Bitmap.createScaledBitmap(bmp, 80, THUMB_SIZE, true);
		bmp.recycle();
		msg.thumbData = Util.bmpToByteArray(thumbBmp, true);
		SendMessageToWX.Req req = new SendMessageToWX.Req();
		req.transaction = getTransaction();
		req.message = msg;
		req.scene = SendMessageToWX.Req.WXSceneSession;
		api.sendReq(req);
	}
//分享朋友圈
	private void sendReqa() {
		regToWx();
		Bitmap bmp = captureWebView(wb);
		WXImageObject imgObj = new WXImageObject(bmp);
		WXMediaMessage msg = new WXMediaMessage();
		msg.mediaObject = imgObj;
		Bitmap thumbBmp = Bitmap.createScaledBitmap(bmp, 80, THUMB_SIZE, true);
		bmp.recycle();
		msg.thumbData = Util.bmpToByteArray(thumbBmp, true);
		SendMessageToWX.Req req = new SendMessageToWX.Req();
		req.transaction = getTransaction();
		req.message = msg;
		req.scene = SendMessageToWX.Req.WXSceneTimeline;
		api.sendReq(req);
	}

/**
 * 截屏--当前屏幕
 * @param context
 * @return
 */
   private Bitmap captureScreen(Activity context){
     View cv = context.getWindow().getDecorView();
     Bitmap bmp = Bitmap.createBitmap(cv.getWidth(), cv.getHeight(),Config.ARGB_8888);
     Canvas canvas = new Canvas(bmp);
     cv.draw(canvas);
     return bmp;  

/**
	 * 截取webView快照(webView加载的整个内容的大小)
	 *
	 * @param webView
	 * @return
	 */
	public static Bitmap captureWebView(WebView webView) {
		Picture snapShot = webView.capturePicture();
		Bitmap bmp = Bitmap.createBitmap(snapShot.getWidth(),
				snapShot.getHeight(), Bitmap.Config.ARGB_8888);
		Canvas canvas = new Canvas(bmp);
		snapShot.draw(canvas);
		return bmp;
	}

2、新浪分享

第一步:下载新浪sdk

第二步:到新浪公共账号平台申请开发者账号  获取appid

private void sendMultiMessage() {
		// 1. 初始化微博的分享消息
		WeiboMultiMessage weiboMessage = new WeiboMultiMessage();
		weiboMessage.mediaObject = getImageObj();
		weiboMessage.textObject = getTextObj();
		// 2. 初始化从第三方到微博的消息请求
		SendMultiMessageToWeiboRequest request = new SendMultiMessageToWeiboRequest();
		// 用transaction唯一标识一个请求
		request.transaction = String.valueOf(System.currentTimeMillis());
		request.multiMessage = weiboMessage;
		// 3. 发送请求消息到微博,唤起微博分享界面
		weiboApi.sendRequest(request);
	}
	/**
	 * 创建文本消息对象。
	 *
	 * @return 文本消息对象。
	 */
	private TextObject getTextObj() {
		TextObject textObject = new TextObject();
		textObject.text = "分享图片";
		return textObject;
	}
	/**
	 * 创建图片消息对象。
	 *
	 * @return 图片消息对象。
	 */
	private ImageObject getImageObj() {
		ImageObject imageObject = new ImageObject();
		Bitmap bmp = captureWebView(wb);
		imageObject.setImageObject(bmp);
		return imageObject;
	}
private String getTransaction() {
		final GetMessageFromWX.Req req = new GetMessageFromWX.Req(bundle);
		return req.transaction;
	}

二、dialog和popupwindow的使用

1、dialog的使用

private void UpdateVersiondialog(String title, String text, String yes,
			String no, final Integer isUpdateNewestVersion,
			final Integer nowSystemNum) {
		CustomDialog.Builder ibuilder = new CustomDialog.Builder(getActivity());

		ibuilder.setTitle(title);
		ibuilder.setMessage(text);
		ibuilder.setPositiveButton(yes, new DialogInterface.OnClickListener() {
			@Override
			public void onClick(DialogInterface dialog, int which) {

				//ok 后的操作
				dialog.dismiss();

			}
		});
		ibuilder.setNegativeButton(no, new DialogInterface.OnClickListener() {
			@Override
			public void onClick(DialogInterface dialog, int which) {
				// 随机绑定
				dialog.dismiss();

				<pre name="code" class="plain">//ok 取消的操作

}});CustomDialog dialog = ibuilder.create();dialog.show();dialog.setCanceledOnTouchOutside(false);//屏蔽背景的触发

dialog.setCancelable(false);//屏蔽返回按钮的触发}


2、popupwindow的使用

1、为PopupWindow的view布局,通过LayoutInflator获取布局的view.如:
LayoutInflater inflater =(LayoutInflater)
this.anchor.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View textEntryView =  inflater.inflate(R.layout.paopao_alert_dialog, null);

2、显示位置,可以有很多方式设置显示方式
pop.showAtLocation(findViewById(R.id.ll2), Gravity.LEFT, 0, -90);
或者
pop.showAsDropDown(View anchor, int xoff, int yoff)

3、进出场动画
pop.setAnimationStyle(R.style.PopupAnimation);

4、点击PopupWindow区域外部,PopupWindow消失
   this.window = new PopupWindow(anchor.getContext());

this.window.setTouchInterceptor(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction() ==MotionEvent.ACTION_OUTSIDE) {
BetterPopupWindow.this.window.dismiss();
return true;
}
return false;
}
});

两者区别:

PopupWindow与Dialog不同之处在于PopupWindow弹出时背景Activity仍可以获取焦点(PopupWindow setFocusable(
false) 除外),设置SetFocusable(true)后,与Dialog相似,并且不能接收按键事件。

       如果要使PopupWindow能响应按键事件或点击背景Activity以关闭弹出对话框 最简单的方法是使用setBackgroundDrawable()
,或者使用能创建Background的构造方法 这是因为当设置了background后会将contentView放在一个PopupViewContainer类的容器
中交给WindowManager,PopupViewContainer是PopupView的内部类,实现了对按键及Touch事件的处理。当然不设background自
己通过set对最外层contentView调用setOnKeyListener(),setOnTouchListener()也可实现。
这里当键盘出来时,原布局并没有压缩。

待续中............................

待续中............................

待续中............................

三、slidingmenu的使用

四、fragment和radiogroup组合实现tabhost

五、图片listview 缓存处理。优化图片缓存、图片加载优化、图片加载队列根据当前滑动的位置优先加载

六、起始页的处理viewpager

七、andorid中通过webview通过js调用highcharts 展示各类图表

八、viewPager+滑动条实现两页头部按钮来回切换,viewpager滑动时选项卡的下滑线动画滑动,可以尝试用 actionbar+viewpager来实现

九、下拉刷新,使用listview的下拉刷新 ,开源库PullToRefreshListView,在android19版本上提供了新的下拉刷新的api

十、小图标适应各种兼容,考虑使用 icomoon 图标通过字符串处理

十一、头像圆形处理。可以通过xml覆盖一层圆角,或者通过集成view重新onDraw重画

十二、身高、日期、年龄选项卡的更好展示方案

十三、分享当前页。原理:将当前的view 设置存到缓存cache中然后 measure 得到缓存当前的view的 bitmap

十四、声音、震动的提醒

十五、通知接收,暂时用的是轮询,考虑自己使用长连接实现通知,通过心跳包来保持连接考虑断网等情况

十六、我的目标中进度条的切换

十七、调用手机相册设置头像

十八、gif图片的加载

十九、activity上下左右滑出动画

二十、数据存储:application保存全局变量、shareperefence存储数据到文件中、sqlite保存数据库、intent  blind对象传递数值(特殊对象可以考虑转成base64存储)、content provider 好像该项目中没用到

二十一、service  broadcast  notification 的使用

时间: 2024-10-24 06:49:27

android项目《刷刷手环》代码review的相关文章

Arcgis For Android项目代码proguard混淆问题总结

一.普通Android项目代码混淆(项目中不包含第三方类库) 步骤1:在project.properties文件中,把下面这段话注释去掉: proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt 二.对于Arcgis For Android项目进行混淆时,由于使用arcgis的第三方类库,对项目混淆时需要对第三方类库进行排除. 步骤1:在project.properties文件中,把下

Android网络项目课程笔记-----代码复用性

复用 为了复用而写代码,代码量是1.6倍 What: 一份代码多处使用 style AsyncTask IntentService ListActivity 工具类 组件 why: 1) 性能提升 2) 可维护性 3) 可扩展性 复用滑动Tabs 使用到的技术: 抽象(封装.继承.多态) 把重复的变为方法体,不同的变为参数 目的:为了提高可维护性 抽象,API GoogleStyle下拉刷新 开源项目:SmoothProgressBar-master ActionBar-PullToRefres

Android 项目代码重构思想总结

代码重构的根本思想是模块化.灵活性.高内聚.低耦合. Android 项目代码重构: 将与业务逻辑无关的公共基本资源.工具类等等抽取到一个lib 工程中,主程序中只放与业务逻辑相关的代码和工具类: 1.将公共资源类进行抽取,包括: string.xml color.xml styel.xml drable  中自定义的shap .selector.anim 这些资源基本是和程序业务逻辑无关的,将其放到主工程中只会增加代码量影响对程序业务逻辑的理解. 工程项目所特有的资源可以采取继承于lib库工程

android项目SVN代码管理问题

用svn控制版本,svn本身是不会识别哪些该传,哪些不该传,这就导致有些关于路径的东西(比如拓展jar的路径)也被上传了,而当别人下载后,那个路径对于这个人可能完全不存在,项目编译就会出问题.用eclipse安装了svn插件,不能一股脑把android项目都传上去. Android项目有以下文件内容不需要添加到版本控制: bin目录 gen目录 .classpath文件 .project文件 要想在eclipse里屏蔽它们,需要这样操作: Click on Window -> Preferenc

Android项目svn代码管理问题[转]

用svn控制版本,svn本身是不会识别哪些该传,哪些不该传,这就导致有些关于路径的东西(比如拓展jar的路径)也被上传了,而当别人下载后,那个路径对于这个人可能完全不存在,项目编译就会出问题.用eclipse安装了svn插件,不能一股脑把android项目都传上去. Android项目有以下文件内容不需要添加到版本控制: bin目录 gen目录 .classpath文件 .project文件 要想在eclipse里屏蔽它们,需要这样操作: Click on Window -> Preferenc

之前的Android项目报错,新建Android项目报错,代码中找不到错误解决方案

打开一年前的东西,结果发现里面的android项目全部有个红叉,也找不到错误.新建一个项目也报错,首先确定自己的环境应该没问题,然后通过查看网上的资料,发现可能是debug的keystore到期啦. 通过网上资料的引导,做以下操作: 1.进入C:\Documents and Settings\Administrator\.android 删除路径下的debug.keystore及 ddms.cfg(我只删除了debug.kestore也可以.网上说两个都删除).(不同环境下的目录可能略有不同,可

Android项目---ActivityGroup的使用

ActivityGroup在一年前已经被说明不用了,但是腾讯QQ,新浪微博上也不乏ActivityGroup的身影.所以,即使是过时的东西,也有学习的必要,当然项目中也是可以添加的.在网上找了一个博客,不过还是想自己理解一下其中的因原.http://www.cnblogs.com/answer1991/archive/2012/05/08/2489844.html mainactivity.xml <?xml version="1.0" encoding="utf-8&

&#167;1.2 Android项目结构及“Hello World”应用解析

书接上文,我们创建一个新的Android项目,进入Android Studio开发页面,如下图: 左侧为项目工具窗口,通过项目工具窗口可以管理整个项目的相关文件右侧为代码编辑区,我们可以在这里进行Android程序的开发工作底部为调试区,在调试区可以进行程序的断点调试.日志打印,可以监视整个程序的内存消耗,从而有针对性的进行性能优化. 首先,通过查看左侧的项目工具窗口区,为大家介绍一个Android项目的基本结构: 如上图所示,在这里我们只需要关注图中app目录下的内容: build目录:构建目

Android项目导入error---SoftwareTestingHomework1

一.问题及分析 在做Android项目时,不可避免的需要将现成的代码直接导入Eclipse项目中.但是在导入过程中经常会出现正常的代码现在连导入包都会出错,情况如下: 经过比对正常项目的树和不正常项目的树,如图: 不正常项目的树:                      正常项目的树:              正常的项目比不正常的项目多了一个Android2.2的包. 二.解决方案 Android右击 -> Build Path -> Configure Build Path,在侧边栏里选

修改Eclipse中Android项目默认模板

修改Android新建项目Java代码模板 进入%ANDROIDHOME%\tools\templates\activities\BlankActivity\root\src\apppackage 复制SimpleActivity.java.ftl保存一份 打开SimpleActivity.java.ftl,删除下列代码 1 @Override 2 public boolean onCreateOptionsMenu(Menu menu) { 3 // Inflate the menu; thi