手机安全卫士——闪屏页相关处理

Posted 蒙小米

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了手机安全卫士——闪屏页相关处理相关的知识,希望对你有一定的参考价值。

根据功能模块划分(android开发推荐此方法)

    - Activity   mobilesafe.activty
    - 后台服务   mobilesafe.service
    - 广播接受者 mobilesafe.receiver
    - 数据库 mobilesafe.db.dao
    - 对象(java bean) mobilesafe.domain/bean
    - 自定义控件 mobilesafe.view
    - 工具类 mobilesafe.utils
    - 业务逻辑 mobilesafe.engine

 

 闪屏页面(Splash)作用:

- 展示logo,公司品牌
- 项目初始化,数据库copy
- 检测版本更新
- 校验程序合法性(比如:判断是否有网络,有的话才运行)

 

AndroidMinifest.xml      四大组件都需要在这里配置

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
 3     package="com.mxn.mobilesafe"
 4     android:versionCode="1"  //版本号
 5     android:versionName="1.0" > //版本名
 6 
 7     <uses-sdk
 8         android:minSdkVersion="16"
 9         android:targetSdkVersion="21" />
10 //项目所需的权限
11     <uses-permission android:name="android.permission.INTERNET" />
12     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
13     <uses-permission android:name="android.permission.READ_PHONE_STATE" />
14     <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
15     <uses-permission android:name="android.permission.READ_CONTACTS" />
16     <uses-permission android:name="android.permission.SEND_SMS" />
17     <uses-permission android:name="android.permission.RECEIVE_SMS" />
18     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
19     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
20     <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
21     <uses-permission android:name="android.permission.VIBRATE" />
22     <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
23     <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"/>
24     <uses-permission android:name="android.permission.GET_PACKAGE_SIZE"/>
25     <uses-permission android:name="android.permission.CLEAR_APP_CACHE"/>
26 
27     <application
28         android:allowBackup="true"
29         android:icon="@drawable/ic_launcher"
30         android:label="@string/app_name"
31         android:theme="@style/AppTheme" >  //主题

//activity的注册
32 <activity 33 android:name="com.mxn.mobilesafe.activity.SplashActivity" 34 android:label="@string/app_name" > 35 <intent-filter> //起始的activity 36 <action android:name="android.intent.action.MAIN" /> 38 <category android:name="android.intent.category.LAUNCHER" /> 39 </intent-filter> 40 </activity> 41 <activity android:name="com.mxn.mobilesafe.activity.HomeActivity" /> 42 <activity android:name="com.mxn.mobilesafe.activity.SettingActivity" /> 43 <activity android:name="com.mxn.mobilesafe.activity.LostFindActivity" > 44 </activity> 45 <activity android:name="com.mxn.mobilesafe.activity.Setup1Activity" > 46 </activity> 47 <activity android:name="com.mxn.mobilesafe.activity.Setup2Activity" > 48 </activity> 49 <activity android:name="com.mxn.mobilesafe.activity.Setup3Activity" > 50 </activity> 51 <activity android:name="com.mxn.mobilesafe.activity.Setup4Activity" > 52 </activity> 53 <activity android:name="com.mxn.mobilesafe.activity.ContactActivity" > 54 </activity> 55 <activity android:name="com.mxn.mobilesafe.activity.AtoolsActivity" > 56 </activity> 57 <activity android:name="com.mxn.mobilesafe.activity.AddressActivity" > 58 </activity> 59 <activity android:name="com.mxn.mobilesafe.activity.CallSafeActivity" > 60 </activity> 61 <activity android:name="com.mxn.mobilesafe.activity.AppManagerActivity" > 62 </activity> 63 <activity android:name="com.mxn.mobilesafe.activity.TaskManagerActivity"> 64 </activity> 65 <activity android:name="com.mxn.mobilesafe.activity.TaskManagerSettingActivity"> 66 </activity> 67 <activity android:name="com.mxn.mobilesafe.activity.AntivirusActivity"></activity> 68 <activity android:name="com.mxn.mobilesafe.activity.AppLockActivity"></activity> 69 <activity android:name="com.mxn.mobilesafe.activity.CleanCacheActivity"></activity> 70 //广播接收者的 注册 71 <receiver android:name=".receiver.BootCompleteReceiver" > 72 <intent-filter> 73 <action android:name="android.intent.action.BOOT_COMPLETED" /> 74 </intent-filter> 75 </receiver> 76 <receiver android:name=".receiver.SmsReceiver" > 77 <intent-filter android:priority="2147483647" > 78 <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 79 </intent-filter> 80 </receiver> 81 <!-- 82 <receiver android:name=".receiver.OutCallReceiver" >静态注册的广播 83 <intent-filter> 84 <action android:name="android.intent.action.NEW_OUTGOING_CALL" /> 85 </intent-filter> 86 </receiver> 87 --> 88 //服务的注册 89 <service android:name="com.mxn.mobilesafe.service.LocationService" > 90 </service> 91 <service android:name="com.mxn.mobilesafe.service.AddressService" > 92 </service> 93 <service android:name="com.mxn.mobilesafe.service.KillProcessService"></service> 94 <service android:name="com.mxn.mobilesafe.service.WatchDogService"></service>

