Android手机智能模式设置文档格式.docx
《Android手机智能模式设置文档格式.docx》由会员分享,可在线阅读,更多相关《Android手机智能模式设置文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
如果根本就没有关于位置的情景模式,就不执行位置情景模式。
3.6模式管理模块
添加情景模式:
在点击添加后,将显示一个设定模式的界面,其主要包括要设定的模式名称、是设定时间模式还是地点的模式、设定的时间或者地点、设定模式的功能。
设定完后点击保存,这些信息就会被保存在文件中。
删除:
在显示界面上通过点击某一个模式,会弹出一个对话框,点击确定就可以删除文件中的数据,再通过从新显示已有模式,使在显示界面中也删除,从而达到彻底删除情景模式。
第四章软件详细设计
智能情景模式是为了在时间或地点不同的条件下实现不同的情景模式功能的。
为实现这些功能,我定义了五个源文件,分别是mainactivity.java、broad.java、myservice.Java、wifibroad.java、rukou.java这5个不同的文件组成。
并且定义了3个布局文件,分别是主界面显示的布局、在listview显示模式信息的布局和添加功能的布局。
4.1程序初始化显示模式
对已经设置好的模式,我是利用ListView进行显示。
首先是将全部数据从文件中读取出来,并放在一个数组里。
再利用length()函数获取数组里面数据的组数,根据每一个模式里面数据放几组,从而算出模式的多少,从而设定listview中item的行数。
对于模式信息在一个item中显示,是在listview中在定义一个布局文件,有几条显示信息定义几个textview控件,在将一个item中控件与一个模式信息进行绑定,就可以显示一个了。
在利用循环将所有的都可以显示。
初始化功能的实现方法如下:
publicvoidchushihua()
{
String[]rs=getarray(),d=null;
inty=rs.length;
ArrayList<
HashMap<
String,Object>
>
listItem=newArrayList<
();
/*定义一个动态数组*/
if(y>
1)for(inti=0;
i<
y;
i++)/*在数组中存放数据*/
{
HashMap<
String,Object>
map=newHashMap<
map.put("
name"
rs[i]);
times"
rs[++i]+"
:
"
+rs[++i]);
i=i+1;
if(Integer.parseInt(rs[i])==1)d="
铃声和震动"
;
if(Integer.parseInt(rs[i])==2)d="
铃声"
if(Integer.parseInt(rs[i])==3)d="
震动"
if(Integer.parseInt(rs[i])==4)d="
静音"
gongneng"
d);
listItem.add(map);
}
SimpleAdaptermSimpleAdapter=newSimpleAdapter(this,listItem,R.layout.
listview,newString[]{"
"
"
},newint[]{R.id.name,R.id.
times,R.id.gongneng});
lv.setAdapter(mSimpleAdapter)}
4.2实现各种模式的方法
软件是为实现不同情景模式,所以要先定义出不同的功能。
在程序中,当软件要运行某一个情景功能时,我是通过广播发送一个intent参数,并定义一个广播接收端broad.Java进行接收。
在broad里面包含各种情景模式的方法,一旦接收到参数,广播这一程序就进行运行,对参数进行判断,再执行相应的方法,从而实现不同的模式。
下面是对接收的参数进行判断,实现调用方法。
switch(checkedId){
caseR.id.ring_and_vibrate:
ringAndVibrate(audio);
break;
caseR.id.vibrate:
vibrate(audio);
caseR.id.silent:
silent(audio);
default:
ring(audio);
}
实现各种情景模式功能的方法如下:
(1)铃声和震动:
protectedstaticvoidringAndVibrate(AudioManageraudio){
audio.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
audio.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER,AudioManager.VIBRATE_SETTING_ON);
audio.setVibrateSetting(AudioManager.VIBRATE_TYPE_NOTIFICATION,AudioManager.VIBRATE_SETTING_ON);
(2)铃声:
protectedstaticvoidring(AudioManageraudio){
audio.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER,AudioManager.VIBRATE_SETTING_OFF);
audio.setVibrateSetting(AudioManager.VIBRATE_TYPE_NOTIFICATION,AudioManager.VIBRATE_SETTING_OFF);
}
(3)震动:
protectedstaticvoidvibrate(AudioManageraudio){
audio.setRingerMode(AudioManager.RINGER_MODE_VIBRATE);
audio.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER,
AudioManager.VIBRATE_SETTING_ON);
(4)静音:
protectedstaticvoidsilent(AudioManageraudio){
audio.setRingerMode(AudioManager.RINGER_MODE_SILENT);
audio.setVibrateSetting(AudioManager.VIBRATE_TYPE_NOTIFICATION,}
4.3定时情景模式的实现
由于手机实现模式功能,是利用接收广播的方式,在广播里面进行的,所以我要做的时定时的发送我要的情景模式功能参数。
下面是在一个情景模式下,如何实现定时发送广播的一个方法。
首先是接收一个表示第几个模式的参数,使这个方法可以知道应该获取哪个模式的数据。
然后是判断这个模式要运行的模式功能,从而确定intent要赋的值。
再利用pendingIntent和AlamManage实现定时发送的。
广播在接收到后在执行相应的操作。
实现设置多模式定时功能的方法如下:
protectedvoidgongneng(inti){
String[]rs=getarray();
Intentintent=newIntent(broad.SILENT_CHANGED);
if(Integer.parseInt(rs[4*i+3])==1)
intent.putExtra("
checkedId"
R.id.ring_and_vibrate);
elseif(Integer.parseInt(rs[4*i+3])==2)
R.id.ring);
elseif(Integer.parseInt(rs[4*i+3])==3)
R.id.vibrate);
else
intent.putExtra("
R.id.silent);
PendingIntentalarmIntent=PendingIntent.getBroadcast(this,i,intent,0);
alarms.set(AlarmManager.RTC_WAKEUP,getTime(i),alarmIntent);
/}
多个模式是利用循环方法,将所有的有关时间的模式都设定为定时,实现方法如下:
String[]rs=getarray();
1)
for(inti=0;
y/4;
i++)
if(rs[i+1]!
="
WiFi名"
)
gongneng(i);
4.4定位情景模式的实现
在软件中,实现定位功能是通过WiFi进行的,因为GPS在室内会有没信号的情况,而且这里的位置是一个范围,并不是一个点。
而WiFi定位,是通过只要手机连接的WiFi是同一个,在此期间,不管手机是移动位置发生变化还是固定,都默认地点
在同一位置,适用这一情况。
因为是通过WiFi进行定位,因而只有在连接WiFi时才会启动着一功能。
所以需要程序在程序在WiFiWiFi后自动进行判断,当前位置是否设定了情景模式。
所以在程序里,我定义了一个广播接收器WiFibroad.java,他是用来接收手机系统在连接WiFi后,自动发出的广播。
判断了是连接时,再从广播里面启动一个服务。
实现WiFi连接后,启动服务的方法如下:
publicclassWiFibroadextendsBroadcastReceiver{
AlarmManageralarms;
@Override
publicvoidonReceive(Contextcontext,Intentintent){
if(WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(intent.getAction())){
ParcelableparcelableExtra
=intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
if(null!
=parcelableExtra){
NetworkInfonetworkInfo=(NetworkInfo)parcelableExtra;
Statestate=networkInfo.getState();
booleanisConnected=state==State.CONNECTED;
if(isConnected)
{IntentserviceIntent=newIntent(context,myservice.class);
context.startService(serviceIntent);
}
在广播里面的这个服务myservice.Java也是我自己定义的,其里面是WiFi连接后再执行一些操作。
与关于时间的情景模式的操作类似,首先从文件取出数据,并分成数组的形式保存在数组里面,并通过length()方法获取数组总的组数,在通过每一模式数据占几个数组算出有几个模式。
然后利用循环,从第一个开始判断哪些是关于地点的情景模式,如果是,在进行地点的判断。
这里地点用所连接的WiFi名称表示。
名称一致,表示是同一个地点,如果不一致就不是就进行下一个,进行判断。
直至全部完成。
如果全部结束都没有,就结束,到连接另外一个WiFi时在重新开始。
证明是同一地点后,对所要启动的功能进行判断,以确定要发送的intent的值是什么。
实现定时发送参数的方法如下:
for(inti=0;
if(rs[i+2]==info.getSSID())
{Intentintent=newIntent(broad.SILENT_CHANGED);
if(Integer.parseInt(rs[4*i+3])==1)
intent.putExtra("
elseif(Integer.parseInt(rs[4*i+3])==2)
elseif(Integer.parseInt(rs[4*i+3])==3)
else
alarms.set(AlarmManager.RTC_WAKEUP,0,alarmIntent);
地点情景模式与实间不同的是,在同一点,不同时间都是一个确定的模式,是不会变的,故而只有地点即所连接的WiFi变后才会发生变化。
而时间模式只有在确定地点模式不会启动的情况下才会进行启动。
4.5数据的保存与读取
(1)保存
时间情景模式的数据是由4部分组成,分别为模式名称、小时、分钟、和功能。
在数据保存时采用的是保存时按顺序一个一个的进行。
没存完一个进行换行,再进行,直至结束。
实现保存数据的方法如下:
publicvoidwrite(Stringwritestr){
Filefile=newFile("
lzu.txt"
);
if(!
file.exists())
try{
file.createNewFile();
}catch(IOExceptione1){
//TODO自动生成的catch块
e1.printStackTrace();
}
try{
FileOutputStreamfout=openFileOutput("
MODE_APPEND);
writestr=writestr+"
\n"
byte[]bytes=writestr.getBytes();
fout.write(bytes);
fout.close();
}
catch(Exceptione){
e.printStackTrace();
}
(2)读取
在读取时是先找到数据保存文件,再打开,将全部的数据一次性取出。
然后在对它进行按行切割,再存在一个数组里面,要用的时候,从数组里面获取。
实现获取数据的方法如下:
publicStringread(Stringres)throwsIOException{
try{FileInputStreamfin=openFileInput("
intlength=fin.available();
byte[]buffer=newbyte[length];
fin.read(buffer);
res=EncodingUtils.getString(buffer,"
UTF-8"
fin.close();
}
returnres;
对数据切割存放在数组的方法如下:
publicString[]getarray(){
try{x=read(x);
}catch(IOExceptione){
e.printStackTrace();
Stringpattern="
Patternpat=Ppile(pattern);
String[]rs=pat.split(x);
returnrs;
(3)删除:
在点击模式的某一项后,会弹出一个对话框,让我们选择是否删除,如果点击确定就会删除。
删除是,会传送一个参数到删除方法中,即是第几个模式。
删除时通过打开文件,按找接收的参数确定所要删除文件的数据在文件中的开始位置,再将后面四个数据删除,达到文件数据删除,再返回mainactivity。
因为模式的显示又要从找文件中读取从新开始显示,而在文件中已经删除,所以显示时已删除的消失了,又达到显示效果的删除。
第五章总结
5.1设计过程中的问题
(1)下载了jdk1.8.0,在配置jdk环境时出现问题,使得Java无法使用。
解决方法:
针对以上问题,通XX查询,对环境变量path和JAVA_HOME进行了重新设置了。
(2)设计过程中,有时候在调用ID是会碰见已经定义的控件或值没有ID或者提示错误。
出现这种现象主要俩个方面:
1、对新定义的string值没有进行保存,故而没有在R.Java里面显示出来,无法使用。
2、在程序里面存在错误,eclipse无法对程序进行编译,故而无法对相应的控件在R.Java里面生成ID,所以使用这些ID会提示错误。
(3)Android中数据的保存和读取,数据只能保存一个模式的,再添加会把前面的数据覆盖,无法做到添加的目的。
在查找相关资料后用openFileOutput的方法对数据进行文件保存,并且每保存一个数据进行换行,从下一行开始进行保存。
而在读取时是一次性去不取出,然后在对它进行按行切割,在存在一个数组里面,要用的时候,从数组里面获取。
(4)在设计过程中,需用用到多种不同的情景模式同时设定AlamManenge,并且不会相互影响,相互覆盖。
在网上查找了许多资料,并看了许多博客后,知道要设定同时设定多个alammanangeset(inttype,longstartTime,PendingIntentalarm-
Intent);
中最后面那个参数PendingIntentalarmIntent不能相同,而PendingIntentalarmIntent=PendingIntent.getBroadcast(Context,
int,Intent,int)。
所以循环设定时,我将不同模式定时发送参数alarmIntent里面的第二个int设定为模式的排号,即第几个模式。
这样就解决了这一难题,使定时不会相互覆盖了。
(6)在mainactivity.java里发送广播后,广播接收端broad.java不执行。
经过查找有关广播的知识后,认真检查发现。
发送的intent没有帮上滤波器,故而广播接收端无法接收。
所以改为Intentintent=newIntent(Broad.
SILENT_CHANGED)后,发送广播,广播接收器有执行了。
5.2软件测试
电脑连接手机,运行程序,将其安装在手机上,软件的运行,刚开始没有设定模式时其效果图为5.1。
在添加情景模式时点击添加会跳到添加界面,如图5.2.在这界面上可以添加模式的名称、选择是使用时间的还是WiFi定位的,还有情景模式的功能。
在点击保存后,可以将这个模式保存起来。
图5.1图5.2
模式再保存后,会返回,并且在主界面显示已经设定好的模式,如图5.3。
时间一到,他就自动将模式调为震动了。
设定多个模式时,会一一在主届面显示出来,如图5.4。
而且是将所有的模式,不管是关于时间的还是WiFi定位。
图5.3图5.4
5.3测试结果及分析
经过在手机进行实际运行测试,软件基本满足开始设计时的功能要求,可以实现智能时间