【Android 应用开发】Android应用的自动更新模块(一)

软件的自动更新一般都与Splash界面绑定在一起, 由于需要维护的软件界面很复杂, 一个Activity中嵌入ViewPager, 并且逻辑比较复杂, 索性重新写一个Activity, 现在的软件都很流行使用Splash界面, 正好与自动更新配套在一起;




在这个自动更新Splash中, 使用到了 动画设置 ,SharedPerference ,pull解析 ,dialog对话框 ,http网络编程 ,handler 等.




注意一个错误 : 已安装具有该名称和不同签名的数据包 , 早上测试人员报告突然出现这个问题, 在开发的时候我直接将eclipse上编译的版本放到了服务器上, 最后出现了这个问题, 开发的时候明明是好的啊, 怎么测试的时候出问题了呢.


编译环境不同, 产生的签名是不一样的, 在eclipse上编译生成 与 正式版本在linux下编译 所产生的 数字签名 是不一样的.




又发现一个BUG : 在弹出更新对话框, 点击确定下载完毕之后会弹出系统自带的替换应用程序对话框, 在这里点取消的话就会一直卡在Splash界面. 设置一个跳转机制解决这个问题.


解决方案 :利用触摸划屏事件, 向左侧划屏100px, 就自动跳转到主界面 , 最后的最终代码已经加上去了



/**
  * 设置触摸事件
  * 在手指按下时记录x坐标值 , 在手指抬起的时候记录x坐标值 , 如果两个值相差超过100
  * 那么跳转到主界面 
  * @see android.app.Activity#onTouchEvent(android.view.MotionEvent)
  */
    @Override
    public boolean onTouchEvent(MotionEvent event) {
  switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN :
    touchPositionX0 = (int) event.getX();
    break;
    case MotionEvent.ACTION_UP :
    touchPositionX1 = (int) event.getX();
    if((touchPositionX0 - touchPositionX1) > 100)
        loadMainUI();
    touchPositionX0 = 0;
    touchPositionX1 = 0;
    break;
  }
  return true;
    }





一. 创建Activity



1. 创建Activity大概流程

a. 设置全屏显示.


b. 设置布局, 并在布局中显示当前版本号, 为Splash界面添加动画.


c. 获取当前时间.


d. 获取SharedPerence配置文件.


e. 开启检查版本号线程, 后续的操作都在这个线程中执行.




2. 设置窗口样式



(1) 设置全屏显示

a. 代码实现 : 由于是Splash界面, 这里需要设置成无标题, 并且全屏显示, 注意下面的两行代码需要在setContentView()方法之前调用;



     

//隐藏标题栏
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        //隐藏状态栏
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
          WindowManager.LayoutParams.FLAG_FULLSCREEN);

b. 配置实现 :



AndroidManifest.xml
<activity 
    android:name="myAcitivty"  
    android:theme="@android:style/Theme.NoTitleBar.Fullscreen" />



(2) 关于窗口的其它设置

//①设置窗体始终点亮
getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);



//②设置窗体始终点亮
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

设置窗体始终点亮的配置文件实现



//③AndroidManifest.xml添加权限
<uses-permission android:name="android.permission.WAKE_LOCK" />



//设置窗体背景模糊
getWindow().setFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND,WindowManager.LayoutParams.FLAG_BLUR_BEHIND);

(3) 屏幕方向设置



a. 配置文件实现



/

/设置横屏
<activity android:name="myAcitivty"  android:screenOrientation="landscape" />  
//设置竖屏
<activity android:name="myAcitivty"  android:screenOrientation="portrait" />


b. 代码实现

//设置横屏
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
//设置竖屏
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

c. 获取屏幕方向



//获取横屏方向
int orientation = this.getResources().getConfiguration().orientation;
其中的orientation方向可以使 ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE 或者 ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE .


3. 设置动画



为了更好的用户体验, 这里给Splash界面添加一个动画, 这个动画加给整个界面.




(1) 创建动画




AlphaAnimation animation = new AlphaAnimation(0.0f, 1.0f);  //创建动画
animation.setDuration(2000);    //设置渐变
splash_rl.setAnimation(animation);  //设置动画载体

创建动画吧: 创建的这个动画是透明度渐变动画, 传入浮点型参数, 0代表完全透明, 1代表不透明, 传入参数代表透明度从完全透明到不透明.

设置时间 : 设置的duration是动画渐变过程所消耗的时间.


设置动画 : 最后使用setAnimation()方法将穿件的动画设置给Splash界面.




(2) 动画常用方法



a. 普通设置




alphaAnimation.setRepeatCount(5);//设置重复次数
        alphaAnimation.setFillAfter(true);//动画执行完是否停留在执行完的状态
        alphaAnimation.setStartOffset(1000);//动画执行前等待的时间, 单位是毫秒
        alphaAnimation.start();//开始动画



b. 设置监听器





alphaAnimation.setAnimationListener(new AnimationListener() {
            //动画开始时回调
    @Override
    public void onAnimationStart(Animation animation) {
    }
    //动画重复执行时回调
    @Override
    public void onAnimationRepeat(Animation animation) {
    }
    //动画执行结束时回调
    @Override
    public void onAnimationEnd(Animation animation) {
    }
  });


4. SharedPerference使用



 

//获取SharedPerference
        SharedPreferences sharedPreferences = getSharedPreferences("sp", Context.MODE_PRIVATE);
       
        Editor editor = sharedPreferences.edit();   //获取Editor对象
        editor.putBoolean("isUpdate", true);  //向sp中写入数据
        editor.commit();        //提交
        
        sharedPreferences.getBoolean("isUpdate", true);//获取sp中的变量

5. onCreate()方法代码




/**
  * 创建Activity时调用
  * 
  * ① 设置全屏显示, 由于是Splash界面, 因此不能有标题
  * ② 设置布局, 版本号, 执行动画 
  * ③ 设置当前时间
  * ④ 获取SharedPerference配置文件
  * ⑤ 开启检查版本号线程, 后续操作都在改线程中操作
  * 
  */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //隐藏标题栏
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        //隐藏状态栏
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
          WindowManager.LayoutParams.FLAG_FULLSCREEN);
        //设置布局
        setContentView(R.layout.splash);
       
        /*
         *  显示当前软件的版本号
         *  获取布局中的TextView控件, 将版本号设置到这个TextView控件中
         */
        tv_version = (TextView) findViewById(R.id.tv_version);
        version =getString(R.string.current_version) + " " + getVersion();
        tv_version.setText(version);
       
        /*
         *  在界面设置一个动画, 用来表明正在运行
         *  a. 获取布局
         *  b. 创建一个动画对象
         *  c. 将动画设置到布局中
         */
        splash_rl = (RelativeLayout) findViewById(R.id.splash_rl);
        AlphaAnimation animation = new AlphaAnimation(0.0f, 1.0f);
        animation.setDuration(2000);
        splash_rl.setAnimation(animation);
       
        /*
         * 这个时间值是用来控制Splash界面显示时间的
         * 记录下这个值, 然后执行到下面, 如果时间差在3秒以内, 
         * 就执行下面的操作, 如果时间差不足3秒, 就Thread.sleep时间差
         * 等够3秒在执行下面的操作
         */
        time = System.currentTimeMillis();
        //从SharedPreference中获取一些配置
        sp = getSharedPreferences("config", Context.MODE_PRIVATE);
       
        //开启检查版本号线程
        new Thread(new CheckVersionTask()).start();
    }





上一篇:【Android 应用开发】Android应用的自动更新模块(二)


下一篇:【嵌入式开发】C语言 命令行参数 函数指针 gdb调试(二)