手机卫士05-自定义对话框

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 好,今天天我们在完成我们这个项目里面的一个自定义对话框的功能啦,它是在我们的第一个功能,手机防盗里面的,我们在给手机防盗那里加一个登陆的操作,这样会更安全一些,所以我们就用到了一个对话框,为了让它更好看一些,而且也学习一下怎样自定义对话框,所以我们就开始学习一下啦 首先,我们先给我们的手机防盗的启动界面,加一个快捷启动的方式,就是在拨打电话的时候,输入一个特定的号码,然后就会启动手机防盗

好,今天天我们在完成我们这个项目里面的一个自定义对话框的功能啦,它是在我们的第一个功能,手机防盗里面的,我们在给手机防盗那里加一个登陆的操作,这样会更安全一些,所以我们就用到了一个对话框,为了让它更好看一些,而且也学习一下怎样自定义对话框,所以我们就开始学习一下啦


首先,我们先给我们的手机防盗的启动界面,加一个快捷启动的方式,就是在拨打电话的时候,输入一个特定的号码,然后就会启动手机防盗那个界面,听起来,是不是很酷呢,其实很简单的,就是用一个广播接收都,来接收打电话时发出来的广播,然后捕获它,然后就可以进行我们想要的操作啦,好,直接上代码

先新建一个类com.xiaobin.security.receiver.CallPhoneReceiver

  1. <font color="#333333"><font face="Arial">package com.xiaobin.security.receiver;

  2. import android.content.BroadcastReceiver;
  3. import android.content.Context;
  4. import android.content.Intent;

  5. import com.xiaobin.security.ui.LostProtectedActivity;

  6. public class CallPhoneReceiver extends BroadcastReceiver
  7. {

  8.         @Override
  9.         public void onReceive(Context context, Intent intent)
  10.         {
  11.                 String outPhoneNumber = this.getResultData();
  12.                 if(outPhoneNumber.equals("1314"))        //当监听到用户拨打的是1314的时候,就进行下面的操作,你可以把拨打的号码做成参数的形式,让用户可配置
  13.                 {
  14.                         Intent i = new Intent(context, LostProtectedActivity.class);
  15.                         //这个很重要,如果没有这一句,那就会报错,这一句是因为我们是在一个Receiver里面启动一个activity的,但activity的启动,都是放到一个栈里面的,
  16.                         //但Receiver里面没有那个栈,所以我们要在这里启动一个activity,那就必须要指定这行代码啦
  17.                         i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);        
  18.                         context.startActivity(i);
  19.                         setResultData(null);        //这行代码是把广播的数据设置为null,这样就不会把刚刚那个号码拨打出去啦,只会启动我们的activity
  20.                 }
  21.         }

  22. }
  23. </font></font>
复制代码
现在还不行的,我们还要在AndroidMainfest文件里面注册这个广播接收者
  1. <font color="#333333"><font face="Arial"><receiver
  2.             android:name="com.xiaobin.security.receiver.CallPhoneReceiver">
  3.             <intent-filter android:priority="1000"><!-- 把优先级设置高一些,以便第一个拿到广播 -->
  4.                 <action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
  5.             </intent-filter>
  6.         </receiver></font></font>
复制代码
当然,我们还要加上相应的权限呢
  1. <font color="#333333"><font face="Arial"><uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/></font></font>
