android项目 之 来电管家(7) ----- 加载用户设置并启监听用服务

因为我们用的是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);

至此,就实现了用加载用户设置并启用监听服务

时间: 2024-10-05 06:16:24

android项目 之 来电管家(7) ----- 加载用户设置并启监听用服务的相关文章

android项目 之 来电管家(5) ----- 添加监听服务

上面四节,已经实现了界面设计,黑名单(白名单的添加与删除与黑名单同理,不再赘述),启用监听开关,定时拦截开关,及拦截模式选择等功能,下面就要实现来电管家最核心的功能,也就是拦截功能.   主要思路: 1.  制定拦截模式,这里主要有两个,一个是黑名单模式,也就是只拦截在黑名单中的号码:另一个就是白名单模式,拦截除了白名单以外的号码. 2.  根据用户自定义设置信息,制定正则表达式,判断拦截的标准. 3.  使用对应的类实现挂断电话的功能. 监听模块主要是利用service实现功能,为了实现电话挂

android项目 之 来电管家(1) ----- 界面设计

因为需要,最近几天忙着写来电管家这个小软件,现在已经基本写的差不多了,基本的功能也都已实现,就剩下后续的完善了,而之前的记事本项目最近几天没写,但是肯定还是会完成的. 来电管家的基本功能,这里主要做的是拦截. 1.    添加黑白名单 2.    选择拦截模式 3.    启用拦截时间段 4.    拦截开关 主要功能,就是通过用户选择开启拦截,并选择拦截模式,这时就会启动后台监听服务,监听来电,判断是否挂断,并且,用户可以自由选择拦截时间段,也就是在该时间段内才启用监听服务. 先来看界面:  

android项目 之 来电管家(8) ----- 添加开机自启动监听服务

现在大多数的应用都会开机自启动,来电管家更是如此,添加了开机自启动监听服务后,开机后即使你没有打开来电管家应用程序,一样可以拦截来电信息. 开机自启动Activity或Service的方法: 主要步骤: 1.  要有开机要启动的service或activity(这里开机要启动的当然就是ListenService了) 2. 编写一个BroadcastReceiver用以捕获ACTION_BOOT_COMPLETED这条广播,并在捕获之后启动我们要启动的Activity或service. BootC

android项目 之 来电管家(2) ----- ListView+CheckBox的使用

上一节,已经完成了来电管家的界面设计,那么下面就要实现具体的功能了,如何将添加的黑白名单显示呢?这里用到了ListView,那么,如果需要删除黑白名单呢,是一个个长按弹出菜单删除,还是将所的黑白名单清空呢,这都不符合用户的需求,往往,都是删除多个,这就有个问题了,如何在ListView中删除指定的多个item呢??可能大家想到了,要用到CheckBox. 先看图: 可以看出,当处于删除模式时,底部按钮也变成了删除与返回,中间也显示了当前共选择了多少项,而且在ListView的每一个Item右边也

android项目 之 来电管家(4) ----- 添加拦截时间段

在大多数的骚扰拦截类的软件中都会有定时拦截这个实用的的功能,其实,也不难实现. 看图: 在未选中启用时间段时,下面的两个开始时间和结束时间呈灰色状态,并且单击无响应,启用时间段后,下面则变成了可以单击的状态,通过单击可以弹出选择日期与时间的对话框,用于选择开始时间和结束时间. 主要思路: 1.  启用时间段,将下面的控件变成可获得焦点状态 2.  添加单击事件,弹出日期时间选择对话框 3.  选择时间,并显示在相应的位置 4.  通过SharedPrefresence将相关设置保存,以便下次启动

JavaWeb服务启动时,在后台启动加载一个线程进行Socket监听端口

最近,做一个项目,需要做一个web服务器,该服务器要与Android端和GPRS模块互相通信.考虑Android端与服务器端用Http通信,GPRS模块与服务器用Tcp通信.因此需要在Web服务器启动的时候启动加载一个线程负责Tcp端口的监听. search了一些方法,从中挑选了两个在此记录一下: 方法一:监听(Listener) 我们创建一个监听类,继承自ServletContextListener,代码如下: 1 package will; 2 3 4 import java.io.IOEx

ListView异步加载 LruCache缓存 滑动状态监听

Android异步加载的总结.除了LruCache,我们还可以使用DiskLruCache这个第三方的类来实现"二级缓存".异步加载不仅仅是获取网络资源,我们可以加所有耗时的操作都看成异步加载,所有通过耗时的操作获取的结果我们都可以通过缓存来提高效率,比如我们可以利用这里的LruCache和DiskLruCache(这个缓存一般是用于缓存从网络获取的图片,视频等大的资源,这个时候我们一般和LruCache结合使用),使用Cache有个缺点,就是我们不能保证我们的数据是实时的,所以在re

Fragment中加载网页(WebView)监听Back键 ,实现返回上一页的功能

首先创建一个抽象类BackHandledFragment,该类有一个抽象方法onBackPressed(),所有BackHandledFragment的子类在onBackPressed方法中处理各自对Back事件的消费逻辑.onBackPressed返回布尔值,宿主Activity将会根据该方法的返回值判断子Fragment是否有消费Back事件.此外,宿主FragmentActivity还会保持一份当前Fragment的引用,当用户按下Back键时,宿主Activity会判断当前Fragmen

Android项目中使用自定义进度加载Dialog

转载: http://www.androidchina.net/2297.html 1.首先定义动画 <?xml version="1.0" encoding="utf-8"?> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:fromDegrees="0" android:toDegrees="3