手机卫士
手机卫士
Day1
上午:
第一节:01_项目介绍(20分钟)、02_svn服务器的使用(20分钟)、03_代码组织结构(10分钟)、04.Splash界面的UI(20分钟)
第二节:04_连接服务器获取更新信息(50分钟)
第三节:05_应用程序的签名(30分钟)、
下午:
第四节07_splash界面的细节(6分钟)、08_两种上下文的区别(8分钟)、09_应用程序的主页面(15分钟)、10_自定义可以滚动的TextView(10分钟)
第五节:11_自动更新的组合控件(50分钟)
第六节:12_自定义控件属性(40分钟)、13_总结如何创建一个自定义控件属性(10分钟)
01_项目介绍_20
演示项目功能;
1、对前面知识的综合应用,复习基础一遍。
2、熟悉代码,找到敲代码的感觉;
3、每天会有1000-1500行代码量;这几天下来一共就会有1万多行代码量。
4、大学软件工程的学生毕业要求3-5万行的代码量。10几天完成三分之一、五分之一;
5、版本控制,每一天的代码用版本控制起来,可以看到每天的代码;
6、演示程序代码。
7、演示功能有:
启动页面
主页
手机防盗(注意:演示时模拟器要提前设置有联系人);
通讯卫士:黑名单的管理:电话拦截、短信拦截的演示;
软件管理:列出系统的所以软件,启动软件、卸载软件、系统的卸载失败(需要root权 限这个后面也会介绍)
进程管理:列出系统中正在运行的程序;演示杀死软件
窗口小部件:添加桌面;
流量统计:模拟器并不支持,在真机上才能演示,只做个UI效果;
手机杀毒:检查手机安装的软件,发现那个是病毒,提醒用户就杀掉;
系统优化:清楚系统的垃圾,刚开始运行,没用多余数据;
高级工具:归属地查询;常用号码查询;短信备份;
02_Svn服务器的使用_20
1、演示svn安装好的样子;
2、查看提交了哪些文件,修改了哪些代码
3、删除SVN服务器端和客户端,
4、基于已经存在的RepositoriesX代码仓库,创建代码创库;
6、建立创库RepositoriesX代码仓库,导入代码;----基于已有的创库;
5、基于创库建立新MobileSafe代码工程;----建立一个新的工程;
03_代码组织结构_10
1、按照模块 组织代码的包结构。 业务之间彼此独立;
办公软件
-- 开会。 com.itheima.meeting
-- 发放工资。 com.itheima.money
-- 出差。 com.itheima.travel
车载电脑
-- 多媒体
-- 导航
-- 领航
-- obd模块
2、按照代码的类型组织包结构;
界面 com.itheima.mobilesafe.activies
自定义UI com.itheima.mobilesafe.ui
业务逻辑代码 com.itheima.mobilesafe.engine 数据引擎业务逻辑 获取解析数据
持久化 com.itheima.mobilesafe.db
com.itheima.mobilesafe.db.dao
广播接收者 com.itheima.mobilesafe.receiver
长期在后台运行 com.itheima.mobilesafe.service
公用的api工具类com.itheima.mobilesafe.utils
04_Splash界面的UI_20
第一: splash界面的作用
1、用来展现产品的Logo;
2、应用程序初始化的操作;
3、检查应用程序的版本;
4、检查当前应用程序是否合法注册;
第二:写界面
android:id="@+id/tv_splash_version"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#000000"
android:textStyle="bold"
android:shadowDx="1"
android:shadowDy="1"
android:shadowRadius="0.2"
android:shadowColor="#ffff00"
android:text="版本:1.0"
android:textSize="16sp"
android:layout_centerInParent="true"
第三:动态获取程序的版本名称的方法
http://blog.csdn.net/qinjuning/article/details/6867806
/**
* 得到应用程序的版本号
*/
public String getAppVersion(){
PackageManager pm = getPackageManager();
try {
PackageInfo info = pm.getPackageInfo(getPackageName(), 0);
return info.versionName;
} catch (NameNotFoundException e) {
e.printStackTrace();
//不可能发生;
return "";
}
}
4、演示提交代码;
05_连接服务器获取更新信息_50
1、查看当前升级提醒对话框效果图
2、画升级流程图
3、到webservice里去写json文件:updata.json
4、Anddroid工程添加联网权限:android.permission.INTERNET
5、在子线程钟请求服务器代码checkVersion()。
6、请求网络的代码
URL url = new URL(getString(R.string.serviceurl));
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setReadTimeout(5000);
7、参照一个解析流的类StreamTools
8、解析JSON
JSONObject obj = new JSONObject(result);
//服务器的版本号
String version = (String) obj.get("version");
description = (String) obj.get("description");
apkurl = (String) obj.get("apkurl");
9、用Handler更新信息
10、创建主页面HomeActivity和布局文件
11、写延迟2秒进入主页面代码
long startTime = System.currentTimeMillis();
long endTime = System.currentTimeMillis();
long dTime = endTime - startTime;
if(dTime<2000){
try {
Thread.sleep(2000-dTime);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
12、添加AlphaAnimation动画效果
AlphaAnimation aa = new AlphaAnimation(0.3f, 1.0f);
findViewById(R.id.rl_root_splash).startAnimation(aa);
13、测试异常况好不好用
14、提交代码到SVN服务器
06_应用程序的签名_30
准备:webservice 上放置一个正式签名的应用
1、显示更新对话框showUpdateDialog();
protected void showUpdateDialog() {
AlertDialog.Builder build = new Builder(this);
build.setTitle("发现新版本");
build.setMessage(description);
build.setNegativeButton("立刻升级", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//升级的代码;
};
});
build.setPositiveButton("下次再说", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
enterHome();
}
});
build.show();
2、下载功能,用到afinal下载框架:FinalHttp
判断SDcard代码:
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
下载代码
FinalHttp http = new FinalHttp();
//mnt/sdcard/updata.apk
Http.download();
更新进度代码
int progress = (int) (current * 100/count);
tv_splash_updateinfo.setText("下载了:"+progress+"%");
3、添加SDcard写权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
3、调用系统安装工具安装APK
private void installAPK(File t) {
Intent intent = new Intent(); intent.setAction("android.intent.action.INSTALL_PACKAGE" ); intent.addCategory("android.intent.category.DEFAULT");
intent.setDataAndType(Uri.fromFile(t), "application/vnd.android.package-archive");
startActivity(intent);
}
4、安装失败
5、引入apk签名
在Android手机里不允许有两个应用程序有相同的包名;
假设A应用的包名:com.itheima.mobilesafeA;
A应用已经在系统中存在了。
这个时候再去安装一个应用B ,他的报名也叫 con.itheima.mobilesafeA
系统就会去检查这两应用的签名是否相同。如果相同,B会把A给覆盖安装掉;
如果不相同 B安装失败;
要想自动安装成功,必须保证应用程序不同版本的签名完成一样。
6、签名演示
7、签名两个应用1.0和2.0,并演示升级不成功和升级成功:如果签名搞丢了怎么办
07_Splash界面的细节_6
准备:启动webserver服务器
1、显示4.0的样式:方式是去掉功能清单里的Activity对应的android:theme;
放到application里面;
2、当splash页面弹出升级提示框过滤点击返回的是两种方式:
一、builder.setCancelable(false);
二、设置setOnCancelListener 当触屏的时候直接进入主页面
08_两种上下文的区别_8
对话框是Activity的一部分。
对话框是挂载在Activity上面的 。
如果Activity不存在,对话框就不能被创建。
Activity 实际上是应用程序context上下文的一个子集。
子类有的东西父类不一定有
父类有的东西子类一定有
getApplicationContext();生命周期长,只要应用还存活它就存在;
this 生命周期短,只要Activity不存在了,系统就会回收;
其中:getBaseContext(),getApplication(),getApplicationContext();
都不能放在AlertDialog做上下文;
getApplicationContext() 使用场景是比如频繁需要操作的数据库
推荐用法:Activity.this
09_应用程序主界面_15
1、画图九宫格和列表
功能列表颜色值:#8866ff00
textSize:22sp
<GridView
android:id="@+id/gv_home_gridview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:numColumns="3"
android:verticalSpacing="15dip" />
Names:手机防盗、通讯卫士、软件管理
进程管理、流量统计、手机杀毒
缓存清理、高级工具、设置中心
10_自定义可以滚动TextView_10;
写完主页面后
Button 有文字滚动
<Button
android:focusableInTouchMode="true"
android:textColor="#000000"
android:layout_width="fill_parent"
android:singleLine="true"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:layout_gravity="center_horizontal"
android:text="欢迎使用手机卫士,呵呵欢迎使用手机卫士"
android:textSize="16sp"
/>
FocusedTextView
<com.itheima.mobilesafe.ui.FocusedTextView
android:textColor="#000000"
android:layout_width="fill_parent"
android:singleLine="true"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:layout_gravity="center_horizontal"
android:text="欢迎使用手机卫士,呵呵欢迎使用手机卫士,呵呵欢迎使用手机卫士,呵呵欢迎使用手机卫士,呵呵"
android:textSize="16sp"
/>
11_自动更新的组合控件_50
准备:开启webserver服务器
1、每次都升级消耗多余的流量
2、在主页面增加点击事件进入设置类;
3、创建SettingActivity类,并在功能清单文件配置;
4、SettingActivity的布局文件,基于activity_home.xml修改;
5、运行可以点击进入设置中心;
6、开始写设置里的布局文件了,参照系统的设置里的“位置服务”
7、布局文件
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="60dip" >
<TextView
android:id="@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="5dip"
android:layout_marginTop="5dip"
android:text="更新设置"
android:textColor="#000000"
android:textSize="22sp" />
<TextView
android:id="@+id/tv_desc"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/tv_title"
android:layout_marginLeft="5dip"
android:text="自动升级已经关闭"
android:textColor="#88000000"
android:textSize="15sp" />
<CheckBox
android:id="@+id/cb_status"
android:layout_centerVertical="true"
android:layout_marginRight="10dip"
android:layout_alignParentRight="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<View
android:layout_alignParentBottom="true"
android:layout_marginLeft="5dip"
android:layout_marginRight="5dip"
android:background="#66000000"
android:layout_width="fill_parent"
android:layout_height="0.2dip"/>
</RelativeLayout>
8、抽取出来单独类SettingItemView
9、单独的布局文件setting_item_view.xml
10、演示多个设置条目当时的方便;
11、相应组合控件的点击事件;
12、判断组合控件是否被选中,其实就是CheckBox的状态是否被选中;
13、在SettingItemView 增加isChecked()、setChecked();方法;并演示
14、在在SettingItemView 增加setDesc()方法;并演示;
15、演示并处理CheckBox的点击事件---解决方案:禁用点击事件;
Android:clickable=”false”
Android:focusable=”false”
16、记录选中状态,并在进入的时候读取保存的状态;
17、在SplashActivity根据是否开启升级而相应的是否升级;
18、延迟两秒进入主页面的代码;
//停留2秒后进入主页面;
handler.postDelayed(new Runnable() {
@Override
public void run() {
enterHome();
}
}, 2000);
知识点
1、项目的代码组织结构
2、PackageManager 获取应用程序的版本号;
3、URL HttpUrlConntion
4、子线程 handler + message
5、Json解析
6、Intent 显示意图
7、Alterdialog
8、两种上下文
9、下载--FinalHttp
10、安装apk
11、应用程序的签名;
12、ListView gridView 数据适配
13、滚动的TextView
14、自定义组合控件 实现关闭自动更新;
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。