Android
来源:互联网 发布:cydia 数据库错误 编辑:程序博客网 时间:2024/05/21 11:14
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方法,让手势识别器处理手势操作@Overridepublic 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.双击事件@Overridepublic 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;@Overrideprotected 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); } });}/** * 当用户手指在屏幕上触摸的时候调用的方法 */@Overridepublic 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.拿到TelephonyManagerprivate TelephonyManager tm;tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);3.调用方法getSimSerialNumbertm.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.db3.raw_contacts表contact_id列存联系人id4.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中调用startActivityForResultIntent 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中接收回传过来的数据@Overrideprotected 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.获得SmsManagerSmsManager 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方法中解析短信@Overridepublic 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
- Android
- android
- Android
- android
- android
- Android
- Android
- android
- android
- android
- Android
- Android
- android!!!
- android
- android
- android
- android
- android:
- 【STM32F103攻城笔记】外部晶振HSE倍频设置系统时钟
- C++综合系列之构造函数执行于main函数之前
- 程序员最核心的竞争力是什么?
- iTunes Connect 开发者指南 (iTunes Connect Developer Guide)
- 双极性的信号,能不能直接输入到单电源供电的ADC?
- Android
- wpf中界面获取鼠标或键盘操作
- photoswipe.js插件
- Maven 详解
- github.com/lxn/walk 写打开文件
- Mock.js
- C++ Primer Plus(第六版)—— 第六章 分支语句和逻辑运算符 笔记和答案
- Android解决被软键盘遮挡的EditText问题
- Numpy 字符串处理