android:
layout_width="fill_parent"
android:
layout_height="fill_parent"
android:
id="@+id/itemlist"/>
1.2.2查看系统信息实现
当在运行的主界面单击第一行时,也就是“系统信息”这一行,将执行代码如下:
1case0:
2 intent.setClass(eoeInfosAssistant.this,System.class);
3 startActivity(intent);
4 break;
代码运行后将显示系统(System)这个界面,这就是查看系统信息的主界面,其和主界面差不多,也就是列表显示几个需要查看的系统信息
1.2.2.1操作系统版本
单击图9所示(无图)的界面第一行“操作系统版本”项,则会打开一个新的界面,其对应的是ShowInfo.java文件,然后需要显示该设备的操作系统版本信息,而这个信息在/proc/version中有,可以直接调用。
在可行性分析中给出的CMDExencute类来调用系统的cat命令获取该文件的内容,实现代码如下:
1publicstaticStringfetch_version_info(){
2Stringresult=null;
3CMDExecutecmdexe=newCMDExecute();
4try{
5String[]args={"/system/bin/cat","/proc/version"};
6result=cmdexe.run(args,"system/bin/");
7}catch(IOExceptionex){
8ex.printStackTrace();
9}
10returnresult;
11}
上述代码使用的是CMDExecute类,调用系统的“"/system/bin/cat"”工具,获取“"/proc/version"”中内容。
其运行效果如图9。
从图中显示的查寻结果可以看到,这个设备的系统版本是Linuxversion2.6.25-018430-gfea26b0。
1.2.2.2系统信息
在Android中,想要获取系统信息,可以调用其提供的方法System.getProperty(propertyStr),而系统信息诸如用户根目录(user.home)等都可以通过这个方法获取,实现代码如下:
1publicstaticStringBufferbuffer=null;
2
3 privatestaticStringinitProperty(Stringdescription,StringpropertyStr){
4if(buffer==null){
5buffer=newStringBuffer();
6}
7buffer.append(description).append(":
");
8buffer.append(System.getProperty(propertyStr)).append("\n");
9returnbuffer.toString();
10}
11
12 privatestaticStringgetSystemProperty(){
13buffer=newStringBuffer();
14initProperty("java.vendor.url","java.vendor.url");
15initProperty("java.class.path","java.class.path");
16...
17returnbuffer.toString();
18}
上述代码主要是通过调用系统提供的System.getProperty方法获取指定的系统信息,并合并成字符串返回。
1.2.2.3运营商信息
运营商信息中包含IMEI、手机号码等,在Android中提供了运营商管理类(TelephonyManager),可以通过TelephonyManager来获取运营商相关的信息,实现的关键代码如下:
1publicstaticStringfetch_tel_status(Contextcx){
2Stringresult=null;
3TelephonyManagertm=(TelephonyManager)cx.getSystemService(Context.TELEPHONY_SERVICE);
4Stringstr="";
5str+="DeviceId(IMEI)="+tm.getDeviceId()+"\n";
6str+="DeviceSoftwareVersion="+tm.getDeviceSoftwareVersion()+"\n";
7//TODO:
Dosomething...
8 intmcc=cx.getResources().getConfiguration().mcc;
9intmnc=cx.getResources().getConfiguration().mnc;
10str+="IMSIMCC(MobileCountryCode):
"+String.valueOf(mcc)+"\n";
11str+="IMSIMNC(MobileNetworkCode):
"+String.valueOf(mnc)+"\n";
12result=str;
13returnresult;
14}
在上述的代码中,首先调用系统的getSystemService(Context.TELEPHONY_SERVICE)方法获取一个TelephonyManager对象tm,进而调用其方法getDeviceId()获取DeviceId信息,调用getDeviceSoftwareVersion()获取设备的软件版本信息等。
1.2.3查看硬件信息
1.2.3.1获取CPU信息
可以在手机设备的/proc/cpuinfo中获取CPU信息,调用CMDEexecute执行系统的cat的命令,读取/proc/cpuinfo的内容,显示的就是其CPU信息,实现代码如下:
1publicstaticStringfetch_cpu_info(){
2Stringresult=null;
3CMDExecutecmdexe=newCMDExecute();
4try{
5String[]args={"/system/bin/cat","/proc/cpuinfo"};
6result=cmdexe.run(args,"/system/bin/");
7Log.i("result","result="+result);
8}catch(IOExceptionex){
9ex.printStackTrace();
10}
11returnresult;
12}
上述代码使用CMDExecute,调用系统中的"/system/bin/cat"命令查看"/proc/cpuinfo"中的内容,即可得到CPU信息。
1.2.3.2获取内存信息
获取内存信息的方法和获取CPU信息的实现差不多,可以读取/proc/meminfo信息,另外还可以通过getSystemService(Context.ACTIVIT_SERV-
ICE)获取ActivityManager.MemoryInfo对象,进而获取可用内存信息,主要代码如下:
ViewCode
1/**
2*系统内存情况查看
3*/
4 publicstaticStringgetMemoryInfo(Contextcontext){
5StringBuffermemoryInfo=newStringBuffer();
6
7finalActivityManageractivityManager=
8(ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
9ActivityManager.MemoryInfooutInfo=newActivityManager.MemoryInfo();
10activityManager.getMemoryInfo(outInfo);
11
12memoryInfo.append("\nTotalAvailableMemory:
").append(outInfo.availMem>>10).append("k");
13memoryInfo.append("\nTotalAvailableMemory:
").append(outInfo.availMem>>20).append("k");
14memoryInfo.append("\nInlowmemorysituation:
").append(outInfo.lowMemory);
15
16Stringresult=null;
17CMDExecutecmdexe=newCMDExecute();
18try{
19String[]args={"/system/bin/cat","/proc/meminfo"};
20result=cmdexe.run(args,"/system/bin/");
21}catch(IOExceptionex){
22Log.i("fetch_process_info","ex="+ex.toString());
23}
24return(memoryInfo.toString()+"\n\n"+result);
25}
上述代码中首先通过ActivityManager对象获取其可用的内存,然后通过查看“/proc/meminfo”内容获取更详细的信息。
1.2.3.3获取磁盘信息
手机设备的磁盘信息可以通过df命令获取,所以,这里获取磁盘信息的方法和前面类似,惟一不同的是,这个是直接执行命令,获取其命令的返回就可以了,关键代码如下:
//磁盘信息
publicstaticStringfetch_disk_info(){
Stringresult=null;
CMDExecutecmdexe=newCMDExecute();
try{
String[]args={"/system/bin/df"};
result=cmdexe.run(args,"/system/bin/");
Log.i("result","result="+result);
}catch(IOExceptionex){
ex.printStackTrace();
}
returnresult;
}
1.2.3.4获取网络信息
要获取手机设备的网络信息,只要读取/system/bin/netcfg中的信息就可以了,关键代码如下:
publicstaticStringfetch_netcfg_info(){
Stringresult=null;
CMDExecutecmdexe=newCMDExecute();
try{
String[]args={"/system/bin/netcfg"};
result=cmdexe.run(args,"/system/bin/");
}catch(IOExceptionex){
Log.i("fetch_process_info","ex="+ex.toString());
}
returnresult;
}
1.2.3.5获取显示频信息
除了显示手机的CPU、内存、磁盘信息外,还有个非常重要的硬件,显示频。
在Android中,它提供了DisplayMetrics类,可以通过getApplicationContext()、getResources()、getDisplayMetrics()初始化,进而读取其屏幕宽(widthPixels)、高(heightPixels)等信息,实现的关键代码如下:
ViewCode
1publicstaticStringgetDisplayMetrics(Contextcx){
2Stringstr="";
3DisplayMetricsdm=newDisplayMetrics();
4dm=cx.getApplicationContext().getResources().getDisplayMetrics();
5intscreenWidth=dm.widthPixels;
6intscreenHeight=dm.heightPixels;
7floatdensity=dm.density;
8floatxdpi=dm.xdpi;
9floatydpi=dm.ydpi;
10str+="Theabsolutewidth:
"+String.valueOf(screenWidth)+"pixels\n";
11str+="Theabsoluteheightin:
"+String.valueOf(screenHeight)+"pixels\n";
12str+="Thelogicaldensityofthedisplay.:
"+String.valueOf(density)+"\n";
13str+="Xdimension:
"+String.valueOf(xdpi)+"pixelsperinch\n";
14str+="Ydimension:
"+String.valueOf(ydpi)+"pixelsperinch\n";
15returnstr;
16}
1.2.4查看软件信息
在Android上,可以在手机上随便安装自己喜欢的应用软件,查看软件信息的功能就是收集并显示已经安装的应用软件信息。
Android提供了getPackageManager()、getInstalledApplications(0)方法,可以直接返回全部已经安装的应用列表。
这个功能就是只需要获取列表,再进行显示在列表中就可以了。
但是,如果安装的软件比较多,那么获取信息所花费的时间会比较多,为了更好地完善用户使用的体验,在获取列表时,需要在界面提示用户耐心等待,这就需要用到Android提供的另外一个功能Runnable。
引入Runnable比较简单,只需要在定义类的时候实现Runnable接口就可以了,所以,这里的软件信息查看界面对应的Software.java类声明代码如下:
publicclassSoftwareextendsActivityimplementsRunnable{
...
}
然后需要在这个Activity启动的时候,引入进度条ProgressDialog来显示一个提示界面,onCreate代码如下所示:
1publicvoidonCreate(Bundleicicle){
2Super.onCreate(icicle);
3setContentView(R.layout.softwares);
4setTitle("软件信息");
5itemlist=(ListView)findViewById(R.id.itemlist);
6pd=ProgressDialog.show(this,"请稍候..","正在收集你已经安装的软件信息...",true,false);
7Threadthread=newThread(this);
8thread.start();
9}
该方法创建了一个ProgressDialog,并设定其提示信息。
然后实现其线程的run()方法,该方法实现其真正执行的逻辑,实现代码如下:
@Override
Publicvoidrun(){
fetch_installed_apps();
handler.sendEmptyMessage(0);
}
上述代码调用自定义的fetch_installed_app()方法获取已经安装的应用信息,这个方法是比较消耗时间的,实现代码如下:
ViewCode
1publicArrayListfetch_installed_apps(){
2Listpackages=getPackageManager().getInstalledApplications(0);
3ArrayList>list=newArrayList>(packages.size());
4
5Iteratorl=packages.iterator();
6while(l.hasNext()){
7HashMapmap=newHashMap();
8ApplicationInfoapp=(ApplicationInfo)l.next();
9StringpackageName=app.packageName;
10Stringlabel="";
11try{
12label=getPackageManager().getApplicationLabel(app).toString();
13}catch(Exceptione){
14Log.i("Exception",e.toString()
15);
16}
17map=newHashMap();
18map.put("name",label);
19map.put("desc",packageName);
20list.add(map);
21}
22returnlist;
23}
上述代码使用getPackageManager().getInstalledApplications(0)获取已经安装的软件信息,进而构造用来显示的列表(List)对象,同时,界面通过进度条(ProgressDialog)显示提示信息,运行效果如图18所示。
当这个方法运行完成后,会调用handler.sendEmptyMessage(0)语句给handler发送一个通知消息,使其执行下面的动作,下面就是这个handler的实现方法:
privateHandlerhandler=newHandler(){
publicvoidhandleMessagemsg){
refreshListItems();
pd.d