需求:打进电话,用Toast显示来电归属地(注:说明系统的拨号不能改)

第一步:创建后台监听来电服务AddressService 并在功能清单文件注册;

所需权限:

<uses-permission android:name="android.permission.READ_PHONE_STATE" />

AddressService 代码如下:

packagecom.zaizai.safty.service;importandroid.app.Service;importandroid.content.BroadcastReceiver;importandroid.content.Context;importandroid.content.Intent;importandroid.content.IntentFilter;importandroid.content.SharedPreferences;importandroid.graphics.PixelFormat;importandroid.os.IBinder;importandroid.telephony.PhoneStateListener;importandroid.telephony.TelephonyManager;importandroid.view.View;importandroid.view.WindowManager;importandroid.widget.TextView;importandroid.widget.Toast;importcom.zaizai.safty.R;importcom.zaizai.safty.db.dao.NumberAddressQueryUtils;publicclassAddressServiceextendsService{/***电话*/privateTelephonyManagertelephonyManager;privateMyListenerPhonemyListenerPhone;privateclassMyListenerPhoneextendsPhoneStateListener{@OverridepublicvoidonCallStateChanged(intstate,StringincomingNumber){//state:状态,incomingNumber:来电号码super.onCallStateChanged(state,incomingNumber);switch(state){caseTelephonyManager.CALL_STATE_RINGING://来电铃声响起//查询数据库的操作Stringaddress=NumberAddressQueryUtils.queryNumber(incomingNumber);Toast.makeText(getApplicationContext(),address,Toast.LENGTH_LONG).show();//myToast(address);break;caseTelephonyManager.CALL_STATE_IDLE://电话的空闲状态:挂电话、来电拒绝break;default:break;}}}@OverridepublicvoidonCreate(){//TODOAuto-generatedmethodstubsuper.onCreate();//电话服务telephonyManager=(TelephonyManager)getSystemService(TELEPHONY_SERVICE);//监听来电myListenerPhone=newMyListenerPhone();//注册服务去监听电话telephonyManager.listen(myListenerPhone,PhoneStateListener.LISTEN_CALL_STATE);}@OverridepublicvoidonDestroy(){//TODOAuto-generatedmethodstubsuper.onDestroy();//取消监听来电telephonyManager.listen(myListenerPhone,PhoneStateListener.LISTEN_NONE);myListenerPhone=null;}}

第二步:在AddressService 服务里面注册来电状态(TelephoneManager)

//电话服务telephonyManager=(TelephonyManager)getSystemService(TELEPHONY_SERVICE);//监听来电myListenerPhone=newMyListenerPhone();//注册服务去监听电话telephonyManager.listen(myListenerPhone,PhoneStateListener.LISTEN_CALL_STATE);

3、自定义监听类MyPhoneStateListener

private class MyListenerPhone extends PhoneStateListener {

@Override

* 当呼叫状态发生改变的时候回调该方法
public void onCallStateChanged(int state, String incomingNumber) {
// state:状态,incomingNumber:来电号码
super.onCallStateChanged(state, incomingNumber);
switch (state) {
case TelephonyManager.CALL_STATE_RINGING:// 来电铃声响起
// 查询数据库的操作
String address = NumberAddressQueryUtils
.queryNumber(incomingNumber);

Toast.makeText(getApplicationContext(), address, Toast.LENGTH_LONG).show();
// myToast(address);

break;

case TelephonyManager.CALL_STATE_IDLE://电话的空闲状态:挂电话、来电拒绝



break;

default:
break;
}
}

}

&#160;

AddressDao.getAddress(incomingNumber);

在onDestroy()被调用时取消监听:

@OverridepublicvoidonDestroy(){//TODOAuto-generatedmethodstubsuper.onDestroy();//取消监听来电telephonyManager.listen(myListenerPhone,PhoneStateListener.LISTEN_NONE);myListenerPhone=null;

4、在SettingActivity设置中心里配置设置,当点击开启的时候就启动服务,否则相反。然后演示;

布局文件:

<com.itheima.mobilesafe.ui.SettingItemView

android:id="@+id/siv_show_address"

itheima:title="设置号码归属地显示"

itheima:desc_on="号码归属地显示已经打开"

itheima:desc_off="号码归属地显示已经关闭"

android:layout_width="match_parent"

android:layout_height="wrap_content" />

SettingActivity里的代码:

//设置号码归属地显示

siv_show_address = (SettingItemView) findViewById(R.id.siv_show_address);

showAddressIntent = new Intent(this, AddressService.class);

siv_show_address.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

if(siv_show_address.isCheck()){

siv_show_address.setCheck(false);

stopService(showAddressIntent);

//sp共享偏好去保存

}else{

startService(showAddressIntent);

siv_show_address.setCheck(true);

}

}

});

5、创建一个类ServiceStatusUtils 里面的方法isServiceRunning()校验检查一个服务是否开启;

/**

* 检验一个服务是否还运行,系统所有的

*/

public static boolean isServiceRunning(Context context,String serviceName){

ActivityManager am= (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);

List<RunningServiceInfo> infos = am.getRunningServices(100);

for(RunningServiceInfo info : infos){

String className = info.service.getClassName();

if(className.equals(serviceName)){

return true;

}

}

return false;

}

更多相关文章

  1. Android(安卓)添加Fragment的onTouchEvent监听
  2. 通过AIDL及反射机制,使用隐藏API挂断电话
  3. Android小程序——拨打电话
  4. Java入侵检测(三)
  5. Android(安卓)中文API (91) —— GestureDetector
  6. Android(安卓)拦截Home键的常用方法
  7. Android(安卓)中监听WIFI连接状态变化
  8. Android利用手势完成屏幕密码锁功能
  9. Android之监听View的两个指头是放大和缩小

随机推荐

  1. 1.5 Android(安卓)入门实例 后台循环发短
  2. android 之绘图
  3. 本人写的Android上RSS阅读器简单介绍
  4. Android发送短信
  5. Android(安卓)webview与js交互
  6. android中文api(79)——Gallery
  7. 小常识集锦
  8. Android(安卓)Studio jni开发
  9. 2013.03.19(3)———android ActivityGroup
  10. android横竖屏切换不重启activity