編輯:關於android開發
1,黑名單數據庫創建
三個字段(_id 自增長字段 phone 黑名單號碼 mode 攔截類型)
創建表的sql語句
create table blacknumber (_id integer primary key autoincrement , phone varchar(20), mode varchar(5));
結合項目,去創建數據庫,以及相應的表
2.BlackNumberDao
BlackNumberDao單例模式
1 package com.itheima.mobilesafe74.db.dao; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 import android.content.ContentValues; 7 import android.content.Context; 8 import android.database.Cursor; 9 import android.database.sqlite.SQLiteDatabase; 10 11 import com.itheima.mobilesafe74.db.BlackNumberOpenHelper; 12 import com.itheima.mobilesafe74.db.domain.BlackNumberInfo; 13 14 public class BlackNumberDao { 15 private BlackNumberOpenHelper blackNumberOpenHelper; 16 //BlackNumberDao單例模式 17 //1,私有化構造方法 18 private BlackNumberDao(Context context){ 19 //創建數據庫已經其表機構 20 blackNumberOpenHelper = new BlackNumberOpenHelper(context); 21 } 22 //2,聲明一個當前類的對象 23 private static BlackNumberDao blackNumberDao = null; 24 //3,提供一個靜態方法,如果當前類的對象為空,創建一個新的 25 public static BlackNumberDao getInstance(Context context){ 26 if(blackNumberDao == null){ 27 blackNumberDao = new BlackNumberDao(context); 28 } 29 return blackNumberDao; 30 } 31 32 /**增加一個條目 33 * @param phone 攔截的電話號碼 34 * @param mode 攔截類型(1:短信 2:電話 3:攔截所有(短信+電話)) 35 */ 36 public void insert(String phone,String mode){ 37 //1,開啟數據庫,准備做寫入操作 38 SQLiteDatabase db = blackNumberOpenHelper.getWritableDatabase(); 39 40 ContentValues values = new ContentValues(); 41 values.put("phone", phone); 42 values.put("mode", mode); 43 db.insert("blacknumber", null, values); 44 45 db.close(); 46 } 47 48 /**從數據庫中刪除一條電話號碼 49 * @param phone 刪除電話號碼 50 */ 51 public void delete(String phone){ 52 SQLiteDatabase db = blackNumberOpenHelper.getWritableDatabase(); 53 54 db.delete("blacknumber", "phone = ?", new String[]{phone}); 55 56 db.close(); 57 } 58 59 /** 60 * 根據電話號碼去,更新攔截模式 61 * @param phone 更新攔截模式的電話號碼 62 * @param mode 要更新為的模式(1:短信 2:電話 3:攔截所有(短信+電話) 63 */ 64 public void update(String phone,String mode){ 65 SQLiteDatabase db = blackNumberOpenHelper.getWritableDatabase(); 66 67 ContentValues contentValues = new ContentValues(); 68 contentValues.put("mode", mode); 69 70 db.update("blacknumber", contentValues, "phone = ?", new String[]{phone}); 71 72 db.close(); 73 } 74 75 /** 76 * @return 查詢到數據庫中所有的號碼以及攔截類型所在的集合 77 */ 78 public List<BlackNumberInfo> findAll(){ 79 SQLiteDatabase db = blackNumberOpenHelper.getWritableDatabase(); 80 81 Cursor cursor = db.query("blacknumber", new String[]{"phone","mode"}, null, null, null, null, "_id desc"); 82 List<BlackNumberInfo> blackNumberList = new ArrayList<BlackNumberInfo>(); 83 while(cursor.moveToNext()){ 84 BlackNumberInfo blackNumberInfo = new BlackNumberInfo(); 85 blackNumberInfo.phone = cursor.getString(0); 86 blackNumberInfo.mode = cursor.getString(1); 87 blackNumberList.add(blackNumberInfo); 88 } 89 cursor.close(); 90 db.close(); 91 92 return blackNumberList; 93 } 94 95 /** 96 * 每次查詢20條數據 97 * @param index 查詢的索引值 98 */ 99 public List<BlackNumberInfo> find(int index){ 100 SQLiteDatabase db = blackNumberOpenHelper.getWritableDatabase(); 101 102 Cursor cursor = db.rawQuery("select phone,mode from blacknumber order by _id desc limit ?,20;", new String[]{index+""}); 103 104 List<BlackNumberInfo> blackNumberList = new ArrayList<BlackNumberInfo>(); 105 while(cursor.moveToNext()){ 106 BlackNumberInfo blackNumberInfo = new BlackNumberInfo(); 107 blackNumberInfo.phone = cursor.getString(0); 108 blackNumberInfo.mode = cursor.getString(1); 109 blackNumberList.add(blackNumberInfo); 110 } 111 cursor.close(); 112 db.close(); 113 114 return blackNumberList; 115 } 116 117 /** 118 * @return 數據庫中數據的總條目個數,返回0代表沒有數據或異常 119 */ 120 public int getCount(){ 121 SQLiteDatabase db = blackNumberOpenHelper.getWritableDatabase(); 122 int count = 0; 123 Cursor cursor = db.rawQuery("select count(*) from blacknumber;", null); 124 if(cursor.moveToNext()){ 125 count = cursor.getInt(0); 126 } 127 128 cursor.close(); 129 db.close(); 130 return count; 131 } 132 133 /** 134 * @param phone 作為查詢條件的電話號碼 135 * @return 傳入電話號碼的攔截模式 1:短信 2:電話 3:所有 0:沒有此條數據 136 */ 137 public int getMode(String phone){ 138 SQLiteDatabase db = blackNumberOpenHelper.getWritableDatabase(); 139 int mode = 0; 140 Cursor cursor = db.query("blacknumber", new String[]{"mode"}, "phone = ?", new String[]{phone}, null, null,null); 141 if(cursor.moveToNext()){ 142 mode = cursor.getInt(0); 143 } 144 145 cursor.close(); 146 db.close(); 147 return mode; 148 } 149 }BlackNumberDao
3,加載更多的觸發條件
1.監聽狀態改變
2.滾動到最底部,最後一個listView的條目可見
3.滾動狀態發生改變 滾動------>停止(空閒)
加載下一頁數據完成後,需要添加到上一頁數據的最後面 20 40 60 80 100
//監聽其滾動狀態 lv_blacknumber.setOnScrollListener(new OnScrollListener() { //滾動過程中,狀態發生改變調用方法() @Override public void onScrollStateChanged(AbsListView view, int scrollState) { // OnScrollListener.SCROLL_STATE_FLING 飛速滾動 // OnScrollListener.SCROLL_STATE_IDLE 空閒狀態 // OnScrollListener.SCROLL_STATE_TOUCH_SCROLL 拿手觸摸著去滾動狀態 if(mBlackNumberList!=null){ //條件一:滾動到停止狀態 //條件二:最後一個條目可見(最後一個條目的索引值>=數據適配器中集合的總條目個數-1) if(scrollState == OnScrollListener.SCROLL_STATE_IDLE && lv_blacknumber.getLastVisiblePosition()>=mBlackNumberList.size()-1 && !mIsLoad){ /*mIsLoad防止重復加載的變量 如果當前正在加載mIsLoad就會為true,本次加載完畢後,再將mIsLoad改為false 如果下一次加載需要去做執行的時候,會判斷上訴mIsLoad變量,是否為false,如果為true,就需要等待上一次加載完成,將其值 改為false後再去加載*/ //如果條目總數大於集合大小的時,才可以去繼續加載更多 if(mCount>mBlackNumberList.size()){ //加載下一頁數據 new Thread(){ public void run() { //1,獲取操作黑名單數據庫的對象 mDao = BlackNumberDao.getInstance(getApplicationContext()); //2,查詢部分數據 List<BlackNumberInfo> moreData = mDao.find(mBlackNumberList.size()); //3,添加下一頁數據的過程 mBlackNumberList.addAll(moreData); //4,通知數據適配器刷新 mHandler.sendEmptyMessage(0); } }.start(); } } } } //滾動過程中調用方法 @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { } });
4.攔截短信
短信在接受的時候,廣播發送,監聽廣播接受者,攔截短信(有序)
將廣播的優先級級別提高到最高 (1000)
5.攔截電話
有電話撥入,處於響鈴狀態,響鈴狀態通過代碼去掛斷電話(aidl,反射),攔截電話
掛斷電話號碼的方法,放置在了aidl文件中名稱為endCall
在此處去查看TelePhoneManager源碼,去查找獲取ITelephony對象的方法
ServiceManager此類android對開發者隱藏,所以不能去直接調用其方法,所以需要反射調用
ITelephony.Stub.asInterface(ServiceManager.getService(Context.TELEPHONY_SERVICE));
<uses-permission android:name="android.permission.CALL_PHONE"/>
//1,獲取ServiceManager字節碼文件
Class<?> clazz = Class.forName("android.os.ServiceManager");
//2,獲取方法
Method method = clazz.getMethod("getService", String.class);
//3,反射調用此方法
IBinder iBinder = (IBinder) method.invoke(null, Context.TELEPHONY_SERVICE);
//4,調用獲取aidl文件對象方法
ITelephony iTelephony = ITelephony.Stub.asInterface(iBinder);
//5,調用在aidl中隱藏的endCall方法
iTelephony.endCall();
1 package com.itheima.mobilesafe74.service; 2 3 import java.lang.reflect.InvocationTargetException; 4 import java.lang.reflect.Method; 5 6 import com.android.internal.telephony.ITelephony; 7 import com.itheima.mobilesafe74.db.dao.BlackNumberDao; 8 import com.itheima.mobilesafe74.service.AddressService.MyPhoneStateListener; 9 import android.app.Service; 10 import android.content.BroadcastReceiver; 11 import android.content.Context; 12 import android.content.Intent; 13 import android.content.IntentFilter; 14 import android.os.IBinder; 15 import android.telephony.PhoneStateListener; 16 import android.telephony.SmsMessage; 17 import android.telephony.TelephonyManager; 18 import android.util.Log; 19 import android.view.WindowManager; 20 21 public class BlackNumberService extends Service { 22 private InnerSmsReceiver mInnerSmsReceiver; 23 private BlackNumberDao mDao; 24 private TelephonyManager mTM; 25 private MyPhoneStateListener mPhoneStateListener; 26 @Override 27 public void onCreate() { 28 mDao = BlackNumberDao.getInstance(getApplicationContext()); 29 30 //攔截短信 31 IntentFilter intentFilter = new IntentFilter(); 32 intentFilter.addAction("android.provider.Telephony.SMS_RECEIVED"); 33 intentFilter.setPriority(1000); 34 35 mInnerSmsReceiver = new InnerSmsReceiver(); 36 registerReceiver(mInnerSmsReceiver, intentFilter); 37 38 //監聽電話的狀態 39 //1,電話管理者對象 40 mTM = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); 41 //2,監聽電話狀態 42 mPhoneStateListener = new MyPhoneStateListener(); 43 mTM.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE); 44 45 super.onCreate(); 46 } 47 48 class MyPhoneStateListener extends PhoneStateListener{ 49 //3,手動重寫,電話狀態發生改變會觸發的方法 50 @Override 51 public void onCallStateChanged(int state, String incomingNumber) { 52 switch (state) { 53 case TelephonyManager.CALL_STATE_IDLE: 54 break; 55 case TelephonyManager.CALL_STATE_OFFHOOK: 56 break; 57 case TelephonyManager.CALL_STATE_RINGING: 58 //掛斷電話 aidl文件中去了 59 // mTM.endCall(); 60 endCall(incomingNumber); 61 break; 62 } 63 super.onCallStateChanged(state, incomingNumber); 64 } 65 } 66 class InnerSmsReceiver extends BroadcastReceiver{ 67 @Override 68 public void onReceive(Context context, Intent intent) { 69 //獲取短信內容,獲取發送短信電話號碼,如果此電話號碼在黑名單中,並且攔截模式也為1(短信)或者3(所有),攔截短信 70 //1,獲取短信內容 71 Object[] objects = (Object[]) intent.getExtras().get("pdus"); 72 //2,循環遍歷短信過程 73 for (Object object : objects) { 74 //3,獲取短信對象 75 SmsMessage sms = SmsMessage.createFromPdu((byte[])object); 76 //4,獲取短信對象的基本信息 77 String originatingAddress = sms.getOriginatingAddress(); 78 String messageBody = sms.getMessageBody(); 79 80 int mode = mDao.getMode(originatingAddress); 81 82 if(mode == 1 || mode == 3){ 83 //攔截短信(android 4.4版本失效 短信數據庫,刪除) 84 abortBroadcast(); 85 } 86 } 87 } 88 } 89 90 @Override 91 public IBinder onBind(Intent arg0) { 92 return null; 93 } 94 public void endCall(String phone) { 95 int mode = mDao.getMode(phone); 96 97 if(mode == 2 || mode == 3){ 98 // ITelephony.Stub.asInterface(ServiceManager.getService(Context.TELEPHONY_SERVICE)); 99 //ServiceManager此類android對開發者隱藏,所以不能去直接調用其方法,需要反射調用 100 try { 101 //1,獲取ServiceManager字節碼文件 102 Class<?> clazz = Class.forName("android.os.ServiceManager"); 103 //2,獲取方法 104 Method method = clazz.getMethod("getService", String.class); 105 //3,反射調用此方法 106 IBinder iBinder = (IBinder) method.invoke(null, Context.TELEPHONY_SERVICE); 107 //4,調用獲取aidl文件對象方法 108 ITelephony iTelephony = ITelephony.Stub.asInterface(iBinder); 109 //5,調用在aidl中隱藏的endCall方法 110 iTelephony.endCall(); 111 } catch (Exception e) { 112 e.printStackTrace(); 113 } 114 } 115 } 116 @Override 117 public void onDestroy() { 118 if(mInnerSmsReceiver!=null){ 119 unregisterReceiver(mInnerSmsReceiver); 120 } 121 super.onDestroy(); 122 } 123 }BlackNumberService
Android文件下載之進度檢測,android文件下載 近期因為項目的需要,研究了一下Android文件下載進度顯示的功能實現,接下來就和大家一起分享學習一下,希望對
Android_JSON數據分析 一.JSON的簡介: JSON建構於兩種結構: (1)“名稱/值”對的集合(A collection of na
onTouchEvent,ontouchevent使用新建MyView類 package onTouchEvent; import android.content.C
Android消息機制入門,android機制入門接著處理《Android 網絡圖片查看器》中出現的問題 使用添加子線程,修改原程序: package com.wuyu