Android项目实战_手机安全卫士splash界面

Android项目实战_手机安全卫士splash界面

大家好,又见面了,我是全栈君。

– 根据代码的类型组织包结构
1. 界面 com.hb.mobilesafe.activities
2. 服务 com.hb.mobilesafe.services
3. 业务逻辑 com.hb.mobilesafe.engine
4. 数据库 com.hb.mobilesafe.db
5. 数据库增删改查 com.hb.mobilesafe.db.dao
6. 工具类 com.hb.mobilesafe.utils
7. 自定义view com.hb.mobilesafe.ui

###3.splash界面的作用
1. 展现产品的logo,提升产品的知名度.
2. 初始化应用程序的数据.
3. 连接服务器,查找可更新的版本,自动更新
4. 用户操作指南
5. 新版本特性提醒

4.布局文件的命名规则
SplashActivity—>activity_spalsh.xml
XxxActivity—> activity_xxx.xml

###5.获取应用程序版本号
//用PackageManager拿到PackageInfo,PackageInfo中的versionName
PackageInfo packinfo = context.getPackageManager().getPackageInfo(
context.getPackageName(), 0);
String version = packinfo.versionName;

###6.源代码版本控制
– 安装VisualSVN Server——SVN服务器,一直下一步即可
– 导入仓库到服务器
1.在Repositories处右键,选择Import Existing Repository
2.选择Copy repository from another location,下一步
3.点击Browse,选择仓库路径,”代码/代码仓库/Repository/mobilesafe”,点击下一步
4.点击Import
5.点击Finish,导入完成
– 安装TortoiseSVN——SVN客户端,一直下一步即可
1.在想要检出代码的地方右键,选择SVN Checkout
2.URL of repository处填https://127.0.0.1/svn/mobilesafe/,地址也可以从SVN服务器的mobilesafe处右键选择Copy URL to clipboard拷贝
3.Checkout directory出填写检出代码要放的位置,然后点击OK
4.完成代码的检出
– 将代码更新到指定版本
1.mobilesafe文件夹出右键,选择Update to version
2.点击show log
3.点击左下角的show all
4.选择要更新的版本,点击OK
5.版本更新完成