复制代码
好啦,到现在为止,我们通过拨打电话,来启动手机防盗这个功能就完成的啦,各位可以去试试 现在进入我们今天的重点,那就是自定义对话框啦,先上图,看看我们的效果 其实,我们想自定义自己的对话框,那么就有必要先去了解系统的对话框是怎样写的,在我们用到的android.jar这个包里面,就有系统自己写的对话框的啦我们可以通过apktool这个工具来得到系统自己定义的资源文件apktool下载地址为了能运行apktool,我们要下载两东西  apktool1.5.2.tar还有apktool-install-windows-r05-ibot.tar 下载完之后,直接它两个解压出来,然后把apktool1.5.2.tar里面的那个jar包,放到apktool-install-windows-r05-ibot.tar这个目录下面,如图这样子就会有3个文件的啦,现在我们把android.jar出拷贝到这个目录下面,然后在dos下面进行这个目录,然后就运行apktool d android.jar就这样,我们就会在刚刚那个目录下面看到有一个解析出来的资源文件夹的啦,而我们系统自己写的UI资源全在里面啦,我们有空的话,可以去看看,系统是怎样自己写的,然后自己就可以相应的进行修改啦好啦,说回我们今天的对话框,系统自己写的对话框,其实就是一个主题,要用的时候,就使用那个主题,那么,它就是在res/value/styles.xml里面的,我们把那个文件打开,然后搜索Theme.Dialog,然后就可以看到系统自己写的对话框啦 好啦,知道这些之后,我们有空就可以参考一下怎样写啦现在我们自己来写,我们在我们的项目里面的styles.xml文件里面写上我们自己的对话框的样式啦
  1.     <style name="MyDialog" parent="@android:style/Theme.Dialog"><!-- 要继承系统原来的对话框 -->
  2.         
  3.         <item name="android:windowBackground">@drawable/title_background</item><!-- 指定背景颜色 -->
  4.         <item name="android:windowNoTitle">true</item><!-- 隐藏系统原来的标题栏 -->
  5.         
  6.     </style>
复制代码
因为我是教大家怎样自定义对话框,所以为了简单,我只是写了这两个属性而已,有兴趣的,你们可以参考一下系统自己的,然后写多一点,写好我们的样式之后,怎样用呢其实很简单,只要在new一个dialog的时候,指定一下它的样式就行的啦
  1. dialog = new Dialog(this, R.style.MyDialog);
复制代码
好啦,我们现在就结合我们今天的逻辑来看一下,我们的对话框的效果,我们今天要做的是,当用户第一次启动这个手机防盗这个功能的时候,要求用户输入一个登录密码,然后以后进入这个功能的时候,都要输入以前设置的密码,而且我们的密码是以MD5加密后,存放到SharedPreferences里面的既然是加密,那么我们现在就先来写一个加密的工具类啦com.xiaobin.security.utils.MD5Encoder
  1. package com.xiaobin.security.utils;

  2. import java.security.MessageDigest;
  3. import java.security.NoSuchAlgorithmException;

  4. public class MD5Encoder
  5. {
  6.         public static String encode(String pwd)
  7.         {
  8.                 try
  9.                 {
  10.                         MessageDigest messageDigest = MessageDigest.getInstance("MD5");//拿到MD5加密的对象
  11.                         byte[] bytes = messageDigest.digest(pwd.getBytes());//返回一个加密后的字节数组
  12.                         StringBuffer sb = new StringBuffer();
  13.                         String tmp;
  14.                         for(int i = 0; i < bytes.length; i++)
  15.                         {
  16.                                 tmp = Integer.toHexString(0xff & bytes[i]);//把字节转换为16进制的字符串
  17.                                 if(tmp.length() == 1)        //如果这个字符串,只有一个字符,就要补0
  18.                                 {
  19.                                         sb.append("0" + tmp);
  20.                                 }
  21.                                 else
  22.                                 {
  23.                                         sb.append(tmp);
  24.                                 }
  25.                         }
  26.                         return sb.toString();
  27.                 }
  28.                 catch (NoSuchAlgorithmException e)
  29.                 {
  30.                         throw new RuntimeException("没有这个加密算法" + e);
  31.                 }
  32.         }

  33. }

