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

简介: 【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开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
1203 4
|
8月前
|
存储 Android开发
如何查看Flutter应用在Android设备上已被撤销的权限?
如何查看Flutter应用在Android设备上已被撤销的权限?
334 64
|
5月前
|
API Android开发 数据安全/隐私保护
|
存储 XML 开发工具
探索安卓应用开发:从基础到进阶
在这篇文章中,我们将一起踏上安卓应用开发的旅程。不论你是编程新手还是希望提升技能的开发者,这里都有你需要的东西。我们会从最基础的概念开始,逐步深入到更复杂的主题。文章将涵盖开发环境设置、用户界面设计、数据处理以及性能优化等方面。通过理论与实践的结合,你将能够构建出既美观又高效的安卓应用。让我们一起开启这段技术之旅吧!
|
10月前
|
前端开发 Java Shell
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
634 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
10月前
|
Dart 前端开发 Android开发
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
312 4
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
12月前
|
JSON Java API
探索安卓开发:打造你的首个天气应用
在这篇技术指南中,我们将一起潜入安卓开发的海洋,学习如何从零开始构建一个简单的天气应用。通过这个实践项目,你将掌握安卓开发的核心概念、界面设计、网络编程以及数据解析等技能。无论你是初学者还是有一定基础的开发者,这篇文章都将为你提供一个清晰的路线图和实用的代码示例,帮助你在安卓开发的道路上迈出坚实的一步。让我们一起开始这段旅程,打造属于你自己的第一个安卓应用吧!
307 14
|
12月前
|
Java Linux 数据库
探索安卓开发:打造你的第一款应用
在数字时代的浪潮中,每个人都有机会成为创意的实现者。本文将带你走进安卓开发的奇妙世界,通过浅显易懂的语言和实际代码示例,引导你从零开始构建自己的第一款安卓应用。无论你是编程新手还是希望拓展技术的开发者,这篇文章都将为你打开一扇门,让你的创意和技术一起飞扬。
217 13
|
12月前
|
搜索推荐 前端开发 测试技术
打造个性化安卓应用:从设计到开发的全面指南
在这个数字时代,拥有一个定制的移动应用不仅是一种趋势,更是个人或企业品牌的重要延伸。本文将引导你通过一系列简单易懂的步骤,从构思你的应用理念开始,直至实现一个功能齐全的安卓应用。无论你是编程新手还是希望拓展技能的开发者,这篇文章都将为你提供必要的工具和知识,帮助你将创意转化为现实。
|
12月前
|
搜索推荐 Android开发 开发者
安卓应用开发中的自定义控件实践
在安卓应用开发的广阔天地中,自定义控件如同璀璨的星辰,点亮了用户界面设计的夜空。它们不仅丰富了交互体验,更赋予了应用独特的个性。本文将带你领略自定义控件的魅力,从基础概念到实际应用,一步步揭示其背后的原理与技术细节。我们将通过一个简单的例子——打造一个具有独特动画效果的按钮,来展现自定义控件的强大功能和灵活性。无论你是初学者还是资深开发者,这篇文章都将为你打开一扇通往更高阶UI设计的大门。
160 2