[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;
}
}

[android] 手机卫士来电显示号码归属地的更多相关文章
- [android] 手机卫士接收打电话广播显示号码归属地
使用广播接收者接收打电话的意图,显示号码归属地 新建一个类OutCallReceiver继承系统的BroadcastReceiver 重写onReceive()方法 调用getResultData() ...
- Android 手机卫士--设置界面&功能列表界面跳转逻辑处理
在<Android 手机卫士--md5加密过程>中已经实现了加密类,这里接着实现手机防盗功能 本文地址:http://www.cnblogs.com/wuyudong/p/5941959. ...
- Android 手机卫士--确认密码对话框编写
本文接着实现“确认密码”功能,也即是用户以前设置过密码,现在只需要输入确认密码 本文地址:http://www.cnblogs.com/wuyudong/p/5940718.html,转载请注明出处. ...
- Android 手机卫士--参照文档编写选择器
本文来实现<Android 手机卫士--导航界面1的布局编写>中的图片选择器部分的代码. 本文地址:http://www.cnblogs.com/wuyudong/p/5944356.ht ...
- Android 手机卫士--签名文件说明&包名说明
在<Android 手机卫士--打包生成apk维护到服务器>一文中,实现了新版本的apk到服务器,当打开客户端apk的时候,发现有新版本,提示更新.还实现了利用xutils工具实现了从服务 ...
- Android 手机卫士--弹出对话框
在<Android 手机卫士--解析json与消息机制发送不同类型消息>一文中,消息机制发送不同类型的信息还没有完全实现,在出现异常的时候,应该弹出吐司提示异常,代码如下: private ...
- android手机卫士、3D指南针、动画精选、仿bilibli客户端、身份证银行卡识别等源码
Android精选源码 android身份证.银行卡号扫描源码 android仿bilibili客户端 android一款3D 指南针 源码 android手机卫士app源码 android提醒应用, ...
- Android 手机卫士--xutils说明与下载方法使用
xUtils简介 xUtils 包含了很多实用的android工具. xUtils 最初源于Afinal框架,进行了大量重构,使得xUtils支持大文件上传,更全面的http请求协议支持(10种谓词) ...
- [android] 手机卫士自定义滚动控件
TextView控件设置单行显示 android:singleLine=”true” 设置TextView开始的位置显示省略号,android:ellipsize=”start” 设置滚动属性,and ...
随机推荐
- 基于duilib的虚拟列表实现
本文由作者邹启文授权网易云社区发布. 在邮箱大师选择duilib作为UI开发库后,我们面临这样一个问题.随着时间的积累,用户数据会越来越多,如何保证我们的软件在展示这些数据时依然保持非常好的体验? 原 ...
- git生成Key操作保存到GITHUB中
https://blog.csdn.net/sinat_23880167/article/details/78502528 1. 在git中通过命令: $ ssh-keygen Generating ...
- centos7在分区上建立文件系统和挂载
在上一篇博客中,我们只说了硬盘的分区,既然进行分区,那么我们就要知道如何使用这些分区,就是接下来的建立文件系统和挂载. mkfs(make filesystem)格式化,建立文件系统 可以看到各种文件 ...
- vue的无缝滚动插件vue-seamless-scroll的安装与使用
npm安装地址 https://www.npmjs.com/package/vue-seamless-scroll 命令行执行: npm install vue-seamless-scroll --s ...
- 使用sqlyog连接到服务器数据库,实现可视化数据操作。(完美解决版。)《亲测!!!!》
服务器中的表 select Host ,User ,Select_priv ,Insert_priv ,Update_priv ,Delete_priv ,Create_priv ,Drop_pr ...
- 【NOI2013】快餐店 环套树+线段树
题目大意:给你一颗环套树,你要在这棵的边上(包括端点)找一个点,使得离该点最远的点最近. 数据范围:$n≤10^5$,边权$≤10^9$. 此题不难看出一种暴力做法,我们依次断开环上的一条边,然后求整 ...
- U8API——向U8数据库表导入数据
一.打开API资源管理器 替换两个引用 打开应用实例,选择相应的功能 复制相应的封装类到自己的目录下 在数据库新建临时表,与目标表相同 数据导入: 思路:先将要导入的数据导入到与U8目标表相同的临时表 ...
- 用Lingo求解线性规划问题
第一步:输入目标条件和约束条件.每行以分号隔开.然后点击工具栏上的Solve按钮,或Lingo菜单下的Solve子菜单. 第二步:检查report中的结果. 默认情况下,Lingo不进行灵敏度分析. ...
- 剑指offer三十二之把数组排成最小的数
一.题目 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. 二.思路 ( ...
- centos 7 nginx 安装
1.下载nginx rpm包 下载地址:http://nginx.org/packages/mainline/centos/7/x86_64/RPMS/ ,可查看所有安装包 从中如下载: wget h ...