仿360手机卫兵的简便规划思路及源码-Android-优质IT资源分享社区

admin
管理员
管理员
  • UID1
  • 粉丝29
  • 关注4
  • 发帖数581
  • 社区居民
  • 忠实会员
  • 原创写手
阅读:274回复:0

  仿360手机卫兵的简便规划思路及源码

楼主#
更多 发布于:2016-05-30 22:01


笔者近来一向忙于满广州的跑,实习好难找好难找,博客也是有点久没去更新。仿360手机卫兵的完成的意图更多的是出于对常用知识点的一个稳固吧,比照适合像我这种接触没多久的学习者在学习之余拿来练手坚持写代码的感觉的的一个不错的小项目。
触及的技能:
都是些十分常用的android常用开发,但触及面临比广吧。(小编这边也谈不出啥新意,就简简单单举几个小比如,见谅见谅~!~)也是出于练手的意图吧,在写这个项意图时候也是用到了比照多的控件,有时一个疑问也用到了不相同的办法:比方说在解析效劳器的xml文件即用到通常的json数据解析,也用到了gjson数据解析数据(听说这个gjson现在被大有些公司所使用,小编是不是有点out了,哈哈);listview把戏就更多了,除了惯例的listview
+viewholder小优化思路,有些当地也是用到单个种类头部固定的listview;有些当地也用到自界说listview完成侧拉删去,一起还能够给listview条目添加动画添加视觉效果。别的,在listview数据加载时,能够是传统的加载,还有用到分批加载、分页加载。(哈哈,仍是蛮好玩的)别的细节假如大家有爱好直接进代码小看一番也不错,当然也用到很多动画和自界说控件,在下面各个有些的功用介绍小编也会小提一下啦。
功用介绍如下:
文章有限,小编这边就不罗列代码。。。
1、手机防盗
功用描绘:在主界面点击手机防盗按钮,弹出暗码输入框(若为首次进入则弹出设置暗码框界面),暗码的存储办法经过MD5加密后存储在SharePreference中,在验证完暗码后跳装到手机防盗页面(若还未对设置防盗信息会跳转到手机防盗设置页面),那就先来看下手机防盗设置页面:设置安全号码、绑定sim卡、以及是不是敞开防盗设置。手机防盗页面临设置的这些信息进行展现以及供给用户修正按钮。防盗功用:(1)开机监听手机sim卡改变,假如改变向安全号码发送提示短信;(2)在手机丢失的情况下经过长途短信操控完成:被盗手机铲除数据、被盗手机定位、被盗手机锁屏设置屏保以及操控被盗手机播报报警音乐。
技能完成:(1)检查sim卡改变:在手机防盗页面监听sim卡按钮改变,假如按钮敞开假如在手机防盗和sim卡按钮开机情况下,开机播送BootCompleteReceiver会获取当时手机sim卡号,和本来保留的sim卡号进行比照(经过TelephonyManager),若不相同,经过SmsManager目标以及安全号码发送短信。(2)手机定位、手机数据整理、手机防盗以及手机报警音乐播映:经过短信监听播送,经过获取短息内容来与原先设置好的口令吵醒比照,数据整理和一键锁屏经过设备管理器DevicePolicyManager完成,手机定位经过一个service监听方位改变。(3)从手机联系人处挑选号码:相当于去读写手机内置的数据库吧.
有些功用展现

2、通讯卫兵
功用描绘:(1)、添加黑名单(两种办法:经过输入框输入方面;以及经过调用手机联系人办法);(2)、查询黑名单;(3)、阻拦在黑名单中的短息以及电话。
技能完成:(1)添加黑名单:树立一个数据库表,对其进行封装,将黑名单号码保留在数据库中。(2)查询黑名单:因为没有找到适宜的数据库,因而黑名单数据库就用刚刚树立的一个黑名单数据库来替代,查询数据库。(3)短信和电话阻拦:(这个功用在设置基地进行设置,默以为敞开状况–即直接在splash页面直接敞开黑名单效劳),经过活动管理器ActivityManager获取后台正在运转的效劳,断定黑名单效劳是不是已经敞开。1、电话阻拦:经过电话管理器TeleponyManager监听手机电话状况,获取来电号码,查询数据库,假如黑名单数据库中存在该号码,经过反射办法获取体系阻拦电话办法阻拦电话,而且经过contentprovider办法去删去电话记载中的来电记载;2、短信阻拦:在效劳中动态的注册播送,经过SmsManager目标回去短信的号码,查询数据库,调用abortBroadcast来阻拦短信。
有些功用展现

