北京总部

IOS开发系列-C语言之基础知识-中软国际教育

IOS开发系列-C语言之基础知识-中软国际教育

2017-02-21

当前移动开发的趋势已经势不可挡,这个系列希望浅谈一下个人对IOS开发的一些见解,这个IOS系列计划从几个角度去说IOS开发: ·        C语言 ·        OC基础 ·        IOS开发(iphone/ipad) ·        Swift 这么看下去还有大量的内容需要持续补充,但是今天我们从最基础的C语言开始,C语言部分我将分成几个章节去说,今天我们简单看一下C的一些基础知识,更高级的内容我将放到后面的文章中。 今天基础知识分为以下几点内容(注意:循环、条件语句在此不再赘述): 既然是IOS开发系列首先看一下在Mac OS X中的C的运行 打开Xcode 选择命令行程序 填写项目名称并选择使用C语言 选择保存目录 自动生成如下代码 OK,在Xcode上我们编写自己的程序如下 // //  main.c //  C语言基础 // //  Created by Kenshin Cui on 14-7-12. //  Copyright (c) 2014年 cmjstudio. All rights reserved. //   #include   void showMessage(){     printf("Hello,World! "); }   int main(int argc, const char * argv[]) {     showMessage();     return 0; } 在上面的程序中我们需要解释几点: main函数是程序入口,一个程序只能有一个main()函数,需要有一个整型返回值(事实上返回值int可以省略,但是这并不代表不返回值,而是默认为int;我们也可以在main()函数中不提供return,这是因为c语言语法要求不够严格); #include是预处理指令,用于包含指定文件(注意在编译前即处理),它实际做的工作就是把对应文件复制到指定的位置; 包含的内容可以是任何类型的文件,而不仅仅是.h文件; 上面的showMessage函数必须写在main()函数上面,如果写在下面则必须在main()函数之前声明; 注意:#include 包含文件时有两种方式:使用<>和””。区别就是<>包含只会查找编译器库函数文件,因此适用于包含库函数;而“”包含则首先查找程序当前目录,如果没有找到则查找库函数路径,因此适用于自定义文件; 运行过程 C语言的运行分为两大步:编译和链接 ·        编译:编译阶段会将对应的xxx.c源文件(ASCII格式)编译成目标文件xxx.obj,它是二进制格式(当然一般我们会有多个.c文件,也就会生成多个对应的.obj);在编译之前要进行预处理(例如#include指令),在编译的同时还要进行语法检查;生成的.obj文件并不能单独执行,因为各个.obj之间是有关联的,而且他们还各自引用了C语言库函数; ·        链接:链接的过程就是将各个.obj文件和C语言库函数一起组合生成一个可执行文件的过程; 扩展 在大型项目开发中程序中所有的代码都写到一个文件中是不现实的,我们通常将一个子操作分为两个文件:.c文件和.h文件。在.c文件中实现对应的函数,在.h中进行函数声明,这样只要在主函数上方包含对应的头文件就可以将子操作分离出来而且不用考虑顺序问题。例如改写“Hello World”的例子(注意message对应的.c和.h文件名完全可以不相同,但是出于规范的目的我们还是取相同的文件名): message.h // // Message.h // C语言基础 // // Created by Kenshin Cui on 14-7-12. // Copyright (c) 2014年 cmjstudio. All rights reserved. // void showMessage(); message.c // // Message.c // C语言基础 // // Created by Kenshin Cui on 14-7-12. // Copyright (c) 2014年 cmjstudio. All rights reserved. //   #include   void showMessage(){    printf("Hello,World!"); } main.c // // main.c // C语言基础 // // Created by Kenshin Cui on 14-7-12. // Copyright (c) 2014年 cmjstudio. All rights reserved. //   #include #include "Message.h"   int main(intargc, const char *argv[]) {    showMessage();     return 0; } 可以发现程序仍然可以正常运行,但是我们思考一个问题:如果我们不分成两个文件,直接在主函数文件中包含message.c是否也可以正常运行呢?答案是否定的,原因是由于编译生成的两个文件main.obj和 message.obj在链接时会发现main.obj中已经有message.obj中定义的showMessage函数,抛出“标示符重复”的错误。 了解更多IOS开发、C语言、OC基础、Swift等知识欢迎访问中软国际教育集团官网!

