转载请注明出处:https://blog.csdn.net/mythmayor/article/details/72878059

1.Activity的任务栈

1.类似一个木桶,每层只能放一个木块,我们放入木块和取出木块的时候只能从最上面开始操作

2.用xml文件描述动画

在res文件夹下创建anim文件夹,anim文件夹下创建动画的xml文件

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"android:duration="300"      //持续时间android:fromXDelta="100%p"  //起始点x坐标android:fromYDelta="0"      //起始点y坐标android:toXDelta="0"        //结束点x坐标android:toYDelta="0" >      //结束点y坐标
</translate>

3.播放报警音乐

1.将音频文件放在res/raw目录下
2.具体实现,即使手机处于静音模式,也会播放音乐
MediaPlayer player = MediaPlayer.create(context, R.raw.ylzs);

4.Activity进入和退出的动画

1.在finish()或者startActivity()方法后调用overridePendingTransition,设置进入和退出的动画

overridePendingTransition(R.anim.anim_in, R.anim.anim_out);

5.识别手势动作

1.定义手势识别器
private GestureDetector mGestureDetector;2.初始化手势识别器,处理手势,执行对应的逻辑
mGestureDetector = new GestureDetector(this,new GestureDetector.SimpleOnGestureListener() {// 当用户手指在屏幕上滑动的时候调用的方法// e1 手指第一次触摸到屏幕的事件// e2 手指离开屏幕一瞬间对应的事件// velocityX 水平方向的速度// velocityY 垂直方向的速度 单位像素/s@Overridepublic boolean onFling(MotionEvent e1, MotionEvent e2,float velocityX, float velocityY) {if (Math.abs(velocityX) < 200) {Log.i(TAG, "移动的太慢,无效动作");return true;}if (Math.abs(e2.getRawY() - e1.getRawY()) > 50) {Log.i(TAG, "垂直方向移动过大,无效动作");return true;}if ((e1.getRawX() - e2.getRawX()) > 200) {Log.i(TAG, "向左滑动,显示下一个界面");next();return true;}if ((e2.getRawX() - e1.getRawX()) > 200) {Log.i(TAG, "向右滑动,显示上一个界面");pre();return true;}return super.onFling(e1, e2, velocityX, velocityY);}});3.重写onTouchEvent方法,让手势识别器处理手势操作
@Override
public boolean onTouchEvent(MotionEvent event) {// 让手势识别器识别传入进来的事件mGestureDetector.onTouchEvent(event);return super.onTouchEvent(event);
}

6.GestureDetector.SimpleOnGestureListener其他方法补充

1.手指按下时触发
public boolean onDown(MotionEvent e) {// TODO Auto-generated method stubreturn false;
}2.手指抬起时触发,单击事件
public boolean onSingleTapUp(MotionEvent e) {// TODO Auto-generated method stubreturn false;
}3.双击事件
@Override
public boolean onDoubleTapEvent(MotionEvent e) {// TODO Auto-generated method stubreturn super.onDoubleTapEvent(e);
}4.长按事件
public void onLongPress(MotionEvent e) {// TODO Auto-generated method stub}5.手指在屏幕上拖动事件,手指一直没有离开屏幕
public boolean onScroll(MotionEvent e1, MotionEvent e2,float distanceX, float distanceY) {// TODO Auto-generated method stubreturn false;
}6.滑动事件,当手指拖动之后抬起触发。手指在屏幕上滑动都会有一个速度,当手指离开的时候如果我们希望控件有惯性的继续滑动可以在此处实现
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) {// TODO Auto-generated method stubreturn false;
}

7.将公共部分抽取为一个基类

1.新建一个XXXBaseActivity的基类,如果继承他的子类在公共的部分有不同的操作,则将该类声明为抽象类,否则则不需要
public abstract class SetupBaseActivity extends Activity {2.抽取出公共部分的代码,并进行对应的修改
protected static final String TAG = "SetupBaseActivity";
// 1.定义一个手势识别器
private GestureDetector mGestureDetector;
protected SharedPreferences sp;@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);sp = getSharedPreferences("config", MODE_PRIVATE);// 2.初始化手势识别器mGestureDetector = new GestureDetector(this,new GestureDetector.SimpleOnGestureListener() {// 当用户手指在屏幕上滑动的时候调用的方法// e1 手指第一次触摸到屏幕的事件// e2 手指离开屏幕一瞬间对应的事件// velocityX 水平方向的速度// velocityY 垂直方向的速度 单位像素/s@Overridepublic boolean onFling(MotionEvent e1, MotionEvent e2,float velocityX, float velocityY) {if (Math.abs(velocityX) < 200) {Log.i(TAG, "移动的太慢,无效动作");return true;}if (Math.abs(e2.getRawY() - e1.getRawY()) > 50) {Log.i(TAG, "垂直方向移动过大,无效动作");return true;}if ((e1.getRawX() - e2.getRawX()) > 200) {Log.i(TAG, "向左滑动,显示下一个界面");next();return true;}if ((e2.getRawX() - e1.getRawX()) > 200) {Log.i(TAG, "向右滑动,显示上一个界面");pre();return true;}return super.onFling(e1, e2, velocityX, velocityY);}});
}
/*** 当用户手指在屏幕上触摸的时候调用的方法*/
@Override
public boolean onTouchEvent(MotionEvent event) {// 让手势识别器识别传入进来的事件mGestureDetector.onTouchEvent(event);return super.onTouchEvent(event);
}3.如果子类在公共的代码部分有不同的操作,将类声明为抽象类,声明对应的抽象方法,在不同的操作处调用抽象方法
/*** 显示下一个*/
public abstract void next();
/*** 显示上一个*/
public abstract void pre();4.让子类实现所有的抽象方法
public class Setup1Activity extends SetupBaseActivity {protected static final String TAG = "Setup1Activity";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_setup1);}@Overridepublic void next() {openNewActivityAndFinish(Setup2Activity.class);// 修改Activity切换的动画效果overridePendingTransition(R.anim.anim_in, R.anim.anim_out);}@Overridepublic void pre() {}
}

