Android - xml动画,识别手势动作,代码抽取,获取手机SIM卡串号,获取联系人数据,开机广播,发送/解析短信,报警音乐
生活随笔
收集整理的這篇文章主要介紹了
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@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卡串号,获取联系人数据,开机广播,发送/解析短信,报警音乐的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Easypack: JEECG的容器化编
- 下一篇: HTML5的骨架