更多>
中软国际教育:关于Java内存管理的几个小技巧

中软国际教育:关于Java内存管理的几个小技巧

2017-02-21

这里将介绍几则Java内存管理的小技巧,让你让你从JAVA入门开始告别陋习,为Java程序提速。有不少人都说“Java完了,只等着衰亡吧!”,为什么呢?最简单的的例子就是Java做的系统时非常占内存!一听到这样的话,一定会有不少人站出来为Java辩护,并举出一堆的性能测试报告来证明这一点。其实从理论上来讲Java做的系统并不比其他语言开发出来的系统更占用内存,那么为什么却有这么多理由来证明它确实占内存呢?两个字,陋习。 1、用StringBuffer代替字符串相加。 这个我就不多讲了,因为已经被 人讲过N次了。我只想将一个不是笑话的笑话,我在看国内某“著名”java开发的WEB系统的源码中,竟然发现其中大量的使用字符串相加,一个拼装SQL 语句的方法中竟然最多构造了将近100个string实例。无语中! 2、别用new Integer。 和Boolean类似,java开发中使用Integer封装int的场合也非常 多,并且通常用int表示的数值通常都非常小。SUN SDK中对Integer的实例化进行了优化,Integer类缓存了-128到127这256个状态的Integer,如果使用 Integer.valueOf(int i),传入的int范围正好在此内,就返回静态实例。这样如果我们使用Integer.valueOf代替new Integer的话也将大大降低内存的占用。如果您的系统要在不同的SDK(比如IBM SDK)中使用的话,那么可以自己做了工具类封装一下,比如IntegerUtils.valueOf(),这样就可以在任何SDK中都可以使用这种特性。 3、别用new Boolean()。 在很多场景中Boolean类型是必须的,比如JDBC中boolean类型的set与get都是通过Boolean封装传递的,大部分ORM也是用Boolean来封装boolean类型的,比如: 以下是引用片段: ps.setBoolean(“isClosed”,new Boolean(true)); ps.setBoolean(“isClosed”,new Boolean(isClosed)); ps.setBoolean(“isClosed”,new Boolean(i==3)); 通常这些系统中构造的Boolean实例的个数是相当多的,所以系统中充满了大量Boolean实例小对象,这是相当消耗内存的。Boolean类实际上只要两个实例就够了,一个true的实例,一个false的实例。 Boolean类提供两了个静态变量: 以下是引用片段: public static final Boolean TRUE = new Boolean(true); public static final Boolean FALSE = new Boolean(false); 因为valueOf的内部实现是:return (b ? TRUE : FALSE); 所以可以节省大量内存。相信如果Java规范直接把Boolean的构造函数规定成private,就再也不会出现这种情况了。 4、过滥使用哈希表 有一定开发经验的开发人员经常会使用hash表(hash 表在JDK中的一个实现就是HashMap)来缓存一些数据,从而提高系统的运行速度。比如使用HashMap缓存一些物料信息、人员信息等基础资料,这 在提高系统速度的同时也加大了系统的内存占用,特别是当缓存的资料比较多的时候。其实我们可以使用操作系统中的缓存的概念来解决这个问题,也就是给被缓存的分配一个一定大小的缓存容器,按照一定的算法淘汰不需要继续缓存的对象,这样一方面会因为进行了对象缓存而提高了系统的运行效率,同时由于缓存容器不是无限制扩大,从而也减少了系统的内存占用。现在有很多开源的缓存实现项目,比如ehcache、 oscache等,这些项目都实现了FIFO、MRU等常见的缓存算法。 5、避免过深的类层次结构和过深的方法调用。 因为这两者都是非常占用内存的(特别是方法调用更是堆栈空间的消耗大户)。 6、对频繁使用的对象采用对象池技术。 7、尽量避免使用static变量,类内私有常量可以用final来代替。 8、变量只有在用到它的时候才定义和实例化。 9、保证每个IO操作,connection及时关闭。         做好以上几点,确保Java入门养成良好编程习惯。  了解更多java入门知识欢迎访问中软国际教育集团技术知识库