3、软件管理
功用描绘:获取体系装置的所用使用,分类成手机使用和体系使用经过listview显现。经过点击每个条意图使用对该使用操作:运转、卸载、共享以及具体信息。
技能完成:(1)、获取手机安卓的使用:经过体系供给的包管理器获取使用信息,(2)、运转、卸载、共享、具体信息:经过StartAcitvity()跳转到相对应的activity操作。

4、进程管理
功用描绘:获取体系正在运转的使用的具体信息,显现在listview中。并供用户挑选单个条意图整理进程或全部整理。
技能完成:经过包管理器PackageManager以及使命管理器获取体系正在运转的所用进程的具体信息,经过自界说listview展现(侧滑整理单个进程,一键整理除自身外的所用进程),整理首要调用killbackgroupprocess办法。
有些功用展现

5、手机杀毒
功用描绘:扫描手机中的所用使用,若发现病毒跳转到病毒处理页面供用户挑选是不是明白。
技能完成:经过体系的包管理者PackageManager获取使用包名,对包名进行md5处理,与数据库中的md5病毒名md5比照(手机中的使用是以apk形式存在的)。若为病毒跳转到使用卸载界面供用户整理。
有些功用展现

6、电话归属地查询
功用描绘:(1)、电话归属地查询,(2)、往来不断电归属地显现
技能完成:(1)电话归属地查询:和数据库有关操作,小项目用的比照多封装啥的都差不多;(2)来电归属地显现:显现:自界说WindowManager显现自界说view,来电监听:界说一个来电监听service,监听电话状况获取电话的号码,调用数据库查询这个号码的归属地,并将它显现在view上;归属地个性:(很简单,几个布景);归属地方位设置(经过ontouchevent监听触点方位,获取移动点坐标,并重绘(onmeasure
onlayout
ondraw(就这三个进程)))不过需求留意点是,在activity中重绘和windowmanager中仍是有差异的,具体的比照代码这块有比照具体的注释见(AddressService以及DragViewActivity)。
有些功用展现

