編輯:關於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文件下載 近期因為項目的需要,研究了一下Android文件下載進度顯示的功能實現,接下來就和大家一起分享學習一下,希望對
Android_JSON數據分析
Android_JSON數據分析 一.JSON的簡介: JSON建構於兩種結構: (1)“名稱/值”對的集合(A collection of na
onTouchEvent,ontouchevent使用
onTouchEvent,ontouchevent使用新建MyView類 package onTouchEvent; import android.content.C
Android消息機制入門,android機制入門
Android消息機制入門,android機制入門接著處理《Android 網絡圖片查看器》中出現的問題 使用添加子線程,修改原程序: package com.wuyu