186
技術社區[雲棲]
Android ContentObserver監視未接電話,未讀短信
ContentObserver有點類似於BroadcastReceiver,當某類事件發生時進行調用.ContentObserver一般和係統或第三方程序提供的Provider一起使用.
當為某個URI注冊了ContentObserver後,對其進行操作後都會調用注冊的回調函數,以監視未接電話為例(未讀短信和未接電話類似,隻需將URI改為短信的URI就可以了):
// 注冊ContentObserver
getContentResolver().registerContentObserver(CallLog.Calls.CONTENT_URI, false, new MissedCallContentObserver(this,
new Handler()));
// 當有call log時,就會對這個類進行回調
public class MissedCallContentObserver extends ContentObserver {
private Context ctx;
private static final String TAG = "MissedCallContentObserver";
public MissedCallContentObserver(Context context, Handler handler) {
super(handler);
ctx = context;
}
@Override
public void onChange(boolean selfChange) {
Cursor csr = ctx.getContentResolver().query(Calls.CONTENT_URI, new String[] {Calls.NUMBER,
Calls.TYPE, Calls.NEW}, null, null, Calls.DEFAULT_SORT_ORDER);
if (csr != null) {
if (csr.moveToFirst()) {
int type = csr.getInt(csr.getColumnIndex(Calls.TYPE));
switch (type) {
case Calls.MISSED_TYPE:
Log.v(TAG, "missed type");
if (csr.getInt(csr.getColumnIndex(Calls.NEW)) == 1) {
Log.v(TAG, "you have a missed call");
}
break;
case Calls.INCOMING_TYPE:
Log.v(TAG, "incoming type");
break;
case Calls.OUTGOING_TYPE:
Log.v(TAG, "outgoing type");
break;
}
}
// release resource
csr.close();
}
}
@Override
public boolean deliverSelfNotifications() {
return super.deliverSelfNotifications();
}
}
最後更新:2017-04-03 05:40:23