7、程序锁
功用描绘:对体系一切使用供用户挑选加锁并对被加锁程序暗码保护
技能完成:(1)已加锁与使用和胃加锁使用展现:经过两个fragmengt,用户点击加锁或未加锁fragment上的listviewde
item对使用包名添加和删去操作。(2)对加锁程序暗码保护:在效劳中完成一个看门狗程序,一向监督使用使命栈中的第一个使用,若第一个使用存在在被保护使用数据库中跳转到暗码输入界面。
现在存在疑问:现在这边跳转界面还未能完成,疑问暂时也许的定位是权限疑问需求进一步排查吧。
基本功用展现就到这,还有很多bug,这段时刻也是比照忙,bug发展比照慢。而在BaseActivity中做的作业很简单:监督手势滑动,代码也很简单直接看代码:
public abstract class BaseActivity extends
Activity{     private GestureDetector gestureDetector;     public
SharedPreferences mPrefs;     @Override     protected void onCreate(Bundle
savedInstanceState) {          super.onCreate(savedInstanceState);        
 mPrefs = getSharedPreferences("config",MODE_PRIVATE);          gestureDetector
= new GestureDetector(this,new GestureDetector.SimpleOnGestureListener(){      
   @Override          public boolean onFling(MotionEvent e1, MotionEvent e2,
float velocityX, float velocityY) {               if(e1.getRawX() - e2.getRawX()
> 200){                     showNextPage();                     return true;
              }else if(e2.getRawX() - e1.getRawX() > 200)               {    
                showPreviousPage();                     return true;            
  }               return super.onFling(e1, e2, velocityX, velocityY);          }
    });     }     protected abstract void showPreviousPage();     protected
abstract void showNextPage();     @Override     public boolean
onTouchEvent(MotionEvent event) {        
 gestureDetector.onTouchEvent(event);// 托付手势识别器处理接触事情          return
super.onTouchEvent(event);     }}
splash界面做初始化操作:当用户首次下载时,将外部数据库复制到用户手机sd卡目录下,判别版别更新,判别是不是创建桌面快捷办法,以及发动中止service等,仍是直接看代码吧:
public class SpashActivity extends
AppCompatActivity {     protected static final int CODE_UPDATE_DIALOG = 0;    
protected static final int CODE_URL_ERROR = 1;     protected static final int
CODE_NET_ERROR = 2;     protected static final int CODE_JSON_ERROR = 3;    
protected static final int CODE_ENTER_HOME = 4;// 进入主页面     private TextView
tvVersion;     private RelativeLayout rlRoot;     // 效劳器回来的信息     private String
mVersionName;// 版别名     private int mVersionCode;// 版别号     private String
mDesc;// 版别描绘     private String mDownloadUrl;// 下载地址     private Handler
mHandler = new Handler() {           public void
handleMessage(android.os.Message msg) {                switch (msg.what) {      
              case CODE_UPDATE_DIALOG:                        
 showUpdateDailog();                          break;                     case
CODE_URL_ERROR:                          Toast.makeText(SpashActivity.this,
"url过错", Toast.LENGTH_SHORT).show();                          enterHome();      
                   break;                     case CODE_NET_ERROR:              
           Toast.makeText(SpashActivity.this, "网络过错",
Toast.LENGTH_SHORT).show();                          enterHome();              
           break;                     case CODE_JSON_ERROR:                    
     Toast.makeText(SpashActivity.this, "数据解析过错",                        
 Toast.LENGTH_SHORT).show();                          enterHome();              
           break;                     case CODE_ENTER_HOME:                    
     enterHome();                          break;                     default:  
                       break;               }           };      };    
 @Override      protected void onCreate(Bundle savedInstanceState) {          
 super.onCreate(savedInstanceState);          
 setContentView(R.layout.activity_spash);            copyDB("address.db");//
复制归属地查询数据库            //复制财物目录下的病毒数据库文件            copyDB("antivirus.db");      
     startService(new Intent(this, CallSafeService.class));            //Intent
watchDogIntent = new Intent(this, WatchDogService.class);          
 //startService(watchDogIntent);            initView();            opEvents();  
         checkVersion();      }      private void opEvents() {          
 tvVersion.setText("版别名:" + getVersionName());            AlphaAnimation
alphaAnimation = new AlphaAnimation(0.3f,1f);          
 alphaAnimation.setDuration(2000);          
 rlRoot.startAnimation(alphaAnimation);      }      private String
getVersionName() {            PackageManager packageManager =
getPackageManager();            try {                  PackageInfo packageInfo =
packageManager.getPackageInfo(getPackageName(),0);                  String
 versionName = packageInfo.versionName;                  return versionName;    
       } catch (PackageManager.NameNotFoundException e) {                
 e.printStackTrace();            }            return "";       }       /**      
  * 获取本地app的版别号         *         * @return         */       private int
getVersionCode() {            PackageManager packageManager =
getPackageManager();            try {                  PackageInfo packageInfo =
packageManager.getPackageInfo(getPackageName(), 0);// 获取包的信息                
 int versionCode = packageInfo.versionCode;                  return versionCode;
           } catch (PackageManager.NameNotFoundException e) {                 //
没有找到包名的时候会走此反常                 e.printStackTrace();            }          
 return -1;      }      private void initView() {            tvVersion =
(TextView) findViewById(R.id.tv_version);            rlRoot = (RelativeLayout)
findViewById(R.id.rl_root);      }      private void checkVersion() {          
 final long startTime = System.currentTimeMillis();            // 发动子线程异步加载数据  
         new Thread() {                  @Override                  public void
run() {                        Message msg = Message.obtain();                  
     HttpURLConnection conn = null;                        try {                
            // 本机地址用localhost, 可是假如用模拟器加载本机的地址时,能够用ip(10.0.2.2)来替换              
              URL url = new URL("http://10.0.2.2:8080/update.json");            
                conn = (HttpURLConnection) url.openConnection();                
            conn.setRequestMethod("GET");// 设置恳求办法                            
conn.setConnectTimeout(5000);// 设置衔接超时                            
conn.setReadTimeout(5000);// 设置呼应超时, 衔接上了,但效劳器迟迟不给呼应                            
conn.connect();// 衔接效劳器                             int responseCode =
conn.getResponseCode();// 获取呼应码                             if (responseCode ==
200) {                                  InputStream inputStream =
conn.getInputStream();                                  String result =
StreamUtils.readFromStream(inputStream);                                  //
System.out.println("网络回来:" + result);                                  // 解析json
                                 JSONObject jo = new JSONObject(result);        
                         mVersionName = jo.getString("versionName");            
                     mVersionCode = jo.getInt("versionCode");                  
               mDesc = jo.getString("description");                            
     mDownloadUrl = jo.getString("downloadUrl");                                
 // System.out.println("版别描绘:" + mDesc);                                  if
(mVersionCode > getVersionCode()) {// 判别是不是有更新                              
        // 效劳器的VersionCode大于本地的VersionCode                                      
// 阐明有更新, 弹出晋级对话框                                       msg.what =
CODE_UPDATE_DIALOG;                                  } else {                  
                    // 没有版别更新                                       msg.what =
CODE_ENTER_HOME;                                  }                            }
                     } catch (MalformedURLException e) {                        
  // url过错的反常                           msg.what = CODE_URL_ERROR;              
            e.printStackTrace();                      } catch (IOException e) {
                          // 网络过错反常                           msg.what =
CODE_NET_ERROR;                           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) {                                // 强行休眠一段时刻,保证闪屏页展现2秒钟    
                           try {                                    
 Thread.sleep(2000 - timeUsed);                                } catch
(InterruptedException e) {                                    
 e.printStackTrace();                                }                          
}                           mHandler.sendMessage(msg);                          
if (conn != null) {                                 conn.disconnect();// 封闭网络衔接
                          }                      }                 }          
 }.start();       }       /**         * 晋级对话框         */       protected void