复制代码
好啦,接下来,都是一些很简单的逻辑处理而已,我们直接上代码com.xiaobin.security.ui.LostProtectedActivity
  1. package com.xiaobin.security.ui;

  2. import android.app.Activity;
  3. import android.app.Dialog;
  4. import android.content.Context;
  5. import android.content.SharedPreferences;
  6. import android.content.SharedPreferences.Editor;
  7. import android.os.Bundle;
  8. import android.view.View;
  9. import android.view.View.OnClickListener;
  10. import android.widget.Button;
  11. import android.widget.EditText;
  12. import android.widget.Toast;

  13. import com.xiaobin.security.R;
  14. import com.xiaobin.security.utils.MD5Encoder;

  15. public class LostProtectedActivity extends Activity implements OnClickListener
  16. {
  17.         private SharedPreferences sp;
  18.         private Dialog dialog;
  19.         private EditText password;
  20.         private EditText confirmPassword;
  21.         
  22.         @Override
  23.         protected void onCreate(Bundle savedInstanceState)
  24.         {
  25.                 super.onCreate(savedInstanceState);
  26.                
  27.                 sp = getSharedPreferences("cofig", Context.MODE_PRIVATE);
  28.                
  29.                 if(isSetPassword())
  30.                 {
  31.                         showLoginDialog();
  32.                 }
  33.                 else
  34.                 {
  35.                         showFirstDialog();
  36.                 }
  37.         }
  38.         
  39.         private void showLoginDialog()
  40.         {
  41.                 dialog = new Dialog(this, R.style.MyDialog);
  42.                 View view = View.inflate(this, R.layout.login_dialog, null);
  43.                 password = (EditText) view.findViewById(R.id.et_protected_password);
  44.                 Button yes = (Button) view.findViewById(R.id.bt_protected_login_yes);
  45.                 Button cancel = (Button) view.findViewById(R.id.bt_protected_login_no);
  46.                 yes.setOnClickListener(this);
  47.                 cancel.setOnClickListener(this);
  48.                 dialog.setContentView(view);
  49.                 dialog.show();
  50.         }

  51.         private void showFirstDialog()
  52.         {
  53.                 dialog = new Dialog(this, R.style.MyDialog);
  54.                 //dialog.setContentView(R.layout.first_dialog);
  55.                 View view = View.inflate(this, R.layout.first_dialog, null);        //这样来填充一个而已文件,比较方便
  56.                 password = (EditText) view.findViewById(R.id.et_protected_first_password);
  57.                 confirmPassword = (EditText) view.findViewById(R.id.et_protected_confirm_password);
  58.                 Button yes = (Button) view.findViewById(R.id.bt_protected_first_yes);
  59.                 Button cancel = (Button) view.findViewById(R.id.bt_protected_first_no);
  60.                 yes.setOnClickListener(this);
  61.                 cancel.setOnClickListener(this);
  62.                 dialog.setContentView(view);
  63.                 dialog.show();
  64.         }

  65.         private boolean isSetPassword()
  66.         {
  67.                 String pwd = sp.getString("password", "");
  68.                 if(pwd.equals("") || pwd == null)
  69.                 {
  70.                         return false;
  71.                 }
  72.                 return true;
  73.         }

  74.         @Override
  75.         public void onClick(View v)
  76.         {
  77.                 switch(v.getId())
  78.                 {
  79.                         case R.id.bt_protected_first_yes :
  80.                                 String fp = password.getText().toString().trim();
  81.                                 String cp = confirmPassword.getText().toString().trim();
  82.                                 if(fp.equals("") || cp.equals(""))
  83.                                 {
  84.                                         Toast.makeText(this, "密码不能为空", Toast.LENGTH_SHORT).show();
  85.                                         return;
  86.                                 }
  87.                                 else
  88.                                 {
  89.                                         if(fp.equals(cp))
  90.                                         {
  91.                                                 Editor editor = sp.edit();
  92.                                                 editor.putString("password", MD5Encoder.encode(fp));
  93.                                                 editor.commit();
  94.                                         }
  95.                                         else
  96.                                         {
  97.                                                 Toast.makeText(this, "两次密码不相同", Toast.LENGTH_SHORT).show();
  98.                                                 return;
  99.                                         }
  100.                                 }
  101.                                 dialog.dismiss();
  102.                                 break;
  103.                                 
  104.                         case R.id.bt_protected_first_no :
  105.                                 dialog.dismiss();
  106.                                 finish();
  107.                                 break;
  108.                                 
  109.                         case R.id.bt_protected_login_yes :
  110.                                 String pwd = password.getText().toString().toString();
  111.                                 if(pwd.equals(""))
  112.                                 {
  113.                                         Toast.makeText(this, "请输入密码", Toast.LENGTH_SHORT).show();
  114.                                 }
  115.                                 else
  116.                                 {
  117.                                         String str = sp.getString("password", "");
  118.                                         if(MD5Encoder.encode(pwd).equals(str))
  119.                                         {
  120.                                                 dialog.dismiss();
  121.                                         }
  122.                                         else
  123.                                         {
  124.                                                 Toast.makeText(this, "密码错误", Toast.LENGTH_SHORT).show();
  125.                                         }
  126.                                 }
  127.                                 break;
  128.                                 
  129.                         case R.id.bt_protected_login_no :
  130.                                 dialog.dismiss();
  131.                                 finish();
  132.                                 break;
  133.                                 
  134.                         default :
  135.                                 break;
  136.                 }
  137.         }

  138. }

