//在控件上面按ctrl+1 可以抽取样式
1,设置向导界面的细节问题
1.1设置向导界面的跳转的时候要记得finsh(),把当前界面从任务栈中移除.
在设置向导界面的任何一个界面返回都应该返回home界面
1.2 Activity界面切换的动画
目标:本界面向左移出了屏幕,下一个界面从右边移出来(类似翻页效果)
ovreridePendingTransition(进入动画文件资源id,退出动画文件资源id);
//这个方法在startActivity,或finsh()后调用,可以更改动画变化的效果
下一步的动画
1.2.1 创建两个动画效果的资源文件,需要翻页效果(类似位移动画)
持续时间duration=300毫秒
进入的动画:fromXDelta(100%p)//从屏幕最右边的X坐标开始
toXDelta(0)//到坐标轴为0为止.
移出的动画:fronXDelta(0)>>>toXDelta(-100%p)
//手机屏幕的原点在屏幕的左上角
同理可以做出上一步的动画.
2,手势识别动作:因为点击按钮用户体验不太好,对触摸屏添加手机识别动作
2.1 重写父类方法onTouchEvent(Motionevent event) //当用户手指在屏幕上触摸的时候调用.
通过GestureDetector mgesturedetector;手势识别器
2.2
mgesturedetector=new mgesturedetector(this,new GestureDetector.simpOnGestureListener());
new GestureDetector.simpOnGestureListener()//简单的手势识别器,有很多手势识别效果
这里主要关心onFling(MotionEvent e1 MotionEvent e2,float velocityX,float velocityY)方法
e1,手指第一次触摸到屏幕事件,e2,手指离开屏幕一瞬间对应的事件
velocityX 水平方向的速度,velocityY垂直方向的速度 单位:像素/秒
// 这里主要关心水平方向的速度(因为是翻页操作)
If(Math.abs(velocityX)<200){ //绝对值
低于200的速度不考虑
Return true;//代表事件在这里终止了
}
//竖直方向移动距离太大也无效,因为要的是横向操作,而不是斜向操作
Math.abs(e2.getRawY()-e1.getRawY()>50)//竖直方向如果大于50就无效.
//向右X轴为正,向下Y轴为正
//当横向滑动距离大于200的时候就显示下一个界面,小于-200就切换上一个界面.
//记得也要return true;
或者e2-e1,e1-e2
2.3 在onTouchEvent()方法中
mGestureDetector.onTouchEvent(event); //让手势识别器识别传入的动作
3.重构代码的抽取模板
3.1 4个设置向导界面功能类似,所以可以抽取一个父类来让它们去继承.这个父类也要去继承activiy(形成家族关系树)
①抽取的命名方式XXXBaseActivity.class
②把滑屏移动的代码移植到这个父类中.
③跳转页面的class不同
在父类中定义两个抽象方法,子类去强制继承,子类继承的时候就直接在里面写页面跳转逻辑.最后父类在滑动翻页的事件中调用这两个方法即可.
3.2 继续抽取设置向导界面的逻辑
①把子类中跳转页面的代码抽取出来.
在子类中点击事件中直接调用这个方法即可(因为已经强制重写了页面跳转代码)
②抽取SharedPrenferences在父类中,在子类中就可以直接使用了.
③抽取intent开启上一个方法(参数只需要开启的界面class即可)和下一个方法.
3.3 手机防盗界面的重新进入设置向导点击事件
添加一个状态选择器(背景);
添加属性Clickable=”true” //可以被点击,这样状态就能生效
然后通过intent开启设置向导界面,这里需要 finsh() 一下.
4.绑定用户手机卡.
4.1.找到绑定,解绑的控件,设置点击事件.
①判断sim卡的绑定信息,默认设置为null即可,然后判断是否为null,
②根据是否为null,修改图片状态.
③如果需要绑定,就把sim卡串号存入sim卡中
记得加权限:READ_PHONE_STATE
sim卡信息属于手机电话状态的信息,通过TelephonyManager服务管理可以获取设备上电话管理的服务,不要直接new,通过getSystemService(TelephonyManager)获取/
拿到sim卡串号,telephonymanager,getSimSerialNumber();//获取sim卡串号
然后保存在sp中
④如果取消绑定,就把sim卡串号清空.
储存信息为null即可.
额外:①在cmd ,通过adb shell>>cd 包路径>>cd shared_prefs>>cat config.xml 查看文件内容.
②记得在跳转页面的时候,到这个页面初始化的时候获取一下状态,设置图片状态.
③绑定用户的sim卡是实现手机防盗的必须操作,在去下一个界面之前,判断一下sim卡是否被绑定,没绑定就提示绑定,绑定了之后才能去下一个界面.
5,选择联系人
设置安全号码,要设置一个安全号码,除了用户直接输入外,应该还可以通过联系人选择.
①通过内容提供者获取联系人列表.
把以前的联系人工具类拷贝来.(拷贝对应的业务bean,在utils包下创建一个domain包)
②记得加权限,READ_CONTACTS
③点击选择联系人的时候,就跳转到一个新的页面.配置好清单文件和layout文件.
StartActivityForResult(intent,请求码);//打开一个界面并获取结果
④新的页面用来显示所有用户(ListView)姓名和电话号码即可.
⑤设置条目点击事件,点击之后,就把联系人手机号放到意图对象里,设置结果数据setResult(结果码,意图对象),最后关闭当前界面
⑥在设置向导界面,获取到返回的数据onActivityResult()里获取意图对象中的数据
⑦把获取的字符串显示在输入框里,在点击下一页的时候的保存在sp中.如果这个页面被重新打开,也要把sp中的号码读取出来,显示在页面上.
⑧安全号码也是必须设置的,如果要进行下一步,就必须设置安全号码.
6,手机防盗的全部功能
①联系人太多,获取时间太长的情况.
所以需要把获取联系人放到子线程了,放到子线程之后,设置适配器是设置ui.在子线程中设置ui需要通过Handler发送到主线程.这里用另外一种方法
runOnUiThread(new runable(){更改ui的操作放到run方法里});//底层用的handler.post()
②在获取到联系人列表之前的提醒
在联系人列表的LIstView上包裹一个FrameLayout,放置一个LinearLayout,在ll中放一个文本,提示正在加载中.还可以放一个ProgressBar等待框.
在ll中定义visibility=”invisible”//显示可见
然后在开始获取联系人之前显示出来,获取完联系人就隐藏掉.
7.第四个设置向导界面
记录下防盗保护的id即可.//记得回显状态,默认未开启.
8,手机防盗界面,显示安全号码,防盗保护的状态.
9,手机防盗的核心原理:sim卡绑定,监测sim卡的变化.一旦变化就发送短信,播放音乐等.
9.1 监测sim卡变化,安卓更换sim卡要重启手机,代表需要一个开机启动的广播接收者.
①创建一个新的包ui.receiver,创建广播接收者,创建意图过滤器.
②意图过滤器:action:BOOT_COMPLETED
③配置权限:RECEIVE_BOOT_COMPLETED
④在广播接收者中,判断是否开启了手机防盗功能,从sp中获取信息
获取sim卡串号信息,与当前手机的sim卡串号信息比较
sim卡信息不一致,获取保存的安全号码.
发送短信:SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage(safenumber,null,”信息”,null,null(是否提示));
//这里发送的短信的手机号码是小偷的手机号码.
配置权限.
⑤模拟器的sim卡串号是永远一致的,
10,防盗指令的解析(就是手机防盗界面的那几个功能,通过安全号码发送短信.解析短信内容)
①定义一个手机短信广播接收者,配置清单文件
意图过滤器:action:android:name=””//在sdk 的开发版本选择最低就可以看到这个action.然后再换回来即可同时配置优先级priority=1000最高权限
配置接收短信的权限android.permission.RECEIVE_SMS
②接收短信
Object[] objs = (Object[])intent.getExtras().get(“pdus”);
SmsMessage msg= SmsMessage.createFormPdu((byte[])obj);
遍历数组,每一个元素都是SmsMessage, smsmessage.getMessageBody()//获取短信体
abordCast()//终止短信
然后对短信体跟定义的指令进行判断
Location:获取手机的位置
Alarm:播放报警音乐
Wipedata:立刻清楚数据
Lockscreen:锁屏
11,播放报警音乐的功能:
应用场景:获取到了手机位置的时候,到这个位置去听播放的声音.
Mediaplayer = mediaplayer.create(上下文,音频资源id)//会自动创建对象+prepare
调用start()开始播放,资源文件放到raw文件夹下.setLooping()//循环播放
//就算手机静音,多媒体也是可以播放出声音的,但是用户再次调节音量是可以关闭的