手机卫士03_手势动作_广播接收者应用

Posted 抓根宝

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了手机卫士03_手势动作_广播接收者应用相关的知识,希望对你有一定的参考价值。

//在控件上面按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()//循环播放

//就算手机静音,多媒体也是可以播放出声音的,但是用户再次调节音量是可以关闭的

以上是关于手机卫士03_手势动作_广播接收者应用的主要内容,如果未能解决你的问题,请参考以下文章

手机卫士09_应用程序四种查看_ListView小标题_进程管理

广播接收者案例_sd卡状态监听

广播接收者案例_ip拨号器

android 一段时间后手机应用接收不到广播了

应用程序终止后广播接收器不接收

android 广播接收不到可能是哪里出了问题