showUpdateDailog() {             AlertDialog.Builder builder = new
AlertDialog.Builder(this);             builder.setTitle("最新版别:" + mVersionName);
            builder.setMessage(mDesc);             //
builder.setCancelable(false);//不让用户撤销对话框, 用户体会太差,尽量不要用            
builder.setPositiveButton("当即更新", new DialogInterface.OnClickListener() {      
      @Override             public void onClick(DialogInterface dialog, int
which) {                  System.out.println("当即更新");                
 download();            }            });          
 builder.setNegativeButton("今后再说", new DialogInterface.OnClickListener() {      
            @Override                   public void onClick(DialogInterface
dialog, int which) {                         enterHome();                   }  
         });            // 设置撤销的监听, 用户点击回来键时会触发          
 builder.setOnCancelListener(new DialogInterface.OnCancelListener() {          
       @Override                  public void onCancel(DialogInterface dialog) {
                      enterHome();                  }            });          
 builder.show();      }      /**        * 下载apk文件        */      protected void
download() {            if (Environment.getExternalStorageState().equals(      
           Environment.MEDIA_MOUNTED)) {                
//tvProgress.setVisibility(View.VISIBLE);// 显现进展                 String target =
Environment.getExternalStorageDirectory() + "/update.apk";                 //
XUtils                 HttpUtils utils = new HttpUtils();                
utils.download(mDownloadUrl, target, new RequestCallBack() {              
  // 下载文件的进展                 @Override                 public void
onLoading(long total, long current, boolean isUploading) {                    
 super.onLoading(total, current, isUploading);                      //
System.out.println("下载进展:" + current + "/" + total);                      //
tvProgress.setText("下载进展:" + current * 100 / total + "%");                 }    
            // 下载成功                 @Override                 public void
onSuccess(ResponseInfoarg0) {                    
 System.out.println("下载成功");                      // 跳转到体系下载页面                  
   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) {                    
 Toast.makeText(SpashActivity.this, "下载失利!",                    
 Toast.LENGTH_SHORT).show();                }          });    } else {        
 Toast.makeText(SpashActivity.this, "没有找到sdcard!",        
 Toast.LENGTH_SHORT).show();    } } // 假如用户撤销装置的话,回调此办法 @Override protected void
onActivityResult(int requestCode, int resultCode, Intent data) {      
 enterHome();        super.onActivityResult(requestCode, resultCode, data); }/**
* 进入主页面 */ private void enterHome() {      Intent intent = new Intent(this,
HomeActivity.class);      startActivity(intent);      finish(); }/** * 复制数据库 * *
@param dbName */ private void copyDB(String dbName) {       File filesDir =
getFilesDir();       System.out.println("途径:" + filesDir.getAbsolutePath());    
  File destFile = new File(getFilesDir(), dbName);// 要复制的目标地址       if
(destFile.exists()) {             System.out.println("数据库" + dbName + "已存在!");  
          return;       }       FileOutputStream out = null;       InputStream
in = null;       try {             //in = getAssets().open(dbName);            
in = getClassLoader().getResourceAsStream("assets/" + dbName);             int
length = in.available();             //System.out.println("databasesize" +
length);             out = new FileOutputStream(destFile);             int len =
0;             byte[] buffer = new byte[1024];             while ((len =
in.read(buffer)) != -1) {                  out.write(buffer, 0, len);          
  }       } catch (IOException e) {             e.printStackTrace();       }
finally {             try {                  in.close();                
 out.close();             } catch (Exception e) {                
 e.printStackTrace();             }       }    } }






优质IT资源分享社区为你提供此文。
站有大量优质android教程视频,资料等资源,包含android基础教程,高级进阶教程等等,教程视频资源涵盖传智播客,极客学院,达内,北大青鸟,猎豹网校等等IT职业培训机构的培训教学视频,价值巨大。欢迎点击下方链接查看。

android教程视频
优质IT资源分享社区(www.itziyuan.top)
一个免费,自由,开放,共享,平等,互助的优质IT资源分享网站。
专注免费分享各大IT培训机构最新培训教学视频,为你的IT学习助力!

!!!回帖受限制请看点击这里!!!
!!!资源失效请在此版块发帖说明!!!

[PS:按 CTRL+D收藏本站网址~]

——“优质IT资源分享社区”管理员专用签名~

本版相似帖子

游客