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

转载请注明出处: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
                @Override
                public 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 stub
    return false;
}

2.手指抬起时触发,单击事件
public boolean onSingleTapUp(MotionEvent e) {
    // TODO Auto-generated method stub
    return false;
}

3.双击事件
@Override
public boolean onDoubleTapEvent(MotionEvent e) {
    // TODO Auto-generated method stub
    return 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 stub
    return false;
}

6.滑动事件,当手指拖动之后抬起触发。手指在屏幕上滑动都会有一个速度,当手指离开的时候如果我们希望控件有惯性的继续滑动可以在此处实现
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
        float velocityY) {
    // TODO Auto-generated method stub
    return 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
                @Override
                public 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";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_setup1);
    }

    @Override
    public void next() {
        openNewActivityAndFinish(Setup2Activity.class);
        // 修改Activity切换的动画效果
        overridePendingTransition(R.anim.anim_in, R.anim.anim_out);
    }

    @Override
    public 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() {
            @Override
            public 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";
    @Override
    public 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();
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值