8.获取手机sim卡串号

1.清单文件中添加权限
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
2.拿到TelephonyManager
private TelephonyManager tm;
tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
3.调用方法getSimSerialNumber
tm.getSimSerialNumber();

9.使用控制台查看数据

1.adb shell 命令进入到控制台
2.cd 命令进入到文件夹
3.ls 命令列出该文件夹下所有文件
4.cat config.xml 命令查看config.xml文件内容

10.联系人数据库

1.加权限
<uses-permission android:name="android.permission.READ_CONTACTS" />
2.data/data/com.android.provider.contacts/databases/contacts2.db
3.raw_contacts表contact_id列存联系人id
4.data表存联系人数据
5.mimetypes存数据类型

11.获取联系人数据

public static List<ContactInfo> getAllContactInfos(Context context) {List<ContactInfo> infos = new ArrayList<ContactInfo>();ContentResolver resolver = context.getContentResolver();// 查询raw_contact表Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");Uri datauri = Uri.parse("content://com.android.contacts/data");Cursor cursor = resolver.query(uri, new String[] { "contact_id" },null, null, null);while (cursor.moveToNext()) {String id = cursor.getString(0);System.out.println("Id:" + id);if (id != null) {ContactInfo info = new ContactInfo();// 查询data表Cursor datacursor = resolver.query(datauri, new String[] {"data1", "mimetype" }, "raw_contact_id=?",new String[] { id }, null);while (datacursor.moveToNext()) {String data1 = datacursor.getString(0);String mimetype = datacursor.getString(1);if ("vnd.android.cursor.item/name".equals(mimetype)) {info.setName(data1);} else if ("vnd.android.cursor.item/im".equals(mimetype)) {info.setQq(data1);} else if ("vnd.android.cursor.item/email_v2".equals(mimetype)) {info.setEmail(data1);} else if ("vnd.android.cursor.item/phone_v2".equals(mimetype)) {info.setPhone(data1);}}datacursor.close();infos.add(info);}}cursor.close();SystemClock.sleep(3000);return infos;
}联系人数据的另一种查询方式:[Contacts 联系人详解](http://blog.csdn.net/wssiqi/article/details/8152630)

12.在另一个Activity中获取数据

1.在当前Activity中调用startActivityForResult
Intent intent = new Intent(this,SelectContactActivity.class);
startActivityForResult(intent, 0);
2.在另一个Activity中设置数据,调用setResult,设置对应的结果码和数据
String phone = infos.get(position).getPhone();
Intent data = new Intent();
data.putExtra("phone", phone);
//设置结果数据
setResult(0, data);
//关闭当前界面
finish();
3.在当前Activity中的onActivityResult中接收回传过来的数据
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {if(data!=null){String phone = data.getStringExtra("phone");et_setup3_phone.setText(phone);}super.onActivityResult(requestCode, resultCode, data);
}

13.获取大量数据时的优化方法

1.将获取数据的操作放在子线程里
2.界面上显示进度条
3.获取数据后更新界面
4.隐藏进度条

14.子线程中想更新界面一个方便的方法

1.调用runOnUiThread方法
runOnUiThread(new Runnable() {@Overridepublic void run() {ll_loading.setVisibility(View.INVISIBLE);lv_select_contact.setAdapter(new ContactAdapter());}});

15.接收手机开机广播

1.添加权限
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
2.创建开机广播接收者
public class BootCompleteReceiver extends BroadcastReceiver {private static final String TAG = "BootCompleteReceiver";@Overridepublic void onReceive(Context context, Intent intent) {Log.i(TAG,"手机启动完毕了.");//判断用户是否开启了手机防盗的功能.SharedPreferences sp = context.getSharedPreferences("config", Context.MODE_PRIVATE);boolean protecting = sp.getBoolean("protecting", false);if(protecting){Log.i(TAG,"防盗保护已经开启,检测sim卡是否一致.");//用户绑定的sim串号String savedSim = sp.getString("sim", "");//获取当前手机里面的sim串号TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);String currentSim = tm.getSimSerialNumber()+"afa";if(savedSim.equals(currentSim)){Log.i(TAG,"sim卡一致,还是您的手机");}else{Log.i(TAG,"sim卡不一致,手机可能被盗,发送报警短信");String safenumber = sp.getString("safenumber", "");SmsManager smsManager = SmsManager.getDefault();smsManager.sendTextMessage(safenumber, null, "SOS...phone may lost", null, null);}}}
}
3.在清单文件里配置广播接收者
<receiver android:name="com.mythmayor.project.ui.receiver.BootCompleteReceiver" ><intent-filter><action android:name="android.intent.action.BOOT_COMPLETED" /></intent-filter>
</receiver>

16.发送短信

1.添加权限
<uses-permission android:name="android.permission.SEND_SMS" />
2.获得SmsManager
SmsManager smsManager = SmsManager.getDefault();
3.调用sendTextMessage方法
smsManager.sendTextMessage(safenumber, null, "SOS...phone may lost", null, null);

17.解析短信

1.定义接收短信广播接收者
public class SmsReceiver extends BroadcastReceiver {private static final String TAG = "SmsReceiver";}
2.在清单文件中配置。将优先级配置为最高1000,接收到就终止广播,不在系统中提示接收到短信
<receiver android:name="com.mythmayor.project.ui.receiver.SmsReceiver" ><intent-filter android:priority="1000" ><action android:name="android.provider.Telephony.SMS_RECEIVED" /></intent-filter>
</receiver>
3.添加接收短信的权限
<uses-permission android:name="android.permission.RECEIVE_SMS" />
4.在onReceive方法中解析短信
@Override
public void onReceive(Context context, Intent intent) {Object[] objs = (Object[]) intent.getExtras().get("pdus");for(Object obj:objs){SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) obj);String body = smsMessage.getMessageBody();if("#*location*#".equals(body)){Log.i(TAG,"返回手机的位置..");abortBroadcast();}else if ("#*alarm*#".equals(body)){Log.i(TAG,"播放报警音乐..");abortBroadcast();}else if ("#*wipedata*#".equals(body)){Log.i(TAG,"立刻清除数据..");abortBroadcast();}else if ("#*lockscreen*#".equals(body)){Log.i(TAG,"立刻锁屏..");abortBroadcast();}}
}