###7.应用自动更新的逻辑图
![](http://i.imgur.com/EU78wXt.png)

###8.获取服务器版本号
//获取服务器地址
String path = getResources().getString(R.string.url);
URL url = new URL(path);

//创建网络连接
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod(“GET”);
conn.setConnectTimeout(5000);

//发出请求,获得返回码
int code = conn.getResponseCode();
if(code ==200){

//获取服务器返回的流并进行解析
InputStream is = conn.getInputStream();
String result = StreamTools.readStream(is);

//转化为json并解析出版本号
JSONObject json = new JSONObject(result);
String serverVersion = json.getString(“version”);
Log.i(TAG,”服务器版本:”+serverVersion);
}

###9.将流转化为字符串
public static String readStream(InputStream is) throws IOException{

//ByteArrayOutputStream类是在创建它的实例时,程序内部创建一个byte型数组的缓冲区,缓冲区会随着数据的不断写入而自动增长。可使用 toByteArray()和 toString()获取数据
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = -1;
while((len = is.read(buffer))!=-1){

baos.write(buffer, 0, len);
}
is.close();
return baos.toString();
}

###10.弹出对话框
1.使用AlertDialog.Builder
2.设置标题、信息、点击事件等
3.调用show方法显示出来,调用dismiss方法消失

###11.下载apk
1.使用开源框架xUtils
2.使用HttpUtils的download方法,填入三个参数:服务器下载地址,手机中的存储位置、回调事件
3.回调事件中有三个常用的方法:onSuccess下载成功、onFailure下载失败、onLoading更新下载进度

xUtils补充
http://my.oschina.net/u/1171837/blog/147544 作者博客

###12.安装apk
1.调用系统的安装apk的界面,传入对应的参数
2.具体实现方式
Intent intent = new Intent();
intent.setAction(“android.intent.action.VIEW”);
intent.addCategory(“android.intent.category.DEFAULT”);
intent.setDataAndType(
Uri.fromFile(fileinfo.result),
“application/vnd.android.package-archive”);
startActivity(intent);

###13.应用程序的覆盖安装要满足的条件
1. 两个版本签名一致
2. 两个版本包名一致

###14.跑马灯效果的TextView
1. 系统的TextView不能获取焦点,使用自定义控件
2. 继承TextView控件,重写isFocused方法,直接返回true,让其获取焦点
3. 设置android:ellipsize=”marquee”

###15.旋转的弘博logo
1. 使用系统提供的属性动画
2. 具体实现方式
ObjectAnimator oa = ObjectAnimator.ofFloat(iv_home_logo, “rotationY”,
45, 90, 135, 180, 225, 270, 315);
oa.setDuration(3000);
oa.setRepeatCount(ObjectAnimator.INFINITE);
oa.setRepeatMode(ObjectAnimator.RESTART);
oa.start();

贴上对应的源码:

  1 package com.hb.mobilesafe.activities;
  2 
  3 import java.io.File;
  4 import java.io.FileOutputStream;
  5 import java.io.IOException;
  6 import java.io.InputStream;
  7 import java.net.HttpURLConnection;
  8 import java.net.URL;
  9 
 10 import org.json.JSONObject;
 11 
 12 import android.app.Activity;
 13 import android.app.AlertDialog;
 14 import android.app.AlertDialog.Builder;
 15 import android.app.ProgressDialog;
 16 import android.content.DialogInterface;
 17 import android.content.DialogInterface.OnClickListener;
 18 import android.content.Intent;
 19 import android.content.SharedPreferences;
 20 import android.content.res.AssetManager;
 21 import android.net.Uri;
 22 import android.os.Bundle;
 23 import android.os.Environment;
 24 import android.os.Handler;
 25 import android.os.Message;
 26 import android.os.SystemClock;
 27 import android.view.Window;
 28 import android.widget.TextView;
 29 import android.widget.Toast;
 30 
 31 import com.hb.demo_mobilesafe.R;
 32 import com.hb.mobilesafe.utils.GetVersonName;
 33 import com.hb.mobilesafe.utils.ReadStrem;
 34 import com.lidroid.xutils.HttpUtils;
 35 import com.lidroid.xutils.exception.HttpException;
 36 import com.lidroid.xutils.http.ResponseInfo;
 37 import com.lidroid.xutils.http.callback.RequestCallBack;
 38 
 39 public class SplashActivities extends Activity {
 40     protected static final int SUCCESS = 1;
 41     protected static final int ERROR = 2;
 42     private TextView tv_splash_version;
 43     private String localVersion;
 44     private String serviceVerson;
 45     private String apkpath;
 46     private String descritoin;
 47     private Handler handler=new Handler(){
 48         public void handleMessage(android.os.Message msg) {
 49             switch (msg.what) {
 50             case SUCCESS:
 51                 //判断出的版本号不一样进行升级
 52                 builderLoading();
 53                 break;
 54 
 55             case ERROR:
 56                 Toast.makeText(SplashActivities.this, "错误信息:"+msg.obj, 0).show();
 57                 loadUI();
 58                 break;
 59             }
 60         }
 61 
 62 
 63     };
 64 
 65     @Override
 66     protected void onCreate(Bundle savedInstanceState) {
 67         super.onCreate(savedInstanceState);
 68         requestWindowFeature(Window.FEATURE_NO_TITLE);
 69         setContentView(R.layout.activity_splash);
 70         tv_splash_version = (TextView) findViewById(R.id.tv_splash_version);
 71         SharedPreferences sp=getSharedPreferences("config", MODE_PRIVATE);
 72         //获取开关状态判断是否进行升级提示
 73         boolean tag = sp.getBoolean("update", true);
 74         if(tag){
 75             initDate();
 76         }else{
 77             new Thread(){
 78                 public void run() {
 79                     SystemClock.sleep(1500);
 80                     loadUI();
 81                 };
 82             }.start();
 83         }
 84         localVersion = GetVersonName.version(this);
 85         tv_splash_version.setText("版本号:"+localVersion);
 86         //初始化导入数据库到手机
 87         importDataBase("antivirus.db");
 88 
 89     }
 90     //初始化导入数据库到手机
 91     private void importDataBase(String fileName) {
 92         File file=new File(getFilesDir(), fileName);
 93         if(file.exists() && file.length()>0){
 94             return;
 95         }
 96         try {
 97             AssetManager assets = getAssets();
 98             InputStream is= assets.open(fileName);
 99             FileOutputStream fs=new FileOutputStream(file);
100             int len=-1;
101             byte [] arr=new byte[1024];
102             while ((len =is.read(arr))!=-1) {
103                 fs.write(arr, 0, len);
104             }
105             fs.close();
106             is.close();
107         } catch (IOException e) {
108             // TODO Auto-generated catch block
109             e.printStackTrace();
110         }
111     }
112 
113     private void initDate() {
114 
115         new Thread(){
116 
117             private long start;
118             private Message message;
119             public void run() {
120                 String path=getResources().getString(R.string.path);
121 
122                 try {
123                     URL url = new URL(path);
124                     HttpURLConnection conn =(HttpURLConnection) url.openConnection();
125                     conn.setConnectTimeout(5000);
126                     conn.setRequestMethod("GET");
127                     int code = conn.getResponseCode();
128                     if(code == 200){
129                         InputStream stream = conn.getInputStream();
130                         String json = ReadStrem.readSreamUtil(stream);
131                         JSONObject ob=new JSONObject(json);
132                         serviceVerson = ob.getString("verson");
133                         descritoin = ob.getString("descritoin");
134                         apkpath = ob.getString("apkpath");
135                         start=SystemClock.currentThreadTimeMillis();
136                         /**
137                          * 进行本地版本与服务器版本的对比
138                          */
139                         if(localVersion.equals(serviceVerson)){
140                             //不需要升级直接调转
141                             //                            loadUI();
142                         }else{
143                             message = new Message();
144                             message.what=SUCCESS;
145                             handler.sendMessage(message);
146 
147 
148                         }
149                     }
150 
151                 } catch (Exception e) {
152                     e.printStackTrace();
153                     message = new Message();
154                     message.what=ERROR;
155                     message.obj="code:404";
156                     handler.sendMessage(message);
157 
158                 }finally{
159                     long end=SystemClock.currentThreadTimeMillis();
160                     long et=end-start;
161                     if(et>2000){
162                     }else{
163                         SystemClock.sleep(2000-et);
164                     }
165 
166                 }
167             }
168 
169 
170         }.start();
171     }
172     /**
173      * 更新UI
174      */
175     private void loadUI() {
176         Intent intent=new Intent(SplashActivities.this, HomeActivities.class);
177         startActivity(intent);
178         finish();
179     };
180     //提示用户升级
181     private void builderLoading() {
182         AlertDialog.Builder alert=new Builder(SplashActivities.this);
183         alert.setTitle("版本升级提示");
184         alert.setCancelable(false);//设置锁定其他界面点击事件
185         alert.setMessage(descritoin);
186         //        alert.setIcon(R.drawable.);
187         alert.setPositiveButton("立刻升级", new OnClickListener() {
188 
189             private ProgressDialog pd;
190 
191             @Override
192             public void onClick(DialogInterface dialog, int which) {
193                 Toast.makeText(SplashActivities.this, "升级吧", 0).show();
194                 pd = new ProgressDialog(SplashActivities.this);
195                 pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
196                 pd.show();
197                 
198                 HttpUtils utils=new HttpUtils();
199                 if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
200                     //获取SD卡的对象
201                     File sd=Environment.getExternalStorageDirectory();
202                     File file=new File(sd, SystemClock.currentThreadTimeMillis()+".apk");
203                     utils.download(apkpath, file.getAbsolutePath(),new RequestCallBack<File>(){
204 
205                         @Override
206                         public void onFailure(HttpException arg0, String arg1) {
207                             pd.dismiss();
208                         }
209 
210                         @Override
211                         public void onSuccess(ResponseInfo<File> arg0) {
212                             pd.dismiss();
213                             //安装APP
214                             Intent intent=new Intent();
215                             intent.setAction("android.intent.action.VIEW");
216                             intent.addCategory("android.intent.category.DEFAULT");
217                             intent.setDataAndType(
218                                     Uri.fromFile(arg0.result),
219                                     "application/vnd.android.package-archive");
220                             startActivity(intent);
221                             finish();
222                         }
223 
224                         @Override
225                         public void onLoading(long total, long current,
226                                 boolean isUploading) {
227                             pd.setMax((int)total);
228                             pd.setProgress((int)current);
229                             super.onLoading(total, current, isUploading);
230                         }
231                     });
232 
233                 }
234             }
235         });
236         alert.setNegativeButton("下次再说", new OnClickListener() {
237 
238             @Override
239             public void onClick(DialogInterface dialog, int which) {
240                 loadUI();
241             }
242         });
243         alert.show();
244 
245     }
246 
247 
248 }

