详谈闪屏页相关处理

详谈闪屏页相关处理,第1张

概述根据功能模块划分(Android开发推荐此方法)   -Activity  mobilesafe.activty

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

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

闪屏页面(Splash)作用:

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

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

<?xml version="1.0" enCoding="utf-8"?><manifest xmlns:androID="http://schemas.androID.com/apk/res/androID" package="com.mxn.mobilesafe" androID:versionCode="1" //版本号 androID:versionname="1.0" > //版本名 <uses-sdk  androID:minSdkVersion="16"  androID:targetSdkVersion="21" />//项目所需的权限 <uses-permission androID:name="androID.permission.INTERNET" /> <uses-permission androID:name="androID.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission androID:name="androID.permission.READ_PHONE_STATE" /> <uses-permission androID:name="androID.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission androID:name="androID.permission.READ_CONTACTS" /> <uses-permission androID:name="androID.permission.SEND_SMS" /> <uses-permission androID:name="androID.permission.RECEIVE_SMS" /> <uses-permission androID:name="androID.permission.ACCESS_FINE_LOCATION" /> <uses-permission androID:name="androID.permission.ACCESS_COARSE_LOCATION" /> <uses-permission androID:name="androID.permission.ACCESS_MOCK_LOCATION" /> <uses-permission androID:name="androID.permission.VIBRATE" /> <uses-permission androID:name="androID.permission.PROCESS_OUTGOING_CALLS" /> <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"/> <application  androID:allowBackup="true"  androID:icon="@drawable/ic_launcher"  androID:label="@string/app_name"  androID:theme="@style/Apptheme" > //主题   //activity的注册  <activityandroID:name="com.mxn.mobilesafe.activity.SplashActivity"   androID:label="@string/app_name" >   <intent-filter> //起始的activity    <action androID:name="androID.intent.action.MAIN" />    <category androID:name="androID.intent.category.LAUNCHER" />   </intent-filter>  </activity>  <activity androID:name="com.mxn.mobilesafe.activity.HomeActivity" />  <activity androID:name="com.mxn.mobilesafe.activity.SettingActivity" />  <activity androID:name="com.mxn.mobilesafe.activity.LostFindActivity" >  </activity>  <activity androID:name="com.mxn.mobilesafe.activity.Setup1Activity" >  </activity>  <activity androID:name="com.mxn.mobilesafe.activity.Setup2Activity" >  </activity>  <activity androID:name="com.mxn.mobilesafe.activity.Setup3Activity" >  </activity>  <activity androID:name="com.mxn.mobilesafe.activity.Setup4Activity" >  </activity>  <activity androID:name="com.mxn.mobilesafe.activity.ContactActivity" >  </activity>  <activity androID:name="com.mxn.mobilesafe.activity.AtoolsActivity" >  </activity>  <activity androID:name="com.mxn.mobilesafe.activity.AddressActivity" >  </activity>  <activity androID:name="com.mxn.mobilesafe.activity.CallSafeActivity" >  </activity>  <activity androID:name="com.mxn.mobilesafe.activity.AppManagerActivity" >  </activity>  <activity androID:name="com.mxn.mobilesafe.activity.TaskManagerActivity">     </activity>  <activity androID:name="com.mxn.mobilesafe.activity.TaskManagerSettingActivity">     </activity>  <activity androID:name="com.mxn.mobilesafe.activity.AntivirusActivity"></activity>  <activity androID:name="com.mxn.mobilesafe.activity.AppLockActivity"></activity>  <activity androID:name="com.mxn.mobilesafe.activity.CleanCacheActivity"></activity>//广播接收者的 注册  <receiver androID:name=".receiver.BootCompleteReceiver" >   <intent-filter>    <action androID:name="androID.intent.action.BOOT_COMPLETED" />   </intent-filter>  </receiver>  <receiver androID:name=".receiver.SmsReceiver" >   <intent-filter androID:priority="2147483647" >    <action androID:name="androID.provIDer.Telephony.SMS_RECEIVED" />   </intent-filter>  </receiver>  <!--  <receiver androID:name=".receiver.Outcallreceiver" >静态注册的广播   <intent-filter>    <action androID:name="androID.intent.action.NEW_OUTGOING_CALL" />   </intent-filter>  </receiver>  -->//服务的注册  <service androID:name="com.mxn.mobilesafe.service.LocationService" >  </service>  <service androID:name="com.mxn.mobilesafe.service.AddressService" >  </service>  <service androID:name="com.mxn.mobilesafe.service.KillProcessService"></service>  <service androID:name="com.mxn.mobilesafe.service.WatchDogService"></service> </application></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"  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"  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>