更多>
中软国际教育:如何获取控件坐标?

中软国际教育:如何获取控件坐标?

2017-02-21

getLocationOnScreen ,计算该视图在全局坐标系中的x,y值,(注意这个值是要从屏幕顶端算起,也就是索包括了通知栏的高度)//获取在当前屏幕内的绝对坐标  getLocationInWindow ,计算该视图在它所在的widnow的坐标x,y值,//获取在整个窗口内的绝对坐标 (不是很理解= =、) getLeft , getTop, getBottom, getRight, 这一组是获取相对在它父亲里的坐标 如果在Activity的OnCreate()事件输出那些参数,是全为0,要等UI控件都加载完了才能获取到这些。 了解更多精彩内容欢迎登陆中软国际教育集团官网!

更多>
中软国际教育:Android方向技术问答

中软国际教育:Android方向技术问答

2017-02-20

1.请描述下Activity的生命周期。 必调用的三个方法:onCreate() -->onStart()-->onResume(),用AAA表示 (1)父Activity启动子Activity,子Actvity退出,父Activity调用顺序如下 AAA -->onFreeze() -->onPause() -->onStop() -->onRestart()-->onStart(),onResume()… (2)用户点击Home,Actvity调用顺序如下 AAA -->onFreeze() -->onPause() -->onStop() -- Maybe -->onDestroy()– Maybe (3)调用finish(), Activity调用顺序如下 AAA -->onPause() -->onStop() -->onDestroy() (4)在Activity上显示dialog,Activity调用顺序如下 AAA (5)在父Activity上显示透明的或非全屏的activity,Activity调用顺序如下 AAA -->onFreeze() -->onPause() (6)设备进入睡眠状态,Activity调用顺序如下 AAA -->onFreeze() -->onPause() 2.如果后台的Activity由于某原因被系统回收了,如何在被系统回收之前保存当前状态?onSaveInstanceState() 当你的程序中某一个Activity A在运行时,主动或被动地运行另一个新的Activity B,这个时候A会执行onSaveInstanceState()。B完成以后又会来找A,这个时候就有两种情况:一是A被回收,二是A没有被回收,被回收的A就要重新调用onCreate()方法,不同于直接启动的是这回onCreate()里是带上了参数savedInstanceState;而没被收回的就直接执行onResume(),跳过onCreate()了。 3. 如何将一个Activity设置成窗口的样式。 在AndroidManifest.xml 中定义Activity的地方一句话android:theme="@android:style/Theme.Dialog"或android:theme="@android:style/Theme.Translucent"就变成半透明的 4.如何退出Activity?如何安全退出已调用多个Activity的Application? 对于单一Activity的应用来说,退出很简单,直接finish()即可。当然,也可以用killProcess()和System.exit()这样的方法。但是,对于多Activity的应用来说,在打开多个Activity后,如果想在最后打开的Activity直接退出,上边的方法都是没有用的,因为上边的方法都是结束一个Activity而已。 现提供几个方法,供参考: 1、抛异常强制退出: 该方法通过抛异常,使程序ForceClose。 验证可以,但是,需要解决的问题是,如何使程序结束掉,而不弹出Force Close的窗口。 2、记录打开的Activity: 每打开一个Activity,就记录下来。在需要退出时,关闭每一个Activity即可。 3、发送特定广播: 在需要结束应用时,发送一个特定的广播,每个Activity收到广播后,关闭即可。 4、递归退出 在打开新的Activity时使用startActivityForResult,然后自己加标志,在onActivityResult中处理,递归关闭。 除了第一个,都是想办法把每一个Activity都结束掉,间接达到目的。 但是这样做同样不完美。 你会发现,如果自己的应用程序对每一个Activity都设置了nosensor,在两个Activity结束的间隙,sensor可能有效了。但至少,我们的目的达到了,而且没有影响用户使用。为了编程方便,最好定义一个Activity基类,处理这些共通问题。 5.    请介绍下Android中常用的五种布局。 FrameLayout(框架布局),LinearLayout(线性布局),AbsoluteLayout(绝对布局),RelativeLayout(相对布局),TableLayout(表格布局) 6.    请介绍下Android的数据存储方式。 一.SharedPreferences方式 二.文件存储方式 三.SQLite数据库方式 四.内容提供器(Content provider)方式 五. 网络存储方式 7.     请介绍下ContentProvider是如何实现数据共享的。 创建一个属于你自己的Content provider或者将你的数据添加到一个已经存在的Contentprovider中,前提是有相同数据类型并且有写入Content provider的权限。 8.    如何启用Service,如何停用Service。 Android中的service类似于windows中的service,service一般没有用户操作界面,它运行于系统中不容易被用户发觉,可以使用它开发如监控之类的程序。 步骤: 第一步:继承Service类 public class SMSService extends Service { } 第二步:在AndroidManifest.xml文件中的节点里对服务进行配置: 二。Context.startService()和Context.bindService 服务不能自己运行,需要通过调用Context.startService()或Context.bindService()方法启动服务。这两个方法都可 以启动Service,但是它们的使用场合有所不同。 1.使用startService()方法启用服务,调用者与服务之间没有关连,即使调用者退出了,服务仍然运行。 使用bindService()方法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止。 2.采用Context.startService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onStart()方法。如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,但会导致多次调用onStart()方法。 采用startService()方法启动的服务,只能调用Context.stopService()方法结束服务,服务结束时会调用onDestroy()方法。 3.采用Context.bindService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onBind()方法。这个时候调用者和服务绑定在一起,调用者退出了,系统就会先调用服务的onUnbind()方法,。接着调用onDestroy()方法。如果调用bindService()方法前服务已经被绑定,多次调用bindService()方法并不会导致多次创建服务及绑定(也就是说onCreate()和onBind()方法并不会被多次调用)。如果调用者希望与正在绑定的服务解除绑定,可以调用unbindService()方法,调用该方法也会导致系统调用服务的onUnbind()-->onDestroy()方法。 三、Service的生命周期 1.Service常用生命周期回调方法如下: onCreate() 该方法在服务被创建时调用,该方法只会被调用一次,无论调用多少次startService()或bindService()方法,服务也只被创建一次。onDestroy()该方法在服务被终止时调用。 2. Context.startService()启动Service有关的生命周期方法 onStart() 只有采用Context.startService()方法启动服务时才会回调该方法。该方法在服务开始运行时被调用。 多次调用startService()方法尽管不会多次创建服务,但onStart()方法会被多次调用。 3. Context.bindService()启动Service有关的生命周期方法 onBind()只有采用Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与服务绑定时被调用,当调用者与服务已经绑定,多次调用Context.bindService()方法并不会导致该方法被多次调用。onUnbind()只有采用Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与服务解除绑定时被调用。 备注: 1. 采用startService()启动服务      Intent intent =newIntent(DemoActivity.this, DemoService.class); startService(intent); 2.Context.bindService()启动     Intent intent =newIntent(DemoActivity.this, DemoService.class); bindService(intent, conn, Context.BIND_AUTO_CREATE);    //unbindService(conn);//解除绑定 9.    请解释下在单线程模型中Message、Handler、MessageQueue、Looper之间的关系。Handler简介: 一个Handler允许你发送和处理Message和Runnable对象,这些对象和一个线程的MessageQueue相关联。每一个线程实例和一个单独的线程以及该线程的MessageQueue相关联。当你创建一个新的Handler时,它就和创建它的线程绑定在一起了。这里,线程我们也可以理解为线程的MessageQueue。从这一点上来看,Handler把Message和Runable对象传递给MessageQueue,而且在这些对象离开MessageQueue时,Handler负责执行他们。 Handler有两个主要的用途:(1)确定在将来的某个时间点执行一个或者一些Message和Runnable对象。(2)在其他线程(不是Handler绑定线程)中排入一些要执行的动作。 Scheduling Message,即(1),可以通过以下方法完成: post(Runnable):Runnable在handler绑定的线程上执行,也就是说不创建新线程。 postAtTime(Runnable,long): postDelayed(Runnable,long): sendEmptyMessage(int): sendMessage(Message): sendMessageAtTime(Message,long): sendMessageDelayed(Message,long): post这个动作让你把Runnable对象排入MessageQueue,MessageQueue受到这些消息的时候执行他们,当然以一定的排序。sendMessage这个动作允许你把Message对象排成队列,这些Message对象包含一些信息,Handler的hanlerMessage(Message)会处理这些Message.当然,handlerMessage(Message)必须由Handler的子类来重写。这是编程人员需要作的事。 当posting或者sending到一个Hanler时,你可以有三种行为:当MessageQueue准备好就处理,定义一个延迟时间,定义一个精确的时间去处理。后两者允许你实现timeout,tick,和基于时间的行为。当你的应用创建一个新的进程时,主线程(也就是UI线程)自带一个MessageQueue,这个MessageQueue管理顶层的应用对象(像activities,broadcastreceivers等)和主线程创建的窗体。你可以创建自己的线程,并通过一个Handler和主线程进行通信。这和之前一样,通过post和sendmessage来完成,差别在于在哪一个线程中执行这么方法。在恰当的时候,给定的Runnable和Message将在Handler的MessageQueue中被Scheduled。 Message简介: Message类就是定义了一个信息,这个信息中包含一个描述符和任意的数据对象,这个信息被用来传递给Handler.Message对象提供额外的两个int域和一个Object域,这可以让你在大多数情况下不用作分配的动作。 尽管Message的构造函数是public的,但是获取Message实例的最好方法是调用Message.obtain(),或者Handler.obtainMessage()方法,这些方法会从回收对象池中获取一个。 MessageQueue简介: 这是一个包含message列表的底层类。Looper负责分发这些message。Messages并不是直接加到一个MessageQueue中,而是通过MessageQueue.IdleHandler关联到Looper。 你可以通过Looper.myQueue()从当前线程中获取MessageQueue。 Looper简介: Looper类被用来执行一个线程中的message循环。默认情况,没有一个消息循环关联到线程。在线程中调用prepare()创建一个Looper,然后用loop()来处理messages,直到循环终止。 大多数和message loop的交互是通过Handler。 下面是一个典型的带有Looper的线程实现。   class LooperThread extends Thread {       public Handler mHandler; public void run() { Looper.prepare(); mHandler = new Handler() {               publicvoidhandleMessage(Message msg) {                   // processincomingmessages here               }           }; Looper.loop(); } 10.       AIDL的全称是什么?如何工作?能处理哪些类型的数据?AIDL的英文全称是Android InterfaceDefine Language 当A进程要去调用B进程中的service时,并实现通信,我们通常都是通过AIDL来操作的 A工程: 首先我们在net.blogjava.mobile.aidlservice包中创建一个RemoteService.aidl文件,在里面我们自定义一个接口,含有方法get。ADT插件会在gen目录下自动生成一个RemoteService.java文件,该类中含有一个名为RemoteService.stub的内部类,该内部类中含有aidl文件接口的get方法。 说明一:aidl文件的位置不固定,可以任意 然后定义自己的MyService类,在MyService类中自定义一个内部类去继承RemoteService.stub这个内部类,实现get方法。在onBind方法中返回这个内部类的对象,系统会自动将这个对象封装成IBinder对象,传递给他的调用者。 其次需要在AndroidManifest.xml文件中配置MyService类,代码如下: 为什么要指定调用AIDL服务的ID,就是要告诉外界MyService这个类能够被别的进程访问,只要别的进程知道这个ID,正是有了这个ID,B工程才能找到A工程实现通信。 说明:AIDL并不需要权限 B工程: 首先我们要将A工程中生成的RemoteService.java文件拷贝到B工程中,在bindService方法中绑定aidl服务 绑定AIDL服务就是将RemoteService的ID作为intent的action参数。 说明:如果我们单独将RemoteService.aidl文件放在一个包里,那个在我们将gen目录下的该包拷贝到B工程中。如果我们将RemoteService.aidl文件和我们的其他类存放在一起,那么我们在B工程中就要建立相应的包,以保证RmoteService.java文件的报名正确,我们不能修改RemoteService.java文件         bindService(newInten("net.blogjava.mobile.aidlservice.RemoteService"),serviceConnection,Context.BIND_AUTO_CREATE); ServiceConnection的onServiceConnected(ComponentName name,IBinderservice)方法中的service参数就是A工程中MyService类中继承了RemoteService.stub类的内部类的对象。 了解更多Android开发知识欢迎访问中软国际教育官网