布局文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/splash"
    tools:context="${relativePackage}.${activityClass}" >

    <TextView
        android:id="@+id/tv_splash_version"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="15dip"
        android:textSize="16sp"
        android:text="版本号:1.0" />

</RelativeLayout>

 

给上这个项目中所需的所有权限不懂的可以百度一下:

<uses-permission android:name=”android.permission.CALL_PHONE” />
<uses-permission android:name=”android.permission.INTERNET” />
<uses-permission android:name=”android.permission.WRITE_EXTERNAL_STORAGE” />
<uses-permission android:name=”android.permission.MOUNT_UNMOUNT_FILESYSTEMS” />
<uses-permission android:name=”android.permission.PROCESS_OUTGOING_CALLS” />
<uses-permission android:name=”android.permission.READ_PHONE_STATE” />
<uses-permission android:name=”android.permission.READ_CONTACTS” />
<uses-permission android:name=”android.permission.WRITE_CONTACTS” />
<uses-permission android:name=”android.permission.RECEIVE_BOOT_COMPLETED” />
<uses-permission android:name=”android.permission.SEND_SMS” />
<uses-permission android:name=”android.permission.RECEIVE_SMS” />
<uses-permission android:name=”android.permission.ACCESS_MOCK_LOCATION” />
<uses-permission android:name=”android.permission.ACCESS_FINE_LOCATION” />
<uses-permission android:name=”android.permission.ACCESS_COARSE_LOCATION” />
<uses-permission android:name=”android.permission.GET_TASKS” />
<uses-permission android:name=”android.permission.KILL_BACKGROUND_PROCESSES” />
<uses-permission android:name=”android.permission.GET_PACKAGE_SIZE” />
<uses-permission android:name=”android.permission.READ_CALL_LOG” />
<uses-permission android:name=”android.permission.WRITE_CALL_LOG” />

