1. 闪屏页面的开发

效果图

闪屏页面布局

<?xmlversion="1.0"encoding="utf-8"?><RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@mipmap/splash"><TextViewandroid:id="@+id/center"android:layout_width="0dp"android:layout_height="0dp"android:layout_centerInParent="true"/><TextViewandroid:id="@+id/tv_version"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@id/center"android:layout_centerHorizontal="true"android:layout_marginTop="44dp"android:shadowColor="#f00"android:shadowDx="1"android:shadowDy="1"android:shadowRadius="1"android:text="版本1.0"/><ProgressBarandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@id/tv_version"android:layout_centerHorizontal="true"/><TextViewandroid:id="@+id/tv_progress"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:layout_margin="5dp"android:text="下载:10%"android:textColor="#f00"android:visibility="gone"/></RelativeLayout>

Java代码

packagecom.ztjc.mobilesafe.activity;importandroid.app.Activity;importandroid.content.DialogInterface;importandroid.content.Intent;importandroid.content.pm.PackageInfo;importandroid.content.pm.PackageManager;importandroid.net.Uri;importandroid.os.Bundle;importandroid.os.Environment;importandroid.os.Handler;importandroid.os.Message;importandroid.support.v7.app.AlertDialog;importandroid.view.View;importandroid.widget.TextView;importandroid.widget.Toast;importcom.lidroid.xutils.HttpUtils;importcom.lidroid.xutils.exception.HttpException;importcom.lidroid.xutils.http.ResponseInfo;importcom.lidroid.xutils.http.callback.RequestCallBack;importcom.ztjc.mobilesafe.R;importcom.ztjc.mobilesafe.util.StreamUtil;importorg.json.JSONException;importorg.json.JSONObject;importjava.io.File;importjava.io.IOException;importjava.net.HttpURLConnection;importjava.net.MalformedURLException;importjava.net.URL;/***Android手机卫士,闪屏页面*/publicclassSplashActivityextendsActivity{privatestaticfinalintCODE_UPDATE_DIALOG=1;//更新对话框privatestaticfinalintCODE_ENTER_HOME=2;//进入主页面privatestaticfinalintCODE_URL_ERROR=3;//url错误privatestaticfinalintCODE_NET_ERROR=4;//网络错误privatestaticfinalintCODE_JSON_ERROR=5;//json解析错误privateTextViewtvVersion;privateTextViewtvProgress;privateStringmVersionName;//版本名privateintmVersionCode;//版本号privateStringmDesc;//版本描述privateStringmDownload;//下载地址privateHandlermHandler=newHandler(){@OverridepublicvoidhandleMessage(Messagemsg){switch(msg.what){caseCODE_UPDATE_DIALOG:showUploadDialog();break;caseCODE_ENTER_HOME:enterHome();break;caseCODE_URL_ERROR:Toast.makeText(SplashActivity.this,"url错误",Toast.LENGTH_SHORT).show();enterHome();break;caseCODE_NET_ERROR:Toast.makeText(SplashActivity.this,"网络错误",Toast.LENGTH_SHORT).show();enterHome();break;caseCODE_JSON_ERROR:Toast.makeText(SplashActivity.this,"数据解析错误",Toast.LENGTH_SHORT).show();enterHome();break;}}};@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_splash);tvVersion=(TextView)findViewById(R.id.tv_version);tvProgress=(TextView)findViewById(R.id.tv_progress);tvVersion.setText("版本:"+getVersionName());checkVersion();}/***获取版本名称**@return*/publicStringgetVersionName(){PackageManagerpackageManager=getPackageManager();try{PackageInfopackageInfo=packageManager.getPackageInfo(getPackageName(),0);returnpackageInfo.versionName;}catch(PackageManager.NameNotFoundExceptione){e.printStackTrace();}return"";}/***获取版本号**@return*/publicintgetVersioinCode(){PackageManagerpackageManager=getPackageManager();try{PackageInfopackageInfo=packageManager.getPackageInfo(getPackageName(),0);returnpackageInfo.versionCode;}catch(PackageManager.NameNotFoundExceptione){e.printStackTrace();}return-1;}/***检测服务器版本*/privatevoidcheckVersion(){finallongstartTime=System.currentTimeMillis();//启动子线程异步加载数据newThread(){@Overridepublicvoidrun(){Messagemessage=Message.obtain();HttpURLConnectionconnection=null;try{URLurl=newURL("http://192.168.1.105:8080/json/mobilesafe.json");connection=(HttpURLConnection)url.openConnection();connection.setRequestMethod("GET");connection.setConnectTimeout(5000);connection.setReadTimeout(5000);if(connection.getResponseCode()==200){//请求成功获取服务器返回的jsonStringresult=StreamUtil.decodeToString(connection.getInputStream());//使用jsonObject解析json,json的解析有多种方式(fastjson、gson、jsonObject等,先实现功能)JSONObjectjsonObject=newJSONObject(result);mVersionName=jsonObject.getString("versionName");mDesc=jsonObject.getString("description");mDownload=jsonObject.getString("downLoadUrl");mVersionCode=jsonObject.getInt("versionCode");//判断服务器和本地版本if(mVersionCode>getVersioinCode()){//服务器版本大于本地版本,弹出更新提示message.what=CODE_UPDATE_DIALOG;}else{//没有版本更新,直接进入主页面message.what=CODE_ENTER_HOME;}}}catch(MalformedURLExceptione){//URL错误message.what=CODE_URL_ERROR;e.printStackTrace();}catch(IOExceptione){//网络错误message.what=CODE_NET_ERROR;e.printStackTrace();}catch(JSONExceptione){//json解析失败message.what=CODE_JSON_ERROR;e.printStackTrace();}finally{if(connection!=null){connection.disconnect();//关闭网络连接}longendTime=System.currentTimeMillis();longuseTime=endTime-startTime;//总共花费的时间if(useTime<2000){//强制休眠一段时间,保证闪屏在2秒以上try{Thread.sleep(2000-useTime);}catch(InterruptedExceptione){e.printStackTrace();}}mHandler.sendMessage(message);}}}.start();}/***升级对话框*/privatevoidshowUploadDialog(){AlertDialog.Builderbuilder=newAlertDialog.Builder(this);builder.setTitle("最新版本:"+mVersionName);builder.setMessage(mDesc);builder.setPositiveButton("立即更新",newDialogInterface.OnClickListener(){@OverridepublicvoidonClick(DialogInterfacedialog,intwhich){donwload();}});builder.setNegativeButton("以后再说",newDialogInterface.OnClickListener(){@OverridepublicvoidonClick(DialogInterfacedialog,intwhich){enterHome();}});//设置取消监听,用户点击返回键时触发builder.setOnCancelListener(newDialogInterface.OnCancelListener(){@OverridepublicvoidonCancel(DialogInterfacedialog){enterHome();}});builder.show();}/***下载*/privatevoiddonwload(){//判断sd卡是否可用if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){tvProgress.setVisibility(View.VISIBLE);Stringtarget=Environment.getExternalStorageDirectory()+"/update.apk";//Xutils下载HttpUtilsutils=newHttpUtils();utils.download(mDownload,target,newRequestCallBack<File>(){//下载文件进度@OverridepublicvoidonLoading(longtotal,longcurrent,booleanisUploading){super.onLoading(total,current,isUploading);tvProgress.setText("下载进度"+current*100/total+"%");}//下载成功@OverridepublicvoidonSuccess(ResponseInfo<File>responseInfo){//安装应用Intentintent=newIntent();intent.setAction(Intent.ACTION_VIEW);intent.setDataAndType(Uri.fromFile(responseInfo.result),"application/vnd.android.package-archive");startActivityForResult(intent,0);//如果用户点击取消,会调用onActivityResult方法}//下载失败@OverridepublicvoidonFailure(HttpExceptionerror,Stringmsg){Toast.makeText(SplashActivity.this,"下载失败",Toast.LENGTH_SHORT).show();}});}else{Toast.makeText(this,"没找到SD卡",Toast.LENGTH_SHORT).show();}}//如果用户取消安装进入主页面@OverrideprotectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){enterHome();}/***进入主页面*/privatevoidenterHome(){startActivity(newIntent(this,HomeActivity.class));finish();}}

工具类代码

packagecom.ztjc.mobilesafe.util;importjava.io.ByteArrayOutputStream;importjava.io.IOException;importjava.io.InputStream;/***流工具类*/publicclassStreamUtil{/***把流解析成字符串*@paraminputStream*@return*@throwsIOException*/publicstaticStringdecodeToString(InputStreaminputStream)throwsIOException{ByteArrayOutputStreamoutputStream=newByteArrayOutputStream();byte[]b=newbyte[1024];intlen=0;while((len=inputStream.read(b))!=-1){outputStream.write(b,0,len);}returnnewString(outputStream.toByteArray());}}

2. 主界面开发

效果图

主界面布局

<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><TextViewandroid:layout_width="match_parent"android:layout_height="50dp"android:background="#8866ff00"android:gravity="center"android:text="功能列表"android:textColor="@color/black"android:textSize="22sp"/><com.ztjc.mobilesafe.view.FocusedTextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginBottom="5dp"android:layout_marginTop="5dp"android:ellipsize="marquee"android:singleLine="true"android:text="有了手机卫士,腰不酸了,腿部疼痛了,走路也有劲了,手机卫士太牛逼了"android:textColor="@color/black"android:textSize="18sp"/><GridViewandroid:id="@+id/gv_home"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:numColumns="3"android:verticalSpacing="20dp"/></LinearLayout>

菜单项GridView子项布局

<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="wrap_content"android:layout_height="wrap_content"android:gravity="center"android:orientation="vertical"><ImageViewandroid:id="@+id/iv_item"android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@mipmap/home_apps"/><TextViewandroid:id="@+id/tv_item"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="5dp"android:text="手机防盗"android:textColor="@color/black"android:textSize="18sp"/></LinearLayout>

Java代码

packagecom.ztjc.mobilesafe.activity;importandroid.app.Activity;importandroid.os.Bundle;importandroid.view.View;importandroid.view.ViewGroup;importandroid.widget.BaseAdapter;importandroid.widget.GridView;importandroid.widget.ImageView;importandroid.widget.TextView;importcom.ztjc.mobilesafe.R;/***Android手机卫士,主页面*/publicclassHomeActivityextendsActivity{privateGridViewgridView;privateString[]mImtes={"手机防盗","通讯卫士","软件管理","进程管理","流量统计","手机杀毒","缓存清理","高级工具","设置中心"};privateint[]mPic={R.mipmap.home_safe,R.mipmap.home_callmsgsafe,R.mipmap.home_apps,R.mipmap.home_taskmanager,R.mipmap.home_netmanager,R.mipmap.home_trojan,R.mipmap.home_sysoptimize,R.mipmap.home_tools,R.mipmap.home_settings};@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_home);gridView=(GridView)findViewById(R.id.gv_home);gridView.setAdapter(newHomeAdapter());}/***主功能菜单适配器*/classHomeAdapterextendsBaseAdapter{@OverridepublicintgetCount(){returnmImtes.length;}@OverridepublicObjectgetItem(intposition){returnmImtes[position];}@OverridepubliclonggetItemId(intposition){returnposition;}@OverridepublicViewgetView(intposition,ViewconvertView,ViewGroupparent){ViewHolderviewHolder=null;if(convertView==null){viewHolder=newViewHolder();convertView=View.inflate(HomeActivity.this,R.layout.home_list_item,null);viewHolder.ivItem=(ImageView)convertView.findViewById(R.id.iv_item);viewHolder.tvItem=(TextView)convertView.findViewById(R.id.tv_item);convertView.setTag(viewHolder);}else{viewHolder=(ViewHolder)convertView.getTag();}viewHolder.ivItem.setImageResource(mPic[position]);viewHolder.tvItem.setText(mImtes[position]);returnconvertView;}classViewHolder{ImageViewivItem;TextViewtvItem;}}}