更多>
中软国际教育:云计算知识问答

中软国际教育:云计算知识问答

2017-02-20

1、什么是shell,以及作用? shell就是命令解释器,它提供了用户与操作系统之间基于命令行的交互界面,用户命令行输入命令,由shell对它们进行解释,并将其送往操作系统执行。 2、常用磁盘阵列类型及优缺点 Raid 0 又叫磁盘分条,需要大于等于2块磁盘完成,速度最快,没有容错功能,因为数据是分成奇数条和偶数条分条同时在两个硬盘中同时写入,所以速度最快,磁盘空间利用率100%。 Raid 1 镜像卷,两块硬盘实现,速度不快,有容错功能,空间利用率50%。因为把相同的数据写入了2遍所以有容错功能。 Raid 5 大于等于3块硬盘实现,有容错功能,速度较快。磁盘空间利用率(n-1)/n.因为三块磁盘,其中2块磁盘在做raid 0,剩下的一块硬盘是校验。 一块硬盘中刨除主分区以外剩余所有的空间都是扩展分区,所有的逻辑分区之和组成扩展分区。linux中1-4是预留给主分区和扩展分区的,主分区至少要有1个,之多可以有4个,扩展分区至多只能有1个或者没有,但是主分区加上扩张分区数量不能超过4个。扩展分区下必须再分逻辑分区,不然空间不能被格式化,逻辑分区的数量没有限制。 更多软件编程知识欢迎登陆中软国际教育集团官网www.zretc.com!

