[android] 手機衛士來電顯示號碼歸屬地,android來電顯示
繼續N天前的項目
開啟服務監聽手機來電,查詢資料庫,顯示歸屬地
詳細內容可以參考這篇博文:http://www.cnblogs.com/taoshihan/p/5331232.html
AddressService.java
package com.qingguow.mobilesafe.service;import com.qingguow.mobilesafe.utils.NumberQueryAddressUtil;import android.app.Service;import android.content.Intent;import android.os.IBinder;import android.telephony.PhoneStateListener;import android.telephony.TelephonyManager;import android.widget.Toast;/** * 來電顯示 * * @author taoshihan * */public class AddressService extends Service { private TelephonyManager tm; private MyPhoneStateListener phoneStateListener; @Override public IBinder onBind(Intent arg0) { // TODO Auto-generated method stub return null; } /** * 服務建立 */ @Override public void onCreate() { super.onCreate(); tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); phoneStateListener = new MyPhoneStateListener(); tm.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE); } private class MyPhoneStateListener extends PhoneStateListener { @Override public void onCallStateChanged(int state, String incomingNumber) { super.onCallStateChanged(state, incomingNumber); switch (state) { case TelephonyManager.CALL_STATE_RINGING: String info = NumberQueryAddressUtil .queryAddress(incomingNumber); Toast.makeText(getApplicationContext(), info, 1).show(); break; default: break; } } } /** * 服務銷毀 */ @Override public void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); //取消監聽 tm.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE); phoneStateListener=null; }}
設定中心,配置是否開啟來電歸屬地顯示
直接使用我們之前定義好的群組控制項
<com.qingguow.mobilesafe.ui.SettingItemView tsh:title="設定顯示號碼歸屬地" tsh:desc_on="設定顯示號碼歸屬地已開啟" tsh:desc_off="設定顯示號碼歸屬地已關閉" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/siv_show_address"> </com.qingguow.mobilesafe.ui.SettingItemView>
擷取到SettingItemView對象,我們自訂的控制項,設定狀態
調用SettingItemView對象的setOnClickListener()方法,設定點擊事件,重寫onClick方法
調用SettingItemView對象的isChecked()方法,得到當前是否選中
判斷狀態,調用SettingItemView對象的setChecked()方法,設定狀態,參數:布爾值
調用startService()方法,開啟監聽手機狀態的服務,參數:Intent對象,
調用stopService()方法,關閉服務
判斷當前服務是否開啟,設定控制項的預設選中狀態
建立一個工具類ServicesUtils.java
定義一個靜態方法isServiceRunning(),傳入參數:Context上下文,String服務名
調用Context對象的getSystemService()方法,擷取ActivityManager對象,參數:Context.ACTIVITY_SERVICE
調用ActivityManager對象的getRunningServices()方法,得到啟動並執行服務List集合,參數:int最大值
for迴圈List集合,每條是個RunningServiceInfo對象
調用RunningServiceInfo.servie.getClassName(),擷取到String服務類名,判斷一下如果相等返回true
SettingActivity.java
package com.qingguow.mobilesafe;import android.app.Activity;import android.content.Intent;import android.content.SharedPreferences;import android.content.SharedPreferences.Editor;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import com.qingguow.mobilesafe.service.AddressService;import com.qingguow.mobilesafe.ui.SettingItemView;import com.qingguow.mobilesafe.utils.ServiceUtils;public class SettingActivity extends Activity { private SettingItemView siv_item; private SharedPreferences sp; // 設定是否開啟號碼歸屬地 private SettingItemView showAddressBtn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_setting); // 設定號碼歸屬地 showAddressBtn = (SettingItemView) findViewById(R.id.siv_show_address); if (ServiceUtils.isRunningService(this, "com.qingguow.mobilesafe.service.AddressService")) { showAddressBtn.setChecked(true); } else { showAddressBtn.setChecked(false); } showAddressBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { if (showAddressBtn.isChecked()) { showAddressBtn.setChecked(false); stopService(new Intent(getApplicationContext(), AddressService.class)); } else { showAddressBtn.setChecked(true); startService(new Intent(getApplicationContext(), AddressService.class)); } } }); siv_item = (SettingItemView) findViewById(R.id.siv_item); sp = getSharedPreferences("config", MODE_PRIVATE); // 根據儲存的資料設定狀態 boolean update = sp.getBoolean("update", false); if (update) { siv_item.setChecked(true); } else { siv_item.setChecked(false); } // 自動更新的點擊事件 siv_item.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { Editor editor = sp.edit(); if (siv_item.isChecked()) { // 設定不選中 siv_item.setChecked(false); editor.putBoolean("update", false); } else { // 設定選中 siv_item.setChecked(true); editor.putBoolean("update", true); } editor.commit(); } }); }}
ServicesUtils.java
package com.qingguow.mobilesafe.utils;import java.util.List;import android.app.ActivityManager;import android.app.ActivityManager.RunningServiceInfo;import android.content.Context;/** * 服務工具類 * @author taoshihan * */public class ServiceUtils { /** * 判斷某服務是否開啟 * @param context * @param serviceName * @return */ public static boolean isRunningService(Context context,String serviceName){ ActivityManager am=(ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); List<RunningServiceInfo> infos=am.getRunningServices(100); for(RunningServiceInfo info:infos){ String name=info.service.getClassName(); if(name.equals(serviceName)){ return true; } } return false; }}