自定义TextView代码,主要是获取焦点

packagecom.ztjc.mobilesafe.view;importandroid.content.Context;importandroid.util.AttributeSet;importandroid.widget.TextView;/***获取焦点的TextView*/publicclassFocusedTextViewextendsTextView{publicFocusedTextView(Contextcontext){super(context);}publicFocusedTextView(Contextcontext,AttributeSetattrs){super(context,attrs);}publicFocusedTextView(Contextcontext,AttributeSetattrs,intdefStyleAttr){super(context,attrs,defStyleAttr);}@OverridepublicbooleanisFocused(){returntrue;}}


更多相关文章

  1. Android(安卓)api对应系统版本
  2. 【Arcgis for android】Error inflating class com.esri.android
  3. Android各版本占比信息统计
  4. Configuration on demand is not supported by the current vers
  5. 【AS-AndroidX】迁移AndroidX带来的问题
  6. Android中如何获取应用版本号
  7. Error string types not allowed at android:configChanges in m
  8. Android获取手机的型号和系统版本
  9. build.gradle(module)

随机推荐

  1. Linux常用命令有哪些?
  2. 从零到一学懂区块链(3):地址
  3. 用Excel做相关性分析
  4. 世界是自己的。人来人往,车水马龙。我只是
  5. 从零到一学懂区块链(4):密钥
  6. 用Excel做直方图(1):随机数发生器
  7. 路遥作品读后感
  8. 从零到一学懂区块链(5):工作量证明
  9. 描述性统计分析
  10. 《请活着,不要装活着》