更多>
中软国际教育:javascript错误处理与调试

中软国际教育:javascript错误处理与调试

2017-02-20

本文主要介绍javascript中一些常见的错误,以及一些用于调试和处理错误的基础,以帮助我们提高javascript代码的质量. 先说下javascript中常见的7种错误: 1.变量未定义 下面的语句将隐式的创建一个新的变量abc,并将值123赋给该变量: [javascript] view plaincopy "font-size:24px;">abc = 123;   严格的讲,应该显式的定义该变量: [javascript] view plaincopy "font-size:24px;">var abc = 123;   (实际上,是否使用var关键字与变量的作用域有关,因此最好在定义变量时都加上var关键字) 但是,如果使用一个未定义的变量,将产生错误.例如,如果变量abc事先没有显式或隐式的定义,下面语句将产生错误: [javascript] view plaincopy "font-size:24px;">alert(abc);   2.大小写敏感 大小写错误是最常见的错误之一,但有时是很难发现的.例如,找出下面语句的三处错误: [javascript] view plaincopy "font-size:24px;">var myName ="Paul";  

更多>
如何通过手机破解无线密码-中软国际教育

如何通过手机破解无线密码-中软国际教育

2017-02-20

这篇文章主要分享了,如何通过手机破解无线密码,主要是通过WIFI万能钥匙,然后再查看密码,这样电脑也可以看通过密码上网了 由于网络的普及,现在用无线路由器的朋友越来越多,大家用无线路由器的安全意识也强了不少,今天闲得无事,把原来用的无线网卡插在自己的台式机上,搜索到N+个无线信号。就想试试看能不能连接上别人的无线路由,好让自己的电脑使用有线网络+无线网络增加网速,但一看搜索到的无线信号全是加了密的,尝试用弱密码连接了几个,密码不正确连接不了。 最后想到手机不是有个WIFI万能钥匙吗,果断用手机下载,启动软件用WIFI万能钥匙连接搜索到的信号,靠,连接成功。进入手机的设置-wlan-查看连接上的无线信号的详细信息,看到自己手机获取到的IP是192.168.1.101,那么网关就可能是192.168.1.1了。用手机的浏览器输入打看成功,要求输入无线路由器的用户名和密码,果断输入用户名admin 密码admin 登录成功(在这里说一下,很多朋友设置了无线路由信号的的安全密码后,很少更改无线路由器的管理密码,基本都是默认的密码。可以查看: 路由器默认密码表。)打开无线路由器设置 无线设置-无线安全设置,就看到无线路由器的安全密码了。用电脑连接刚刚的到密码的无线路由器,连接成功。哈哈双线模式,本来5M的有线现在下载东西达到了900K+看来刚连上的那个无线路由器家里开的4M的宽带。 另外一种方法,也是安装wifi万能钥匙后,直接用手机查看密码前提是你的手机是安卓系统。 1、手机必须取得root权限。2、用RE管理器或es文件浏览器进入data/misc/wifi,里面有个nf或是nf的文件,用文本查看器打开,所有记住的wifi密码都在这里。 打开 nf文件就可以看到以下内容: network={ ssid="xxxxxxxxx" (网络名) psk="xxxxxxxxxxxx" (密码) key_mgmt=WPA-PSK priority=10 } ①、ssid=后面的就是你连接的WIFI网络名。  ②、psk=后面的就是此WIFI网络的密码。  ③、 key_mgmt=后面内容为加密类型。