复制代码
另外,还有两个布局文件,一个是第一次登录时,设置密码的,一个是以后登录时,输入密码的first_dialog
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:layout_width="300dip"
  4.     android:layout_height="280dip"
  5.     android:gravity="center_horizontal"
  6.     android:orientation="vertical" >
  7.    
  8.     <TextView
  9.         android:layout_width="wrap_content"
  10.         android:layout_height="wrap_content"
  11.         android:textColor="@android:color/white"
  12.         android:textSize="24sp"
  13.         android:text="@string/setPassword"/>
  14.    
  15.     <LinearLayout
  16.         android:layout_width="300dip"
  17.         android:layout_height="180dip"
  18.         android:background="#ffc8c8c8"
  19.         android:orientation="vertical">
  20.         
  21.         <TextView
  22.             android:layout_width="wrap_content"
  23.             android:layout_height="wrap_content"
  24.             android:text="@string/setPasswordDescription"/>
  25.         
  26.         <EditText
  27.             android:id="@+id/et_protected_first_password"
  28.             android:layout_width="match_parent"
  29.             android:layout_height="wrap_content"
  30.             android:inputType="textPassword"/>
  31.         
  32.         <TextView
  33.             android:layout_width="wrap_content"
  34.             android:layout_height="wrap_content"
  35.             android:text="@string/againPassword"/>
  36.         
  37.         <EditText
  38.             android:id="@+id/et_protected_confirm_password"
  39.             android:layout_width="match_parent"
  40.             android:layout_height="wrap_content"
  41.             android:inputType="textPassword"/>
  42.         
  43.         <LinearLayout
  44.             android:layout_width="300dip"
  45.             android:layout_height="50dip"
  46.             android:gravity="center"
  47.             android:orientation="horizontal">
  48.             
  49.             <Button
  50.                 android:id="@+id/bt_protected_first_yes"
  51.                 android:layout_width="140dip"
  52.                 android:layout_height="40dip"
  53.                 android:text="@string/protectedYes"/>
  54.             
  55.             <Button
  56.                 android:id="@+id/bt_protected_first_no"
  57.                 android:layout_width="140dip"
  58.                 android:layout_height="40dip"
  59.                 android:layout_marginLeft="10dip"
  60.                 android:text="@string/protectedNo"/>
  61.             
  62.         </LinearLayout>
  63.         
  64.     </LinearLayout>

  65. </LinearLayout>

复制代码
login_dialog.xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:layout_width="300dip"
  4.     android:layout_height="180dip"
  5.     android:gravity="center_horizontal"
  6.     android:orientation="vertical" >
  7.    
  8.     <TextView
  9.         android:layout_width="wrap_content"
  10.         android:layout_height="wrap_content"
  11.         android:textColor="@android:color/white"
  12.         android:textSize="24sp"
  13.         android:text="@string/login"/>
  14.    
  15.     <LinearLayout
  16.         android:layout_width="300dip"
  17.         android:layout_height="120dip"
  18.         android:background="#ffc8c8c8"
  19.         android:orientation="vertical">
  20.         
  21.         <TextView
  22.             android:layout_width="wrap_content"
  23.             android:layout_height="wrap_content"
  24.             android:text="@string/inputPassword"/>
  25.         
  26.         <EditText
  27.             android:id="@+id/et_protected_password"
  28.             android:layout_width="match_parent"
  29.             android:layout_height="wrap_content"
  30.             android:inputType="textPassword"/>
  31.         
  32.         <LinearLayout
  33.             android:layout_width="300dip"
  34.             android:layout_height="50dip"
  35.             android:gravity="center"
  36.             android:orientation="horizontal">
  37.             
  38.             <Button
  39.                 android:id="@+id/bt_protected_login_yes"
  40.                 android:layout_width="140dip"
  41.                 android:layout_height="40dip"
  42.                 android:text="@string/protectedYes"/>
  43.             
  44.             <Button
  45.                 android:id="@+id/bt_protected_login_no"
  46.                 android:layout_width="140dip"
  47.                 android:layout_height="40dip"
  48.                 android:layout_marginLeft="10dip"
  49.                 android:text="@string/protectedNo"/>
  50.             
  51.         </LinearLayout>
  52.         
  53.     </LinearLayout>

  54. </LinearLayout>