SplashActivity.java

public class SplashActivity extends Activity { protected static final int CODE_UPDATE_DIALOG; protected static final int CODE_URL_ERROR; protected static final int CODE_NET_ERROR; protected static final int CODE_JsON_ERROR; protected static final int CODE_ENTER_HOME; private TextVIEw tvVersion; private TextVIEw tvProgress;// 下载进度展示 // 服务器返回的信息 private String mversionname;// 版本名 private int mversionCode;// 版本号 private String mDesc;// 版本描述 private String mdowmloadurl;// 下载地址 private Handler mHandler = new Handler() {  public voID handleMessage(androID.os.Message msg) {   switch (msg.what) {   case CODE_UPDATE_DIALOG:    showUpdateDialog();//显示升级对话框    break;   case CODE_URL_ERROR:    Toast.makeText(SplashActivity.this,"url错误",Toast.LENGTH_SHORT).show();    enterHome();    break;   case CODE_NET_ERROR:    Toast.makeText(SplashActivity.this,"网络错误",Toast.LENGTH_SHORT).show();    enterHome();    break;   case CODE_JsON_ERROR:    Toast.makeText(SplashActivity.this,"Json数据解析解析错误",Toast.LENGTH_SHORT).show();    enterHome();    break;   case CODE_ENTER_HOME:    enterHome();    break;   default:    break;   }  }; }; private SharedPreferences sp; private relativeLayout rlRoot; @OverrIDe protected voID onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentVIEw(R.layout.activity_splash);  tvVersion = (TextVIEw) findVIEwByID(R.ID.tv_version);  tvProgress = (TextVIEw) findVIEwByID(R.ID.tv_progress);// 默认隐藏  tvVersion.setText("版本号:" + getVersionCode());//给版本号设置内容,动态获取的值  rlRoot = (relativeLayout) findVIEwByID(R.ID.rl_root);  //判断是否需要自动更新  sp = getSharedPreferences("config",MODE_PRIVATE);  boolean autoUpdate = sp.getBoolean("auto_update",true);  copyDB("address.db");//拷贝归属地查询数据库  copyDB("antivirus.db");//拷贝病毒库  //更新病毒库  updateVirus();  if(autoUpdate){   checkVersion();  }else{   mHandler.sendEmptyMessageDelayed(CODE_ENTER_HOME,2000);  }  //闪屏页渐变动画效果  AlphaAnimation anim = new AlphaAnimation(0.3f,1f);  anim.setDuration(2000);  rlRoot.startAnimation(anim); } //更新病毒数据库 private voID updateVirus() {  //联网从服务器获取到最近数据的MD5的特征码  httpUtils httputils = new httpUtils();  String url = "http://172.28.3.112:8080/virus.Json";  httputils.send(httpMethod.GET,url,new RequestCallBack<String>(){   @OverrIDe   public voID onFailure(httpException arg0,String arg1) {    // Todo auto-generated method stub   }   @OverrIDe   public voID onSuccess(ResponseInfo<String> arg0) {    // Todo auto-generated method stub    //System.out.println(arg0.result);//    JsONObject Jsonobject = new JsONObject(arg0.result);//    String md5 = Jsonobject.getString("md5");//    String desc = Jsonobject.getString("desc");   }  }); } // 获取本地版本号 private int getVersionCode() {  PackageManager packgeManager = getPackageManager();//拿到包的管理者。。包管理器,获取手机里面每个apk的信息(清单文件信息)  try {// 获取包的信息。。 getPackagename()当前应用程序的包名 等于 package="com.mxn.mobilesafe"   PackageInfo packageInfo = packgeManager.getPackageInfo(getPackagename(),0);   int versionCode = packageInfo.versionCode;   String versionname = packageInfo.versionname;   System.out.println("versionname=" + versionname + ";" + "versioncode=" + versionCode);   return versionCode;  } catch (nameNotFoundException e) {   // 没有找到包名时   e.printstacktrace();  }  return -1; } // 从服务器获取版本信息进行校验 private voID checkVersion() {  final long startTime = System.currentTimeMillis();  new Thread() {// 网络访问在分线程异步加载数据   public voID run() {    Message msg = Message.obtain();    httpURLConnection con = null;    try {// 本机地址:localhost 如果用模拟器加载本机的地址:用10.0.0.2来替换     URL url = new URL("http://10.0.2.2:8080/update.Json");     // 打开连接     con = (httpURLConnection) url.openConnection();     con.setRequestMethod("GET");//设置请求方法     con.setConnectTimeout(5000);// 设置连接超时,5S     con.setReadTimeout(5000);// 设置响应超时,链接上了,但服务器迟迟没有响应     con.connect();// 链接服务器     int responseCode = con.getResponseCode();//获取响应码     if (responseCode == 200) {      // 获取返回值      inputStream inputStream = con.getinputStream();      // 流转化为字符串      String result = StreamUtils.readFormStream(inputStream);//自己定义的StreamUtils工具类      System.out.println("网络结果返回:" + result);       //result是一个Json字符串,进行解析      // 解析Json      JsONObject jo = new JsONObject(result);      mversionname = jo.getString("versionname");//拿到服务器端的版本名      mversionCode = jo.getInt("versionCode");//拿到服务器端的版本号      mDesc = jo.getString("description");//拿到服务器端的版本描述      mdowmloadurl = jo.getString("downloadUrl");//拿到服务器端的下载链接      System.out.println(mDesc);      System.out.println(mversionCode);      // 服务器的大于 本地的,判断是否有更新,如果大于 则有更新需要更新,d出升级对话框      if (mversionCode > getVersionCode()) {       System.out.println("进行比较,有版本更新");       msg.what = CODE_UPDATE_DIALOG;       // showUpdateDialog();//这句是在子线程更新界面,androID不能在子线程更新界面,要想在子线程更新界面所以用到handler.      } else {// 如果没有版本更新       msg.what = CODE_ENTER_HOME;      }     }    } catch (MalformedURLException e) {// url错误的异常     msg.what = CODE_URL_ERROR;     e.printstacktrace();    } catch (IOException e) {//网络错误异常     // 这个是可以携带数据的msg.obj =     msg.what = CODE_NET_ERROR;// what只是一个标识,用来区分消息!     e.printstacktrace();    } catch (JsONException e) {// Json解析失败     msg.what = CODE_JsON_ERROR;     e.printstacktrace();    } finally {     long endTime = System.currentTimeMillis();     long timeUsed = endTime - startTime;// 访问网络花费的时间     if (timeUsed < 2000) {      try {// 强制休眠2s,保证闪屏页面2S       Thread.sleep(2000 - timeUsed);      } catch (InterruptedException e) {       // Todo auto-generated catch block       e.printstacktrace();      }     }     mHandler.sendMessage(msg);// 消息发送出去,在handlemessage里进行相应的处理     if (con != null) {      con.disconnect();     }    }   }  }.start(); }  //升级对话框 private voID showUpdateDialog() {  System.out.println("正在升级对话框");  // 升级对话框  AlertDialog.Builder builder = new AlertDialog.Builder(this);//context对象  builder.setTitle("最新版本" + mversionname);  builder.setMessage(mDesc);  // builder.setCancelable(false);//不让用户取消对话框,用户体验太差  builder.setPositivebutton("立即更新",new OnClickListener() {   @OverrIDe   public voID onClick(DialogInterface dialog,int which) {    // Todo auto-generated method stub    System.out.println("立即更新");    // download方法    download();   }  });  builder.setNegativebutton("以后再说",int which) {    enterHome();   }  });  builder.setonCancelListener(new OnCancelListener() {   // 设置取消监听,用户点击返回键时触发   @OverrIDe   public voID onCancel(DialogInterface dialog) {    enterHome();   }  });  builder.show(); } protected voID download() {// 下载服务器端的apk文件  if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {    // 判断是否有sd卡,sd卡挂载的时候才可以   tvProgress.setVisibility(VIEw.VISIBLE);// 显示进度   String target = Environment.getExternalStorageDirectory() + "/update.apk";//把文件下载到哪个路径下,sd卡的根目录   // xutils框架,使用httpUtils工具下载文件,下载一个jar包   httpUtils utils = new httpUtils();   utils.download(mdowmloadurl,target,new RequestCallBack<file>() {    @OverrIDe // 文件下载进度    public voID onLoading(long total,long current,boolean isuploading) {     // Todo auto-generated method stub     super.onLoading(total,current,isuploading);     System.out.println("下载进度:" + current + "/" + total);     tvProgress.setText("下载进度:" + current * 100 / total + "%");    }    @OverrIDe    public voID onSuccess(ResponseInfo<file> arg0) {     // Todo auto-generated method stub     Toast.makeText(SplashActivity.this,"下载成功",Toast.LENGTH_SHORT).show();     // 下载完成之后,跳到系统的安装界面。。Intent.ACTION_VIEW 是xml的action 标签     Intent intent = new Intent(Intent.ACTION_VIEW);//系统的安装界面     intent.addcategory(Intent.category_DEFAulT);      intent.setDataAndType(Uri.fromfile(arg0.result),"application/vnd.androID.package-archive");     // startActivity(intent);     startActivityForResult(intent,0);// 如果用户取消安装,会返回结果,回调方法onActivityResult,下文定义    }    @OverrIDe    public voID onFailure(httpException arg0,String arg1) {     // Todo auto-generated method stub     Toast.makeText(SplashActivity.this,"下载失败",Toast.LENGTH_SHORT).show();    }   });  } else {   Toast.makeText(SplashActivity.this,"没有SD卡",Toast.LENGTH_SHORT).show();  } }  @OverrIDe//用户取消安装,回调此方法 protected voID onActivityResult(int requestCode,int resultCode,Intent data) {  // Todo auto-generated method stub  System.out.println("出现安装界面,用户点击取消时。");  enterHome();  super.onActivityResult(requestCode,resultCode,data); } private voID enterHome() {// 进入主界面  Intent intent = new Intent(this,HomeActivity.class);  startActivity(intent);  finish(); } //拷贝数据库,从assets目录下拷贝到data/data/com.mxn.mobilesafe/files目录下 private voID copyDB(String dbname){  //获取文件路径  file destfile = new file(getfilesDir(),dbname);  if(destfile.exists()){   System.out.println("已存在");  }  fileOutputStream out = null;  inputStream in = null;  try {   in = getAssets().open(dbname);   out = new fileOutputStream(destfile);   int len = 0;    byte[] buffer = new byte[1024];   while((len = in.read(buffer))!=-1){    out.write(buffer,len);   }   } catch (IOException e) {   // Todo auto-generated catch block   e.printstacktrace();  }finally{   try {    in.close();    out.close();   } catch (IOException e) {    // Todo auto-generated catch block    e.printstacktrace();   }  } }}

StreamUtils.java