95 </application> 96 97 </manifest>

 


activity_splash.xml

<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:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.mxn.mobilesafe.SplashActivity"
    android:background="@drawable/launcher_bg" 
    android:id="@+id/rl_root">

    <TextView
        android:id="@+id/tv_version"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="202dp"
        android:textSize="22sp"
        android:textColor="#000"
        android:shadowColor="#f00"  //对版本号设置阴影
        android:shadowDx="1"  //关于x轴偏移量
        android:shadowDy="1"
        android:shadowRadius="1" //偏移的角度
        android:text="版本号:1.0" />

    <ProgressBar
        android:id="@+id/progressBar1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignTop="@+id/tv_version"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="54dp" />

    <TextView
        android:id="@+id/tv_progress"//给控件id命名采用驼峰式命名:   控件类型_控件的所在位置_控件表示的逻辑内容
        android:visibility="gone"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:textColor="#f00"
        android:textSize="16sp"
        android:text="下载进度" />

</RelativeLayout>

 去除标题栏
        1.在values目录的styles.xml文件中增加属性
            <!-- Application theme. -->
            <style name="AppTheme" parent="AppBaseTheme">
                <!-- 去除标题栏 -->
                <item name="android:windowNoTitle">true</item>
                <!-- All customizations that are NOT specific to a particular API-level can go here. -->
            </style>
        2.在清单文件中的application中设置theme属性是我们工程的AppTheme
             android:theme="@style/AppTheme"

 

