手机卫士

     手机卫士

 

 

Day1

上午:

第一节:01_项目介绍(20分钟)、02_svn服务器的使用(20分钟)、03_代码组织结构(10分钟)、04.Splash界面的UI20分钟)

第二节:04_连接服务器获取更新信息(50分钟)

第三节:05_应用程序的签名(30分钟)、

 

 

下午:

第四节07_splash界面的细节(6分钟)、08_两种上下文的区别(8分钟)、09_应用程序的主页面(15分钟)、10_自定义可以滚动的TextView10分钟)

第五节: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应用已经在系统中存在了。

 

 这个时候再去安装一个应用,他的报名也叫 con.itheima.mobilesafeA

 系统就会去检查这两应用的签名是否相同。如果相同,B会把A给覆盖安装掉;

 如果不相同 B安装失败;

 

 要想自动安装成功,必须保证应用程序不同版本的签名完成一样。

 

6、签名演示

7、签名两个应用1.02.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类,并在功能清单文件配置;

 4SettingActivity的布局文件,基于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、自定义组合控件 实现关闭自动更新;

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。