 /* * 读取流的工具 * 把流对象转换成字符串对象 */public class StreamUtils { //将输入流读取成String后返回 public static String readFormStream(inputStream in) throws IOException{   // 定义字节数组输出流对象   ByteArrayOutputStream out = new ByteArrayOutputStream();   // 定义读取的长度   int len = 0 ;  // 定义读取的缓冲区  byte[] buffer = new byte[1024];   // 按照定义的缓冲区进行循环读取,直到读取完毕为止   while((len=in.read(buffer))!=-1){    // 根据读取的长度写入到字节数组输出流对象中    out.write(buffer,len);     }  String result = out.toString();   // 关闭流   in.close();  out.close();  return result;//   // 把读取的字节数组输出流对象转换成字节数组 //   byte data[] = out.toByteArray(); //  // 按照指定的编码进行转换成字符串(此编码要与服务端的编码一致就不会出现乱码问题了,androID默认的编码为UTF-8) //   return new String(data,"UTF-8");  }}

系统安装界面的activity的配置:

<activity androID:name=".PackageInstallerActivity"androID:configChanges="orIEntation|keyboardHIDden"androID:theme="@style/theme.transparent">   <intent-filter>    <action androID:name="androID.intent.action.VIEW" />    <category androID:name="androID.intent.category.DEFAulT" />    <data androID:scheme="content" />    <data androID:scheme="file" />    <data androID:mimeType="application/vnd.androID.package-archive" />   </intent-filter>  </activity>

我们服务器用的是tomcat,里面放置  新版本的apk和update.Json:

将代码打包为apk文件:

涉及的知识点:

PackageManager  包管理器,获取手机里面每个apk的信息(清单文件信息)

版本更新流程:

网络请求

>  * URL
>  * httpUrlConntetion

JsON解析

> * JsONObject  专门用来解析Json
> * JsONArray

对话框d出

> AlertDialog
> AlertDialog.Builder

子线程更新UI

> * Handler + message
> * runOnUiThread(runnable)

页面之间的跳转Intent

GitHub 一个开源的网站,下载xUtils框架,将下载的jar包导入工程。

AlertDialog.Builder(this)

子类拥有父类的所有方法,而且可以有更多自己的方法。父类无法有子类的方法

Activity(token),Context(没有token)

平时,要获取context对象的话,优先选择Activity,避免BUG出现,尽量不用getApplicationContext()

activity是context的子类

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持编程小技巧!

总结

以上是内存溢出为你收集整理的详谈闪屏相关处理全部内容,希望文章能够帮你解决详谈闪屏页相关处理所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1147050.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存