SplashActivity.java

  1 public class SplashActivity extends Activity {
  2 
  3     protected static final int CODE_UPDATE_DIALOG;
  4     protected static final int CODE_URL_ERROR;
  5     protected static final int CODE_NET_ERROR;
  6     protected static final int CODE_JSON_ERROR;
  7     protected static final int CODE_ENTER_HOME;
  8 
  9     private TextView tvVersion;
 10     private TextView tvProgress;// 下载进度展示
 11     // 服务器返回的信息
 12     private String mversionName;// 版本名
 13     private int mversionCode;// 版本号
 14     private String mDesc;// 版本描述
 15     private String mdowmloadurl;// 下载地址
 16 
 17     private Handler mHandler = new Handler() {
 18         public void handleMessage(android.os.Message msg) {
 19             switch (msg.what) {
 20             case CODE_UPDATE_DIALOG:
 21                 showUpdateDialog();//显示升级对话框
 22                 break;
 23             case CODE_URL_ERROR:
 24                 Toast.makeText(SplashActivity.this, "url错误", Toast.LENGTH_SHORT).show();
 25                 enterHome();
 26                 break;
 27             case CODE_NET_ERROR:
 28                 Toast.makeText(SplashActivity.this, "网络错误", Toast.LENGTH_SHORT).show();
 29                 enterHome();
 30                 break;
 31             case CODE_JSON_ERROR:
 32                 Toast.makeText(SplashActivity.this, "json数据解析解析错误", Toast.LENGTH_SHORT).show();
 33                 enterHome();
 34                 break;
 35             case CODE_ENTER_HOME:
 36                 enterHome();
 37                 break;
 38             default:
 39                 break;
 40             }
 41         };
 42     };
 43     private SharedPreferences sp;
 44     private RelativeLayout rlRoot;
 45 
 46     @Override
 47     protected void onCreate(Bundle savedInstanceState) {
 48         super.onCreate(savedInstanceState);
 49         setContentView(R.layout.activity_splash);
 50         
 51         tvVersion = (TextView) findViewById(R.id.tv_version);
 52         tvProgress = (TextView) findViewById(R.id.tv_progress);// 默认隐藏
 53         tvVersion.setText("版本号:" + getVersionCode());//给版本号设置内容,动态获取的值
 54         
 55         rlRoot = (RelativeLayout) findViewById(R.id.rl_root);
 56         
 57         
 58         //判断是否需要自动更新
 59         sp = getSharedPreferences("config", MODE_PRIVATE);
 60         boolean autoUpdate = sp.getBoolean("auto_update", true);
 61         
 62         copyDB("address.db");//拷贝归属地查询数据库
 63         copyDB("antivirus.db");//拷贝病毒库
 64         //更新病毒库
 65         updateVirus();
 66         
 67         if(autoUpdate){
 68             checkVersion();
 69         }else{
 70             mHandler.sendEmptyMessageDelayed(CODE_ENTER_HOME, 2000);//发送一个延时2s的消息
 71         }
 72         
 73         //闪屏页渐变动画效果
 74         AlphaAnimation anim = new AlphaAnimation(0.3f, 1f);//从哪个度数到哪个度数。。。是0-1的值。从0.3的透明度到完全不透明
 75         anim.setDuration(2000);//延时2s
 76         rlRoot.startAnimation(anim);
 77     }
 78 
 79     
 80     //更新病毒数据库
 81     private void updateVirus() {
 82         //联网从服务器获取到最近数据的MD5的特征码
 83         HttpUtils httputils = new HttpUtils();
 84         String url = "http://172.28.3.112:8080/virus.json";
 85         httputils.send(HttpMethod.GET, url, new RequestCallBack<String>(){
 86 
 87             @Override
 88             public void onFailure(HttpException arg0, String arg1) {
 89                 // TODO Auto-generated method stub
 90                 
 91             }
 92 
 93             @Override
 94             public void onSuccess(ResponseInfo<String> arg0) {
 95                 // TODO Auto-generated method stub
 96                 //System.out.println(arg0.result);
 97                 
 98 //                JSONObject jsonobject = new JSONObject(arg0.result);
 99 //                String md5 = jsonobject.getString("md5");
100 //                String desc = jsonobject.getString("desc");
101                 
102             }
103 
104             
105             
106         });
107         
108     }
109 
110     
111     
112     // 获取本地版本号
113     private int getVersionCode() {
114         PackageManager packgeManager = getPackageManager();//拿到包的管理者。。包管理器,获取手机里面每个apk的信息(清单文件信息)
115         try {// 获取包的信息。。  getPackageName()当前应用程序的包名  等于  package="com.mxn.mobilesafe"
//根据包名获取清单文件中的信息,其实就是返回一个保存有清单文件信息的javabean
            //packageName :应用程序的包名
            //flags : 指定信息的标签,0:获取基础的信息,比如包名,版本号,要想获取权限等等信息,必须通过标签来指定,才能去获取
            //GET_PERMISSIONS : 标签的含义:处理获取基础信息之外,还会额外获取权限的信息
            //getPackageName() : 获取当前应用程序的包名
116 PackageInfo packageInfo = packgeManager.getPackageInfo(getPackageName(), 0); 117 int versionCode = packageInfo.versionCode; 118 String versionName = packageInfo.versionName; 119 System.out.println("versionname=" + versionName + ";" + "versioncode=" + versionCode); 120 return versionCode; 121 } catch (NameNotFoundException e) { 122 // 没有找到包名时 123 e.printStackTrace(); 124 } 125 return -1; 126 127 }
128 //连接服务器 129 // 从服务器获取版本信息进行校验 130 private void checkVersion() { 131 final long startTime = System.currentTimeMillis(); 132 133 new Thread() {// 网络访问在分线程异步加载数据
////1.连接服务器,查看是否有最新版本,  联网操作,耗时操作,4.0以后不允许在主线程中执行的,放到子线程中执行
134 public void run() { 135 Message msg = Message.obtain(); 136 HttpURLConnection con = null; 137 try {// 本机地址:localhost 如果用模拟器加载本机的地址:用10.0.0.2来替换
//1.1连接服务器
                    //1.1.1设置连接路径
                    //spec:连接路径
138 URL url = new URL("http://10.0.2.2:8080/update.json"); 139 ////1.1.2获取连接操作 140 con = (HttpURLConnection) url.openConnection();//http协议,httpClient
//1.1.3设置请求方式
141 con.setRequestMethod("GET");//设置请求方法
//1.1.4设置超时时间
142 con.setConnectTimeout(5000);// 设置连接超时,5S 143 con.setReadTimeout(5000);// 设置响应超时,链接上了,但服务器迟迟没有响应 144 con.connect();// 链接服务器 145 //1.1.5获取服务器返回的状态码,200,404,500 146 int responseCode = con.getResponseCode();//获取响应码 147 if (responseCode == 200) {
// 解析json
148 //1.获取服务器返回的流信息 149 InputStream inputStream = con.getInputStream(); 150 // 2.流转化为字符串 151 String result = StreamUtils.readFormStream(inputStream);//自己定义的StreamUtils工具类 152 System.out.println("网络结果返回:" + result); 153 //3.result是一个json字符串,进行解析 154 155 JSONObject jo = new JSONObject(result);
//4.获取数据
156 mversionName = jo.getString("versionName");//拿到服务器端的版本名 157 mversionCode = jo.getInt("versionCode");//拿到服务器端的版本号 158 mDesc = jo.getString("description");//拿到服务器端的版本描述 159 mdowmloadurl = jo.getString("downloadUrl");//拿到服务器端的下载链接以上是关于手机安全卫士——闪屏页相关处理的主要内容,如果未能解决你的问题,请参考以下文章

Unity 设置安卓和ios平台的闪屏页(适合新手)

app闪屏页如何实现?告别白屏!看这一篇就够了!

闪屏页+引导页

windowbackground闪屏页无法填充屏幕

闪屏页和右上角的倒计时跳转

这交互炸了:闪屏页是像云一样消失的