更多>
中软国际教育:大学毕业生应如何选择IT培训机构

中软国际教育:大学毕业生应如何选择IT培训机构

2017-02-20

即将毕业的大学生们都在寻求最好的职业发展空间,就业环境较好、薪酬水平较高的IT行业自然极具吸引力。如何理性地选择IT培训机构,获得自己预期的理想效果呢?我们不妨听听中软卓越IT培训专家们的建议! 1.选择口碑好的培训机构 中软卓越IT培训专家认为,从目前市场状况看,大学毕业生先镀金再就业、理性选择培训机构已成为主要趋势。选择好的培训机构才是学到真本事。在选择培训机构时要注意: 第一,注意品牌、口碑。 第二,注意师资质量。在选择IT培训老师时,要注意其理论知识和实践技能都要强。 第三,机构的自身管理能力。在挑选培训机构时还要注意其自身管理能力。如果培训机构的工作人员,尤其是讲师流动过快,对学员的影响是很大的。 2.坚持终身学习 IT领域是一个需要终身学习的行业。IT行业的最大特征就是更新速度极快,对新技术的掌握程度也要求很高。进入这个行业就需要不停充电。这里所说的“充电”,还不仅是IT专业知识方面的补充。现在的行业都要求是复合型人才,除了IT知识外,英语等其他方面的素质能力也要注意培养。

更多>

推荐阅读

更多

友情链接:

中软卓越java培训地址:北京市海淀区科学院南路2号融科资讯中心C座北楼12层 联系电话:400-666-3775 邮箱账号:etc-marketing@chinasofti.com

©2008-2016 北京中软国际教育科技股份有限公司 京ICP备14058756号-2