点击设置中心的“来电归属地风格设置”弹出如下对话框供用户选择
设置中心代码:
package com.example.mobilesafe;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.TextView;
import com.example.mobilesafe.service.ShowCallLocationService;
import com.example.utils.ServiceStatusUtil;
/**
* Created by sing on 13-12-24.
* desc:
*/
public class SettingCenterActivity extends Activity {
//背景风格
private static final String[] bg_styles = {"半透明", "活力橙", "卫士蓝", "苹果绿", "金属灰"};
//设置自动更新的checkbox
private View rl_setting_autoupdate;
private CheckBox cb_setting_autoupdate;
//显示自动更新开启状态的文本框
private TextView tv_setting_autoupdate_status;
private View rl_setting_show_location;
private CheckBox cb_setting_showlocation;
private TextView tv_setting_show_location_status;
//来电归属地显示风格
private View rl_setting_showlocation_style;
private TextView tv_setting_showlocation_style;
//开启来电归属地信息显示的意图
private Intent showLocationIntent;
//保存配置
private SharedPreferences sp;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_settingcenter);
tv_setting_autoupdate_status = (TextView) findViewById(R.id.tv_setting_autoupdate_status);
cb_setting_autoupdate = (CheckBox) findViewById(R.id.cb_setting_autoupdate);
//加载上次设置的状态
sp = getSharedPreferences("config", MODE_PRIVATE);
boolean autoupdate = sp.getBoolean("autoupdate", true);
cb_setting_autoupdate.setChecked(autoupdate);
tv_setting_autoupdate_status.setText(autoupdate ? "自动更新已经开启" : "自动更新已经关闭");
tv_setting_autoupdate_status.setTextColor(autoupdate ? Color.WHITE : Color.GRAY);
//为checkbox编写响应事件
rl_setting_autoupdate = findViewById(R.id.rl_setting_autoupdate);
rl_setting_autoupdate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
boolean b = !cb_setting_autoupdate.isChecked();
SharedPreferences.Editor editor = sp.edit();
editor.putBoolean("autoupdate", b);
editor.commit();
cb_setting_autoupdate.setChecked(b);
tv_setting_autoupdate_status.setText(b ? "自动更新已经开启" : "自动更新已经关闭");
tv_setting_autoupdate_status.setTextColor(b ? Color.WHITE : Color.GRAY);
}
});
//来电归属地设置
showLocationIntent = new Intent(this, ShowCallLocationService.class);
tv_setting_show_location_status = (TextView)findViewById(R.id.tv_setting_show_location_status);
cb_setting_showlocation = (CheckBox) findViewById(R.id.cb_setting_showlocation);
rl_setting_show_location = findViewById(R.id.rl_setting_show_location);
rl_setting_show_location.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (cb_setting_showlocation.isChecked()) {
cb_setting_showlocation.setChecked(false);
tv_setting_show_location_status.setText("来电归属地显示没有开启");
tv_setting_show_location_status.setTextColor(Color.GRAY);
//开启来电归属地显示
stopService(showLocationIntent);
}else{
cb_setting_showlocation.setChecked(true);
tv_setting_show_location_status.setText("来电归属地显示已经开启");
tv_setting_show_location_status.setTextColor(Color.WHITE);
//关闭来电归属地显示
startService(showLocationIntent);
}
}
});
//来电归属地风格设置
tv_setting_showlocation_style = (TextView) findViewById(R.id.tv_setting_showlocation_style);
int style = sp.getInt("which", 0);
tv_setting_showlocation_style.setText(bg_styles[style]);
rl_setting_showlocation_style = findViewById(R.id.rl_setting_showlocation_style);
rl_setting_showlocation_style.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
showChooseBgDlg();
}
});
}
@Override
protected void onResume() {
boolean serviceRunning = ServiceStatusUtil.isServiceRunning(this, "com.example.mobilesafe.service.ShowCallLocationService");
cb_setting_showlocation.setChecked(serviceRunning);
tv_setting_show_location_status.setText(serviceRunning ? "来电归属地显示已经开启" : "来电归属地显示没有开启");
tv_setting_show_location_status.setTextColor(serviceRunning ? Color.WHITE : Color.GRAY);
super.onResume();
}
//选择背景颜色对话框
private void showChooseBgDlg() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setIcon(R.drawable.notification);
builder.setTitle("归属地提示框风格");
int which = sp.getInt("which", 0);
builder.setSingleChoiceItems(bg_styles,which,new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
SharedPreferences.Editor editor = sp.edit();
editor.putInt("which", i);
editor.commit();
tv_setting_showlocation_style.setText(bg_styles[i]);
dialogInterface.dismiss();
}
});
builder.setNegativeButton("取消",new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
});
builder.create().show();
}
}
主要功能在showChooseBgDlg中。
另外在服务中使用设置的背景:
package com.example.mobilesafe.service;
import android.app.ActionBar;
import android.app.Service;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.PixelFormat;
import android.net.NetworkInfo;
import android.os.IBinder;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.view.View;
import android.view.WindowManager;
import android.widget.LinearLayout;
import android.widget.Switch;
import android.widget.TextView;
import com.example.mobilesafe.R;
import com.example.mobilesafe.db.NumberAddressDao;
/**
* Created by sing on 14-1-13.
* desc:监听电话呼入的服务
*/
public class ShowCallLocationService extends Service {
//"半透明", "活力橙", "卫士蓝", "苹果绿", "金属灰"
public static final int[] bg_styles = {R.drawable.call_locate_white,
R.drawable.call_locate_orange, R.drawable.call_locate_blue,
R.drawable.call_locate_green, R.drawable.call_locate_gray};
//电话管理器
private TelephonyManager tm;
//窗体管理器
private WindowManager windowManager;
//电话状态改变的监听器
private MyPhoneListener listener;
//保存配置
private SharedPreferences sp;
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
sp = getSharedPreferences("config", MODE_PRIVATE);
listener = new MyPhoneListener();
tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
}
private class MyPhoneListener extends PhoneStateListener {
private View view;
@Override
public void onCallStateChanged(int state, String incomingNumber) {
switch (state) {
//电话铃声正在响
case TelephonyManager.CALL_STATE_RINGING:
//查询出电话号码的归属地
NumberAddressDao numberAddressDao = new NumberAddressDao(getApplicationContext());
String address = numberAddressDao.getAddress(incomingNumber);
//通过布局填充器将布局转换为view
view = View.inflate(getApplicationContext(), R.layout.show_address, null);
LinearLayout ll = (LinearLayout) view.findViewById(R.id.ll_show_address);
int style = sp.getInt("which", 0);
ll.setBackgroundResource(bg_styles[style]);
TextView tv = (TextView) view.findViewById(R.id.tv_show_address);
tv.setText(address);
final WindowManager.LayoutParams params = new WindowManager.LayoutParams();
params.height = WindowManager.LayoutParams.WRAP_CONTENT;
params.width = WindowManager.LayoutParams.WRAP_CONTENT;
params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
//显示在窗体上的style为半透明
params.format = PixelFormat.TRANSLUCENT;
//窗体view的类型为吐司
params.type = WindowManager.LayoutParams.TYPE_TOAST;
windowManager.addView(view, params);
break;
//电话空闲状态
case TelephonyManager.CALL_STATE_IDLE:
//将窗体上的吐司移除
if (view != null) {
windowManager.removeView(view);
view = null;
}
break;
//电话接通状态
case TelephonyManager.CALL_STATE_OFFHOOK:
//将窗体上的吐司移除
if (view != null) {
windowManager.removeView(view);
view = null;
}
break;
}
super.onCallStateChanged(state, incomingNumber);
}
}
}
主要代码是:
LinearLayout ll = (LinearLayout) view.findViewById(R.id.ll_show_address);
int style = sp.getInt("which", 0);
ll.setBackgroundResource(bg_styles[style]);