复制代码
好啦,今天的代码就到这里啦,代码有点多,有什么不明白的,欢迎留言,有什么要指导的,也欢迎留言!!!
Security_05自定义对话框与拨打电话来启动activity.rar(421.51 KB, 下载次数: 173)
目录
相关文章
|
Android开发
《手机卫士性能优化方案-Android篇》电子版地址
手机卫士性能优化方案-Android篇
99 0
《手机卫士性能优化方案-Android篇》电子版地址
|
安全
金山手机卫士正式版发布 永久免费
近日,金山安全软件有限公司首次公开发布金山手机卫士正式版,并宣布下载,安装,升级金山手机卫士完全免费,手机卫士是金山安全软件公司今年成立后回馈用户的又一力作。目前支持主流的智能手机操作系统——塞班S60和Android。
1028 0
|
XML API Android开发
Android--手机卫士涉及的知识点总结(一)
Splash界面 splash: 溅,洒 展现产品的logo提升产品的知名度 初始化操作(创建数据库,读取配置文件) 连接服务器检查软件授权 连接服务器检查软件的更新 自动更新的前提 包名...
1146 0
|
算法 数据库 Android开发
Android--手机卫士涉及的知识点总结(二)
短信拦截:开启服务并在里面注册一个广播接收者 ? 1 2 3 开启服务: Intent intent=new Intent(SettingActivity.
917 0
|
数据库 Android开发 数据安全/隐私保护
Android--手机卫士涉及的知识点总结(五)
主活动中点击切换 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...
895 0
|
缓存 安全 数据库
Android--手机卫士涉及的知识点总结(六)
内容观察者 数据库中大声发个消息 ? 1 2 Uri uri=Uri.
1458 0
|
XML 数据安全/隐私保护 Android开发
手机卫士07-设置向导
今天,我们要做的就是给我们的手机防盗这个功能添加一个设置向导的功能啦,指导用户进行一些设置,废话不多说,直接上图,看看我们要做的效果      UI不是很好看,各位可以自己修改一下哈 好啦,我们今天主要是把这两个界面写出来,还有把一些逻辑代码写一下 其实这主要就是两个xml文件啦 setup_guide1.xml &
985 0
|
数据安全/隐私保护 Android开发 安全
手机卫士09-防盗逻辑实现
好啦,我们之前已经把设置向导的界面已经全部完成的了,而且界面也已经完成了三个的啦,今天我们把最后的一个界面完成它,还有把防盗的逻辑也完成一下 废话不多说,直接上代码 com.xiaobin.security.ui.SetupGuide4Activity package com.xiaobin.security.ui; import
1090 0
|
定位技术 Android开发 安全
手机卫士10-手机被盗后定位实现
好啦,废话不多说,我们进入主题,今天我们要继续上一次讲的,就是手机被盗之后,获得手机所在的位置。 上一次,我们说到了,如果我们的sim卡被人换掉了,那么就会发送一条短信到我们的原来设定的安全号码那里的,而今天,我们就要获取到手机的位置啦,以便追踪回手机。 我们是这样设计的,我们通过发送一条短信,短信的内容就是一些要执行的操作的指令(比如说#*location*#),我
1320 0
下一篇
无影云桌面