Android - xml动画,识别手势动作,代码抽取,获取手机SIM卡串号,获取联系人数据,开机广播,发送/解析短信,报警音乐相关推荐

  1. Android开发之获取手机SIM卡信息

    TelephonyManager是一个管理手机通话状态.电话网络信息的服务类,该类提供了大量的getXxx(),方法获取电话网络的相关信息. TelephonyManager类概述: 可用于访问有关设 ...

  2. android获取手机sim卡信息,Android获取手机SIM卡运营商信息的方法

    本文实例讲述了Android获取手机SIM卡运营商信息的方法,对于Android程序设计有非常实用的价值.分享给大家供大家参考之用.具体方法如下: 主要功能代码如下: /** * 获取SIM卡运营商 ...

  3. android获取到电信的手机号码,Android基站信息获取以及Sim卡相关信息获取

    概述: 本篇主要介绍Android获取基站信息的方式,除此之外,还有SIM卡相关字段获取,先介绍一些缩写的概念,后续更新代码的写法. 前言:之前有碰到一个需求,需要获取SIM卡的相关属性:IMSI号. ...

  4. 双卡android手机SIM卡信息探索 ,获取手机 SIM卡数量和SIM卡id、iccid

    废话不多,直接上干货==> 1 以下所有方法都需要在AndroidManifest.xml声明权限 <uses-permission android:name="android. ...

  5. android 获取sim卡,Android 获取手机SIM卡运营商

    直接上代码: /** * 获取SIM卡运营商 * * @param context * @return */ public static String getOperators(Context con ...

  6. 83.android 简单的获取手机SIM卡卡槽数量,当前SIM卡数量。

    //第一步 先加入权限,在AndroidManifest.xml里加入: <uses-permission android:name="android.permission.READ_ ...

  7. 关于android双卡手机sim卡信息采集适配的心得

    关于android双卡手机sim卡信息采集适配的心得 这几天通过对各个厂商的双卡信息适配的研究,总结了几点规律,写这篇心得主要是为了能够抛砖引玉,和大家一起分享,一起讨论,源码已上传. 一.andro ...

  8. android 短信数据库 双卡,关于android双卡手机sim卡信息采集适配的心得

    这几天通过对各个厂商的双卡信息适配的研究,总结了几点规律,写这篇心得主要是为了能够抛砖引玉,和大家一起分享,一起讨论,源码已上传. 一.android5.0以上(包含5.0)的版本双卡信息适配: 1. ...

  9. android中判断sim卡状态和读取联系人资料的方法

    在写程序中,有时候可能需要获取sim卡中的一些联系人资料.在获取sim卡联系人前,我们一般会先判断sim卡状态,找到sim卡后再获取它的资料,如下代码我们可以读取sim卡中的联系人的一些信息. 读取的 ...

最新文章

  1. 买得嗨更要聊得嗨 阿里通免费电话惠战双11
  2. Qt Creator使用Bazaar集市
  3. SQL server CASE WHEN
  4. Palindromic Numbers LightOJ - 1205 数位dp 求回文数
  5. [css] 解释下为什么css的reset不建议直接这么写:*{ margin:0; padding:0;}?
  6. 十二之续、快速排序算法的深入分析
  7. 去Oracle不仅是BAT的事,AWS彻底去O
  8. FormView控件
  9. sprintf()--字串格式化命令
  10. CentOS7虚拟机优化
  11. python数据类型总结
  12. 中国水泥基防水行业市场供需与战略研究报告
  13. Collider Collision 区别
  14. Atitit callback回调机制大总结 目录 1. 回调机制=Call back, 1 1.1. 1.为什么需要Call back 2 1.2. 模块之间的调用,调用的方式分为几种:1)同步调
  15. Matlab实现圆孔夫琅和费衍射
  16. python 正数变成负数_LeetCode 007:整数反转 (Python)
  17. CPU频率,到底是什么?
  18. 如何从AD中彻底删除Skype For Business(下篇)
  19. Unity3D游戏开发之RPG游戏剧情呈现策略
  20. 卸载MySQL残余及修改密码

热门文章

  1. ERROR 1366 (HY000): Incorrect string value: ‘\xE8\xB5\xB5 \xE9\x9B...‘ for column ‘s_name‘ at row 1
  2. 【D3.js数据可视化系列教程】(三十六)-- 冰柱图
  3. 关于DE405星历表的调用
  4. C++【C++11】
  5. 人工智能作用现代认知战探析
  6. 七、入门python第七课
  7. 处理文件上传后返回json数据在IE出现文件下载问题(框架是spring boot)
  8. 华中科技大学和华为云瑶光造就中国团队全球首冠
  9. 第十一次作业 - Alpha 事后诸葛亮(团队)
  10. 铁矿石大幅反弹,棉花认购大涨2倍,YP09继续探底2022.4.28