我们使用服务监听电话。
在设置中心添加是否设置来电号码归属地的服务:
<com.ustc.mobilemanager.ui.SettingItemView
owndefine:title="设置显示号码归属地"
owndefine:desc_on="设置显示号码归属地已经开启"
owndefine:desc_off="设置显示号码归属地已经关闭"
android:id="@+id/siv_show_address"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
服务:
package com.ustc.mobilemanager.service;
import com.ustc.mobilemanager.db.dao.NumberAddressQueryUtils;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.widget.Toast;
public class AddressService extends Service {
private TelephonyManager tm;
private MyListenerPhone listenerPhone;
@Override
public IBinder onBind(Intent intent) {
return null;
}
private class MyListenerPhone extends PhoneStateListener {
@Override
public void onCallStateChanged(int state, String incomingNumber) {
super.onCallStateChanged(state, incomingNumber);
switch (state) {
case TelephonyManager.CALL_STATE_RINGING:// 来电铃声响起
// 查询数据库的操作
String address = NumberAddressQueryUtils
.queryNumber(incomingNumber);
Toast.makeText(getApplicationContext(), address, 1).show();
break;
default:
break;
}
}
}
@Override
public void onCreate() {
super.onCreate();
tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
listenerPhone = new MyListenerPhone();
tm.listen(listenerPhone, PhoneStateListener.LISTEN_CALL_STATE);
}
@Override
public void onDestroy() {
super.onDestroy();
tm.listen(listenerPhone, PhoneStateListener.LISTEN_NONE);
listenerPhone = null;
}
}
在onCreate方法中得到电话管理器,使用电话管理器监听电话的状态。
siv_show_address.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (siv_show_address.isChecked()) {
//变为非选中状态
siv_show_address.setChecked(false);
stopService(showAddress);
}else {
//变为选择的状态
siv_show_address.setChecked(true);
startService(showAddress);
}
}
});
但是此时有很大的bug,服务的开启与否,与CheckBox的选择没关系,使用SharedPreferences也不能保存服务的状态。所以我们得创建一个服务的工具类,判断一个服务是否在活着。
package com.ustc.mobilemanager.utils;
import java.util.List;
import android.app.ActivityManager;
import android.app.ActivityManager.RunningServiceInfo;
import android.content.Context;
/**
*
* 校验某个服务是否还活着
*
* @author
*
*/
public class ServiceUtils {
/**
*
* 校验某个服务是否还活着
*
* @param service
* @return
*/
public static boolean isServiceRunning(Context context, String service) {
// 校验服务是否还活着
ActivityManager am = (ActivityManager) context
.getSystemService(Context.ACTIVITY_SERVICE);
// 返回数目
List<RunningServiceInfo> runningServices = am.getRunningServices(100);
for (RunningServiceInfo runningServiceInfo : runningServices) {
// 正在运行的服务的名字
String name = runningServiceInfo.service.getClassName();
if (service.equals(name)) {
return true;
}
}
return false;
}
}
调用:
showAddress = new Intent(this, AddressService.class);
boolean isServiceRunning = ServiceUtils.isServiceRunning(SettingActivity.this, "com.ustc.mobilemanager.service.AddressService");
if (isServiceRunning) {
//变为选择的状态
siv_show_address.setChecked(true);
}else {
//变为非选中状态
siv_show_address.setChecked(false);
}
siv_show_address.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (siv_show_address.isChecked()) {
//变为非选中状态
siv_show_address.setChecked(false);
stopService(showAddress);
}else {
//变为选择的状态
siv_show_address.setChecked(true);
startService(showAddress);
}
}
});
ok。