因为我们用的是SharedPreferences来存储用户设置信息,那么在初次进入来电管家时,会有一些默认的设置,后续根据用户的设置,更新设置信息文件的内容。
打开应用程序,首先启动的是ActivityGroupDemo,并默认显示黑名单界面,这时,需要在ActivityGroupDemo.java中添加代码,判断用户是否是第一次进入该应用,如果是第一次,则写入默认的设置信息。
这里判断用户是否为第一次进入该应用程序,采用的思路为:
1)因为SharedPreferences会在应用程序目录下的shared_prefs/文件夹下生成文件。
2)每次启用程序时,判断该生成文件是否存在,如果不存在,则表示用户是第一次进入
3) 写入相关的默认设置信息
在ActivityGroupDemo里添加:
private SharedPreferences spf;
spf = this.getSharedPreferences("setting", Activity.MODE_PRIVATE); SharedPreferences.Editor editor = spf.edit(); //取出当前应用文件路径 String path = this.getFilesDir().toString(); //找到shared_prefs/setting.xml path = path.substring(0, path.lastIndexOf("/")+1); path += "shared_prefs/setting.xml"; //利用文件是否存在,判断程序是否为第一次启动,如果是第一次启动,则写入默认值 File file = new File(path); if(!file.exists()){ //将数据放入sharedPreferences中 //默认启用监听 editor.putBoolean("isStartListen", false); //默认是白名单模式 editor.putBoolean("isWhiteList", false); //默认不启用时间段 editor.putBoolean("isTime", false); editor.putString("startTime", null); editor.putString("endTime", null); //提交当前设置数据 editor.commit(); }
通过上述几行代码,即可判断用户是否是第一次进入应用程序。
试想一下,如果不保存用户的设置信息,那么下次用户进入程序进,打开设置界面,显示的肯定是程序内定义的默认设置,而不是用户上次在应用中的设置,为了实现程序的设置会随着用户设置的不同而变化,就需要在每次进入设置界面时,读取用户的上次的设置信息,并将设置信息配置在设置界面中。
主要思路:
1. 在设置界面Activity的oncreate方法里实现读取用户设置信息文件
2. 将读取到的用户设置信息文件加载到设置界面中
在SettingActivity.java中添加如下代码:
protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.activity_setting); …… loadSetting(); } //读取设置信息,并加载到设置界面中 public void loadSetting(){ //取出设置数据,设置相应的按钮开关 loadSettingImage(tb_switch,sp.getBoolean("isStartListen", false)); loadSettingImage(tb_whiteList,sp.getBoolean("isWhiteList", false)); loadSettingImage(tb_time,sp.getBoolean("isTime", false)); tb_switch.setOnCheckedChangeListener(new ToggleButtonCheckedEvent()); tb_whiteList.setOnCheckedChangeListener(new ToggleButtonCheckedEvent()); tb_time.setOnCheckedChangeListener(new ToggleButtonCheckedEvent()); } //根据设置信息配置控件显示 public void loadSettingImage(View v,boolean isChecked){ switch(v.getId()){ case R.id.tb_switch : tb_switch.setChecked(isChecked); if(isChecked){ tb_switch.setBackgroundResource(R.drawable.start_service_on); getApplicationContext().startService(intent); } else tb_switch.setBackgroundResource(R.drawable.start_service_off); break; case R.id.tb_whitelist : tb_whiteList.setChecked(isChecked); if(isChecked) tb_whiteList.setBackgroundResource(R.drawable.start_service_on); else tb_whiteList.setBackgroundResource(R.drawable.start_service_off); break; case 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); tv_start_time.setText(sp.getString("startTime", "")); tv_end_time.setText(sp.getString("endTime", "")); } 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); String[] time = getCurrentTime(); tv_start_time.setText(time[0]); tv_end_time.setText(time[1]); } break; } }
这样,应用的设置信息就会随着用户的设置而变化。
上一节已实现了电话的按规则拦截功能,那么什么时候开始拦截,又什么时候停止拦截呢。在设置界面的第一项,启用拦截,看到了吧,就在这里启用与关闭服务。
要启动一个服务,当然要用到了Intent了,并且还得设置Intent的action了,在SettingActivity.java的oncreate函数中添加:
Intent intent;
intent = new Intent("com.example.callmanager.ListenService");
当启用监听时,也就是ToggleButton呈选中状态时,启动该服务,添加如下代码:
//启用服务 getApplicationContext().startService(intent);
当关闭监听时,也就是ToggleButton呈未选中状态时,停止该服务,添加如下代码:
//关闭服务 getApplicationContext().stopService(intent);
至此,就实现了用加载用户设置并启用监听服务