当外来电话打过来的时候需要实施的显示,打进来的号码的归属地,首先创建一个文本框让用户自己选择服务是否开启,同时在逻辑中进行设置,监听勾选框根据服务的状态来选择是否勾选(防止用户自己关闭服务,导致状态和勾选框不一致的现象)。
要监听服务的状态,首先需要创建一个服务的监听,判断系统的开启的服务有哪些,判断某一个服务是否在开启的服务中,根据返回值来设置勾选框。
布局显示如下
首先清单文件中注册一个服务
<service android:name="com.ldw.safe.service.AddressService"></service>
服务状态的监听ServiceStatusUtils.java
package com.ldw.safe.utils;
import java.util.List;
import android.app.ActivityManager;
import android.app.ActivityManager.RunningServiceInfo;
import android.content.Context;
/*
* 服务状态的工具类
*/
public class ServiceStatusUtils {
/*
* 检测服务是否运行
*/
public static boolean isServiceRunning(Context ctx, String serviceName){
//利用context获取到系统的服务
ActivityManager am = (ActivityManager) ctx.getSystemService(Context.ACTIVITY_SERVICE);
//获取到正在运行的服务,100是返回服务的最大值
List<RunningServiceInfo> runningService = am.getRunningServices(100);
//遍历服务
for(RunningServiceInfo runningServiceInfo:runningService){
//获取服务的名字
String className = runningServiceInfo.service.getClassName();
//System.out.println(className);
//判断系统里面有没有这个服务,有这个服务就返回true
if(className.equals(serviceName)){
return true;
}
}
return false;
}
}
设置页面布局文件activity_setting.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:ldw="http://schemas.android.com/apk/res/com.ldw.safe"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
style="@style/TitleStyle"
android:text="手机设置"
/>
<com.ldw.safe.view.SettingItemView
android:id="@+id/siv_update"
android:layout_width="match_parent"
android:layout_height="wrap_content"
ldw:title="自动更新设置"
ldw:desc_on="自动更新已开启"
ldw:desc_off="自动更新已关闭"
/>
<com.ldw.safe.view.SettingItemView
android:id="@+id/siv_address"
android:layout_width="match_parent"
android:layout_height="wrap_content"
ldw:title="电话归属地显示设置"
ldw:desc_on="电话归属地显示已开启"
ldw:desc_off="电话归属地显示已关闭"
/>
</LinearLayout>
设置的逻辑文件SettingActivity.java
package com.ldw.safe.Activity;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import com.ldw.safe.R;
import com.ldw.safe.service.AddressService;
import com.ldw.safe.utils.ServiceStatusUtils;
import com.ldw.safe.view.SettingItemView;
/**
* 设置中心
*/
public class SettingActivity extends Activity {
private SettingItemView siv_update;//设置自动更新
private SettingItemView siv_address;//归属地
private SharedPreferences mPref;//把设置的数据保存在mPref
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_setting);
//把设置的数据保存在mPref
mPref = getSharedPreferences("config", MODE_PRIVATE);
initUpdateView();//初始化自动升级开关
initAdressView();//初始化归属地开关
}
/*
* 初始化自动升级开关
*/
private void initUpdateView(){
siv_update = (SettingItemView)findViewById(R.id.siv_update);
//siv_update.setTitle("自动更新设置");
//获取保存的数据,判断之前选择的是开始还是关闭,初始化进入界面是否勾选
boolean autoUpdate = mPref.getBoolean("auto_update", true);
if(autoUpdate){
siv_update.setDesc("自动更新已经开启");
siv_update.setChecked(true);
}else{
siv_update.setDesc("自动更新已经关闭");
siv_update.setChecked(false);
}
siv_update.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
//判断右边框的勾选状态
if(siv_update.isChecked()){
//设置不勾选
siv_update.setChecked(false);
//siv_update.setDesc("自动更新已经关闭");
//编辑mPref的值
mPref.edit().putBoolean("auto_update", false).commit();
}else{
//设置勾选
siv_update.setChecked(true);
//siv_update.setDesc("自动更新已经开启");
//编辑mPref的值
mPref.edit().putBoolean("auto_update", true).commit();
}
}
});
}
/*
* 初始化归属地开关
*/
private void initAdressView(){
siv_address = (SettingItemView) findViewById(R.id.siv_address);
//判断归属地的服务是否在运行
boolean serviceRunning = ServiceStatusUtils.isServiceRunning(this, "com.ldw.safe.service.AddressService");
//让服务的那个勾选框根据系统中是否有服务来判断是否去开启
if(serviceRunning){
siv_address.setChecked(true);
}else{
siv_address.setChecked(false);
}
siv_address.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
if(siv_address.isChecked()){
siv_address.setChecked(false);
stopService(new Intent(SettingActivity.this, AddressService.class));
}else{
siv_address.setChecked(true);
//号码归属地显示开启的时候要开启服务
startService(new Intent(SettingActivity.this, AddressService.class));
}
}
});
}
}
来电归显示属地的服务AddressService.java
package com.ldw.safe.service;
import com.ldw.safe.db.dao.AddressDao;
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 MyListener listener;
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onCreate(){
super.onCreate();
tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
listener = new MyListener();
tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);//监听打电话的状态
}
class MyListener extends PhoneStateListener{
//监听电话状态的变化
@Override
public void onCallStateChanged(int state, String incomingNumber){
//
switch(state){
//电话铃声响起
case TelephonyManager.CALL_STATE_RINGING:
System.out.println("CALL_STATE_RINGING");
//获取来电的号码归属地
String address = AddressDao.getAddress(incomingNumber);
Toast.makeText(AddressService.this, address, Toast.LENGTH_LONG).show();
break;
default:
break;
}
super.onCallStateChanged(state, incomingNumber);
}
}
@Override
public void onDestroy(){
super.onDestroy();
//关闭服务,停止来电监听
tm.listen(listener, PhoneStateListener.LISTEN_NONE);
}
}