首页 > 代码库 > android项目 之 来电管家(4) ----- 添加拦截时间段
android项目 之 来电管家(4) ----- 添加拦截时间段
在大多数的骚扰拦截类的软件中都会有定时拦截这个实用的的功能,其实,也不难实现。
看图:
在未选中启用时间段时,下面的两个开始时间和结束时间呈灰色状态,并且单击无响应,启用时间段后,下面则变成了可以单击的状态,通过单击可以弹出选择日期与时间的对话框,用于选择开始时间和结束时间。
主要思路:
1. 启用时间段,将下面的控件变成可获得焦点状态
2. 添加单击事件,弹出日期时间选择对话框
3. 选择时间,并显示在相应的位置
4. 通过SharedPrefresence将相关设置保存,以便下次启动程序时使用
设置界面的布局文件已在第一节给出了,下面实现就实现具体添加时间的功能。
首先是控件的声明,这里用到了ToggleButton来表示两种状态,当然了也可用Switch,但是2.3不支持。
private ToggleButton tb_switch,tb_whiteList,tb_time; private RelativeLayout start_layout; private RelativeLayout end_layout; private TextView tv_start_time,tv_start_tip; private TextView tv_end_time,tv_end_tip; private SharedPreferences sp; SharedPreferences.Editor editor;
接着,就是从布局文件中找到相应的控件,并绑定监听器
sp = this.getSharedPreferences("setting",Activity.MODE_PRIVATE); editor = sp.edit(); start_layout = (RelativeLayout)findViewById(R.id.start_layout); start_layout.setOnClickListener(new ClickEvent()); start_layout.setClickable(false); end_layout = (RelativeLayout)findViewById(R.id.end_layout); end_layout.setOnClickListener(new ClickEvent()); end_layout.setClickable(false); tv_start_time =(TextView)findViewById(R.id.tv_start_time); tv_end_time = (TextView)findViewById(R.id.tv_end_time); tv_start_tip = (TextView)findViewById(R.id.tv_start_tip); tv_end_tip = (TextView)findViewById(R.id.tv_end_tip); tb_switch = (ToggleButton)findViewById(R.id.tb_switch); tb_whiteList = (ToggleButton)findViewById(R.id.tb_whitelist); tb_time = (ToggleButton)findViewById(R.id.tb_time);
tb_switch.setOnCheckedChangeListener(new ToggleButtonCheckedEvent());<br abp="830" /> tb_whiteList.setOnCheckedChangeListener(new ToggleButtonCheckedEvent());<br abp="831" /> tb_time.setOnCheckedChangeListener(new ToggleButtonCheckedEvent());
其中,sp = this.getSharedPreferences("setting",Activity.MODE_PRIVATE);这个可以将简单的设置信息保存到文件,注意这里是对两个relativeLayout添加单击事件,这样,就可以通过点击设置界面中的两个时间段选择行,就可以弹出相应的日期时间选择对话框。
附: SharedPreferences的用法:
1. 得到SharedPreferences对象:SharedPreferences sp = this.getSharedPreferences("setting",Activity.MODE_PRIVATE);后面的参数,表示模式,表示共享的范围,可以查看具体文档。
2. 存入数据:SharedPreferences.Editor editor = sp.edit();
editor.putBoolean("isStartListen",true);
editor.commit();//提交数据,这样数据就保存到setting.xml文件中了
3. 取出数据:boolean data = http://www.mamicode.com/sp.getBoolean("isStartListen", false),其中第二个参数false是默认值,也就是如果文件中不存在该key,就返回false。
在监听器中实现想要的功能了,如下:
//ToggleButton开关监听器 class ToggleButtonCheckedEvent implements OnCheckedChangeListener{ @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if(buttonView.getId() == R.id.tb_switch){ tb_switch.setChecked(isChecked); if(isChecked){ editor.putBoolean("isStartListen",true); editor.commit(); tb_switch.setBackgroundResource(R.drawable.start_service_on); Toast.makeText(SettingActivity.this, "开启拦截服务", 1000 ).show(); } else{ editor.putBoolean("isStartListen",false); editor.commit(); tb_switch.setBackgroundResource(R.drawable.start_service_off); Toast.makeText(SettingActivity.this, "关闭拦截服务", 1000 ).show(); } } else if(buttonView.getId() == R.id.tb_whitelist){ tb_whiteList.setChecked(isChecked); if(isChecked){ editor.putBoolean("isWhiteList",true); tb_whiteList.setBackgroundResource(R.drawable.start_service_on); Toast.makeText(SettingActivity.this, "白名单模式", 1000 ).show(); } else{ editor.putBoolean("isWhiteList", false); tb_whiteList.setBackgroundResource(R.drawable.start_service_off); Toast.makeText(SettingActivity.this, "黑名单模式", 1000 ).show(); } editor.commit(); } else if(buttonView.getId() == R.id.tb_time){ tb_time.setChecked(isChecked); if(isChecked){ tb_time.setBackgroundResource(R.drawable.start_service_on); start_layout.setClickable(true); end_layout.setClickable(true); tv_start_tip.setTextColor(Color.BLACK); tv_start_time.setTextColor(Color.BLACK); tv_end_tip.setTextColor(Color.BLACK); tv_end_time.setTextColor(Color.BLACK); editor.putBoolean("isTime", true); Toast.makeText(SettingActivity.this, "启用定时拦截,请设置开始时间和结束时间", 1000 ).show(); String[] time = getCurrentTime(); tv_start_time.setText(time[0]); tv_end_time.setText(time[1]); editor.putString("startTime", time[0]); editor.putString("endTime", time[1]); } else{ tb_time.setBackgroundResource(R.drawable.start_service_off); tv_start_tip.setTextColor(Color.GRAY); tv_start_time.setTextColor(Color.GRAY); tv_end_tip.setTextColor(Color.GRAY); tv_end_time.setTextColor(Color.GRAY); start_layout.setClickable(false); end_layout.setClickable(false); editor.putBoolean("isTime", false); Toast.makeText(SettingActivity.this, "关闭定时拦截", 1000).show(); String[] time = getCurrentTime(); tv_start_time.setText(time[0]); tv_end_time.setText(time[1]); } editor.commit(); } } }
可以看出,监听器中还有其他两个ToggleButton需要实现的功能,当然了,因为目前还没有通过service实现电话拦截的功能,所以,在之后实现拦截功能时,会在相应的地方添加代码,这里只实现将设置的信息保存。
下面就实现选择日期与时间功能,并将其保存。
依然是监听器:
class ClickEvent implements OnClickListener{ @Override public void onClick(View v) { Context mContext = SettingActivity.this; AlertDialog.Builder builder = new AlertDialog.Builder(mContext); View view = View.inflate(mContext, R.layout.data_time_dialog, null); final DatePicker datePicker = (DatePicker)view.findViewById(R.id.data_picker); final TimePicker timePicker = (TimePicker)view.findViewById(R.id.time_picker); builder.setView(view); //获取当前日期 Calendar cal = Calendar.getInstance(); cal.setTimeInMillis(System.currentTimeMillis()); //将日期选择器设置为当前日期 datePicker.init(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH),null); //将时间选择器设置为当前时间 timePicker.setIs24HourView(true); timePicker.setCurrentHour(cal.get(Calendar.HOUR_OF_DAY)); timePicker.setCurrentMinute(cal.get(Calendar.MINUTE)); if(v.getId() == start_layout.getId()){ builder.setTitle("选择起始监听时间"); builder.setPositiveButton("确定 ", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { StringBuffer sb = new StringBuffer(); //取出选择的时间,并格式化 sb.append(String.format("%02d-%02d", datePicker.getMonth()+1,datePicker.getDayOfMonth())); //将日期与时间用空格分开 sb.append(" "); sb.append(String.format("%02d:%02d", timePicker.getCurrentHour(),timePicker.getCurrentMinute())); //将选择好的日期日间显示 tv_start_time.setText(sb); //将时间保存到sharedPreference editor.putString("startTime", sb.toString()); editor.commit(); showTimeErrorTip(); dialog.cancel(); } }); } else if(v.getId() == end_layout.getId()){ builder.setTitle("选择结束监听时间"); builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { StringBuffer sb = new StringBuffer(); //取出选择的时间,并格式化 sb.append(String.format("%02d-%02d", datePicker.getMonth()+1,datePicker.getDayOfMonth())); //将日期与时间用空格分开 sb.append(" "); sb.append(String.format("%02d:%02d", timePicker.getCurrentHour(),timePicker.getCurrentMinute())); //将选择好的日期日间显示 tv_end_time.setText(sb); editor.putString("endTime", sb.toString()); editor.commit(); showTimeErrorTip(); dialog.cancel(); } }); } //创建对话框,并显示 Dialog dialog = builder.create(); dialog.show(); } }
//刷新存储时间,判断开始时间与结束时间大小 public void showTimeErrorTip(){ //如果时间合法,则不提示,否则提示 if(sp.getString("startTime", "").compareTo(sp.getString("endTime", "")) > 0){ Toast.makeText(SettingActivity.this, "结束时间必须大于开始时间", 1000).show(); } }
弹出的日期时间选择界面的布局文件如下:
data_time_dialog.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:singleLine="true" android:text="选择日期" android:textSize="15sp" /> <DatePicker android:id="@+id/data_picker" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:singleLine="true" android:text="选择时间 " android:textSize="15sp" /> <TimePicker android:id="@+id/time_picker" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
至此,已实现了选择日期时间,并将相关的设置信息写入文件的功能。
android项目 之 来电管家(4) ----- 添加拦截时间段