<uses-permission android:name=”android.permission.PROCESS_OUTGOING_CALLS” />
<!– 短信备份 –>
<uses-permission android:name=”android.permission.READ_SMS” />
<uses-permission android:name=”android.permission.WRITE_SMS” />
<uses-permission android:name=”android.permission.WRITE_EXTERNAL_STORAGE” />
<uses-permission android:name=”android.permission.KILL_BACKGROUND_PROCESSES” />
<uses-permission android:name=”android.permission.GET_PACKAGE_SIZE” />
<uses-permission android:name=”android.permission.CLEAR_APP_CACHE” />

转载于:https://www.cnblogs.com/boket/p/6991375.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/108424.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • spring配置c3p0数据源时出现org.springframework.beans.factory.BeanCreationException异常

    spring配置c3p0数据源时出现org.springframework.beans.factory.BeanCreationException异常

  • 个人开发者app消息推送简单实现思路

    个人开发者app消息推送简单实现思路最近新做了一个app,中午没事大脑在简单的思索者。。假如:我的这个app很火,用的人会很多,那么它就成了我的一个个人平台。如果我想让给广大用户推送一个新消息,该怎么办?当然你可以百度搜服务器消息推送实现之类的。但是软而一想,能不能通过一个简单方法实现呢。我想应该是有的。前期准备:1.首先我们花几十元注册个域名2.购买个便宜的主机,网上有一年几十元的那种3.将域名解析

  • 全新企业发卡系统源码/带有代理功能发卡平台源码[通俗易懂]

    全新企业发卡系统源码/带有代理功能发卡平台源码[通俗易懂]☑️编号:ym286☑️品牌:无☑️语言:PHP☑️大小:105MB☑️类型:企业发卡系统☑️支持:pc+wap????欢迎免费领取(注明编号)????✨源码介绍全新企业发卡系统源码,带有代理功能的发卡平台源码,目前应该算是最完美的一款了,亲测可运营。并且多套模板可以切换,有需要的自取吧。更新说明:支付界面短链接二维码后台模板等修复及一些细节优化pc用户端后台稍微美化(颜色调整)安卓用户端后台界面UI美化重写,商户头像根据QQ获取Admin后台登录页面重写(

  • 【Maven学习】Maven打包生成包含所有依赖的jar包

    【Maven学习】Maven打包生成包含所有依赖的jar包maven打包生成的普通jar包,只包含该工程下源码编译结果,不包含依赖内容。同时,maven提供以下方式生成包含所有依赖的jar文件,依赖以class的方式存在;将此plugin添加到pom文件中maven-assembly-plugin

  • XR应用场景骤变,一场波及5亿人的新探索开始了「建议收藏」

    XR应用场景骤变,一场波及5亿人的新探索开始了「建议收藏」鱼羊明敏发自凹非寺量子位|公众号QbitAI如果说有什么事可以最快逼疯一个远程办公人,那“线上开会”肯定会得高票。网络卡顿、沟通低效导致会议变得长长长长长……万一碰上出门在外的紧急情况,更是当场抓瞎。这时候,就让人禁不住幻想,要是有副科幻大片同款高端眼镜,一戴上就能随时办公,那感觉可就起飞了。于是,打从元宇宙这股风起,大到国际科技巨头,小到国内初创企业,就没少…

  • 【硬件通信协议】1. 详细解析IIC通信协议

    【硬件通信协议】1. 详细解析IIC通信协议版权声明:欢迎交流 https://blog.csdn.net/sishuihuahua/article/details/88128761 </div> <linkrel=”stylesheet”href=”https://csdnimg.cn/release/phoenix/template/c…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号