Android手机卫士之SplashActivity

手机卫士之Splash界面

splash: 溅,洒

定义一个SplashActivity作为一款软件的打开界面,它承担着在真正打开软件之前需完成的一些功能,如下面:

展现产品的logo提升产品的知名度
 初始化操作(创建数据库,读取配置文件)
 连接服务器检查软件授权、更新

整体取消掉标题栏:在清单文件中加一修改主题

android:theme="@android:style/Theme.Light.NoTitleBar"


自动更新的前提

  • 包名一致
  • 签名一致

1、展现产品的logo提升产品的知名度

    再打开软件之后出现软件的版本信息,名称,并设置了背景图片。

2、初始化操作

    把软件要用到的数据库初始化,读取配置文件信息,数据库只初始化一次,除   非卸载软件或者删除数据之后再会重新扫描。
  /**
       * 拷贝数据库到data/data/包名/files目录下,数据库的初始化
       */
      copyDB("address.db");
      copyDB("commonnum.db");
      copyDB("antivirus.db");
    /**
     * 拷贝资产目录下的数据库到Android系统下
     */
    private void copyDB(final String name) {
        /*
         * 数据库多时可能耗时,在子线程中执行
         */
        new Thread(){
            public void run() {
                File file=new File(getFilesDir(),name);
                if(file.exists()&&file.length()>0){
                System.out.println("数据库已经加载过,无需在加载!");
                }else{

                try {
                    InputStream is=getAssets().open(name);
                    FileOutputStream fos=new FileOutputStream(file);
                    byte[] buffer=new byte[1024];
                    int len=-1;
                    while((len=is.read(buffer))!=-1){
                        fos.write(buffer, 0, len);
                    }
                    is.close();
                    fos.close();  
                } catch (Exception e) {
                    e.printStackTrace();
                }
                }
            };
        }.start();
    } 

   

3、连接服务器检查软件授权、更新

    软件随时都可能更新,在splash界面如果发现服务器中的app更新了,就实现读取服务器中的信息,并弹出对话框让用户选择是否更新,选择更新就会自动下载新版本并自动安装替换旧版本。实现代码如下:
读取系统文件是否要更新,默认值为true
        SharedPreferences  sp=getSharedPreferences( "config"      MODE_PRIVATE );
      //拿到是否开启自动更新
      boolean flag=sp.getBoolean("update", true);
      if(flag){
          checkVersion();
      }else{
          System.out.println("不更新");
          IntentUtils.startActivityDelayAndFinish(SplashActivity.this, MainActivity.class,2000);//延迟进入主界面为了显示动画
          
      }
    下面这段是读取服务器是否有新的版本要更新

          /**
     *访问网络  检查是否有最新版本下载的信息
     * 连接网络是耗时操作,要放在子线程中操作。
     */
    private void checkVersion() {
        new Thread(){
            public void run() {
                try {
                    System.out.println("线程之中--------之中");
                    //获取URL对象
                    URL url=new URL(getString(R.string.serviceurl));
                    System.out.println("网络地址:"+url);
                    //连接服务器
                    HttpURLConnection conn=(HttpURLConnection) url.openConnection();
                    //设置请求方式
                    conn.setRequestMethod("GET");
                    //设置请求超时时间
                    conn.setConnectTimeout(5000);
                    //获得返回码
                    int code=conn.getResponseCode();
                    System.out.println("code的值-----"+code);
                    if(code==HTTP_OK){
                        System.out.println("取数据成功------之中");
                        //获取返回的输入流
                        InputStream is=conn.getInputStream();
                        //把一个输入流转换成字符串, StreamUtils为一个工具类
                        String json=StreamUtils.readStream(is);
                        JSONObject jsonobj=new JSONObject(json);
                        int serviceversion=jsonobj.getInt("version");
                        String downLoadUrl=jsonobj.getString("downloadurl");
                        String desc=jsonobj.getString("desc");
                        //打印输出验证能否取到数据
                        System.out.println("version:-----"+serviceversion);
                        System.out.println("downLoad:----"+downLoadUrl);
                        System.out.println("version:-----"+desc);
                        
                        if(serviceversion>AppInfoUtils.getAppInfoNumber(getApplication())){
                            System.out.println("有新版本了,进入下载新版本");
                            //消息处理,传递更新信息
                            UpdateVersion data=new UpdateVersion();
                            data.serviceversion=serviceversion;
                            data.downLoadUrl=downLoadUrl;
                            data.desc=desc;
                            Message msg=Message.obtain();
                            msg.obj=data;
                            msg.what=NEED_UDPATE;
                            handler.sendMessageDelayed(msg, 2000);
                        }else{
                            System.out.println("版本一致,进入主界面");
                            IntentUtils.startActivityDelayAndFinish(SplashActivity.this, MainActivity.class, 2000);
                        }
                    }
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                    ToastUtils.show(SplashActivity.this"URL路径错误");
                } catch (IOException e) {
                    e.printStackTrace();
                    ToastUtils.show(SplashActivity.this"网络错误");
                } 
                catch (JSONException e) {
                    e.printStackTrace();
                    ToastUtils.show(SplashActivity.this"服务器配置信息错误");
                }    
            };
        }.start();
    }

检查到新的版本要下载更新啦

         
    /**
     *  展示下载提示对话框,首先先引入xUtils的jar包到lib
     * @param msg
     */
    public void showUpdateDialog(android.os.Message msg) {
        UpdateVersion data=(UpdateVersion) msg.obj;
        //弹出一个更新对话框
         AlertDialog.Builder builder=new Builder(SplashActivity.this);
        builder.setTitle("升级更新!");
        builder.setMessage(data.desc);
        builder.setPositiveButton("立刻升级"new OnClickListener() {
            
            @Override
            public void onClick(DialogInterface dialog, int which) {
                  //开源项目断点下载xUtils
                HttpUtils http=new HttpUtils();
                final File file=new File(Environment.getExternalStorageDirectory(),"xxx.apk");
                http.download(data.downLoadUrl, file.getAbsolutePath(), truenew RequestCallBack(){
                    //下载失败
                    @Override
                    public void onFailure(HttpException arg0, String arg1) {
                        
                    }
                    //下载成功
                    @Override
                    public void onSuccess(ResponseInfo arg0) {
                         //下载成功,替换安装、以下为模板代码
                        ToastUtils.show(SplashActivity.this"下载成功");
                        Intent intent=new Intent();
                        intent.setAction("android.intent.action.VIEW");
                        intent.addCategory("android.intent.category.DEFAULT");
                        intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
                        startActivity(intent);
                        
                    }});
            }
        });
        builder.setNegativeButton("下次再说"new OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
                IntentUtils.startActivityAndFinish(SplashActivity.this,MainActivity.class);
                
            }
        });
        builder.show();
    }   

这三步完成就可以进入手机的主界面了。


你可能感兴趣的:(Android)