首页 文章 精选 留言 我的

精选列表

搜索[笔记软件],共10000篇文章
优秀的个人博客,低调大师

android152 笔记 2

27.谈谈UI中, Padding和Margin有什么区别? Padding 文字对边框, margin是控件对父窗体. 28. widget相对位置的完成在activity的哪个生命周期阶段实现。控件的宽度和高度在oncreat()方法里面拿不到因为还没有创建出来,一般在onResume()方法里面去拿。也可以在控件的onmeasure() 计算方法里面去拿,燃料后调用ondraw方法去绘制。 这个题没看懂… widget可以理解成桌面小控件, 也可以理解成 某个button, imageview这样的控件… onmeasure() // 计算 控件在屏幕上的位子 某个view 要显示在界面 ondraw 被显示到界面上的 . 29. 请解释下在单线程模型中Message、Handler、Message Queue、Looper之间的关系。主线程里面有一个looper死循环迭代消息队列,消息里面有handler来处理消息。 30. AIDL的全称是什么?如何工作? Android interface definition language (android接口定义语言) , 用来跨进程的访问方法, 访问远程的服务的方法. 一个作为客户端一个作为服务端。Java里面的IDL是java的跨进程访问的方法。 aidl里面是接口,服务端里面有aidl文件,并且会生成对应的java文件,在onbind方法里面返回的binder对象实现了这个接口,客户端就会拿到实现了接口的对象,就可以调用对象里面的方法,客户端也会有aidl文件和对应的java文件。在传递复杂类型对象的时候要实现Pacelble接口。 如何工作 day7 queryStudent .手机卫士 Itelephony 接口挂断电话. 31. 请解释下Android程序运行时权限与文件系统权限的区别。 Android程序执行需要读取到安全敏感项必需在androidmanifest.xml中声明相关权限请求, 打电话,访问网络,获取坐标,读写sd卡,读写联系人等..安装的时候会提示用户… drwx 文件系统的权限是linux权限. 比如说sharedpreference里面的Context.Mode.private Context.Mode.world_read_able Context.Mode_world_writeable 777自己 同组 其他 32. 系统上安装了多种浏览器,能否指定某浏览器访问指定页面? 找到对应的浏览器的意图过滤器,传递数据URI , 激活这个意图 Intent intent = new Intent(); intent.setClassName(packageName, className); intent.seturi() 33. 对android主线程的运用和理解。 主ui线程不能执行耗时的操作, service,content provider,receive,activity这几个都是运行在主线程不能执行耗时的操作,activity5秒,receive10秒,service20秒,content provider5秒。 本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/5164982.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

多域间访问笔记

多域间访问 域树 子域 林 林的根域 Enterprise Admins(企业管理组)可以对活动目录中的整个林做修改 Schema Admins(架构管理组)可以对活动目录中的整个林做架构修改 创建林 在新林中新建域 创建子域 在现有林中新建域 多域控 在现有域中添加域控制器 创建林中域树 使用高级模式安装 新建域树根不是新子域 林中域之间的信任关系是默认创建 自动建立 传递信任 双向信任 林中跨域访问 AGDLP 将benet用户账户加入benet全局组 将benet全局组加入accp本地域组 给accp本地域组赋权限 林之间的信任分为:外部信任和林信任 外部信任是指在不同林的域之间创建不可传递的信任 创建外部信任前,在两个域的DNS设置条件转发器互相指向对方 Active Directory域和信任关系——accp.com域名——属性——信任——新建信任 建立林信任 提升域功能级别2003以上 Active Directory域和信任关系——域名——提升域功能级别 提升林功能级别2003以上 Active Directory域和信任关系——提升林功能级别 创建林信任 在两个域的DNS服务器上互相设置条件转发器,解析对方的地址 林间跨域访问 AGDLP 将被信任域账户加入被信任域全局组 将被信任域全局组加入信任域本地域组 给信任域本地域组赋权限 本文转自 jin626889 51CTO博客,原文链接:http://blog.51cto.com/zuoshou/1291882,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android学习笔记--广播机制

MicrosoftInternetExplorer402DocumentNotSpecified7.8Normal0 1.Adnroid的广播机制 2.BroadcastReceiver的作用 事件触发之后的一种解决方法 3.BroadcasrReceiver的编写方法 在AndroidManifest.xml中注册广播 <receiverandroid:name=".TextReceiver"> <intent-filter> <actionandroid:name="android.intent.action.EDIT"> </intent-filter> <receiver> 例://BroadcasrReceiver PublicclassTestReceiverextendsBroadcastReceiver{ PublicTestReceiver(){ System.out.println("TestReceiver"); } @override PublcvoidonReceive(Contextcontext,Intentintent){ System.out.println("OnReceiver"); //对象会被销毁TestReceiver } } Activity中的写法例: 1.声明控件对象(略) 2.获得控件对象(略) 3.绑定事件(略) 4.创建监听器对象 PublicvoidonClick(Viewv){ TestReceivertr=newTestReceiver(); Intentintent=newIntent(); intent.setAction(Intent.ACTION_EDIT);//与AndroidManifest中的过滤内容对比 TestActivity.this.sendBroadcast(intent); } 4.BroadcastReceiver的生命周期 5. 注册BroadcastReceiver的方法 BroadcastReceiver用于监听被广播的事件(Intent)为了达到这个目的,BroadcastReceiver必须进行注册,以下是注册的两种方法 在应用程序的代码当中进行注册 注册BroadcastReceiver registerReceiver(receiver,filter) 取消注册 UnregisterReceiver(receiver); Activity中代码例: 1.声明控件对象(略) 2.获得控件对象(略) 3.绑定事件(略) 4.创建监听器对象 //绑定广播事件 PublicvoidonClick(Viewv){ //生成receiver对象 smsReceiver=newSMSReceiver(); IntentFilterfilter=newIntentFilter(); filter.addAction(" android.provider.Telephony.SMS_RECEIVED" ); //注册广播事件 TestActivity.this.registerReceiver(smsReceiver,filter); } //接触广播事件 PublicvoidonClick(Viewv){ TextActicity.this.unregisterReceiver(smsReceiver); } PublicclassSMSReceiverextendsBroadcastReceiver{ @override PublicvoidonReceive(Contextcontext,Intentintent){ System.out,println("receivemessage"); //对接受的短消息进行处理 //接受Intent对象中的数据 Bundlebundle=Intent.getExtras(); //在Bundle对象当中有一个属性名为pdus,这个属性的值是一个Object数组 Object[]myObjects=(Object[])bundle.get("pdus"); //创建一个SmsMessage类型的数组 SmsMessage[]message=newSmsMessage(myObjects.length); System.out,println(message.length); For(inti=0;i<myObjects.length;i++){ //使用Object数组当中的对象创建SmsMessage对象 Message=SmsMessage.createFromPdu((byte[])myObjects); System.out,println(message.getDisplayMessageBody()); } } } 在AndroidManifest.xml中进行注册(不论应用程序的开启或关闭) <receiverandroid:name=".TestReceiver"> <intent-filter> <actionandroid:name="android,intent.action.PICK"> </intent-filter> <receiver> 6.Android内置的BroadcastActions 本文转自My_King1 51CTO博客,原文链接:http://blog.51cto.com/apprentice/1360565,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android学习笔记--Activity初步

MicrosoftInternetExplorer402DocumentNotSpecified7.8Normal0 1.Activity的主要作用(UI)应用程序组件 创建一个activity类 创建Activity要点 a.一个activity就是一个类,并且这个类要继承activity b.需要从写onCreate方法(程序运行首先调用) c.在配置文件中注册每一个activity d.要为activity中添加必要的控件 e.对应布局文件一个布局文件对应一个activity 得到控件例findViewById(R.id.MyButton); 本文转自My_King1 51CTO博客,原文链接:http://blog.51cto.com/apprentice/1360579,如需转载请自行联系原作者

优秀的个人博客,低调大师

2、权限、变量、for 学习笔记

ls 显示目录内容,不包含以点开头的文件 ls -a 显示目录内容,包含以点开头的文件 ls -l 长格式显示目录内容 ls -d 显示目录自身的信息,通常与-l同时使用 ls -r 逆序显示目录内容 ls -R 递归显示目录内容 ls -h 以易读的方式显示文件大小,通常与-l同时使用 ls -i 显示inode信息 tree 树状形式显示目录内容 alias 显示当前shell中定义的所有别名 alias 别名='原始命令' 定义别名 unalias 别名 删除命令别名 file FILE... 查看文件内容格式 cat -E FILE 显示行结束符 cat -v FILE 显示非打印字符 cat -e FILE 相当于-vE cat -n FILE 显示时给行按顺序编号 cat -s FILE 多个连续的空白行显示为一个空白行 head -# 显示文件顶部#行的内容 tail -# 显示文件尾部#行的内容 tail -#f 动态显示文件尾部#行的内容 echo命令的用法: echo -e "\033[##;##m string \033[0m" 第一个#: 3表示前景色,4表示背景色 第二个#:颜色,0-7 0 黑色 1 红色 2 绿色 3 黄色 4 蓝色 5 紫色 6 天蓝 7 白色 echo -e "\033[31;42;5m LINUX \033[0m" 效果:绿底红字闪烁 通配符: * 匹配任意长度的任意字符 ? 匹配任意单个字符 [] 匹配指定字符范围内的任意单个字符 [^] 匹配指定字符范围外的任意单个字符 [:upper:]] 所有大写字母 [:lower:]] 所有小写字母 [:alpha:]] 所有字母 [:digit:]] 0-9 [:alnum:]] 0-9及所有字母 [:space:]] 所有空白字符 [:punct:]] 所有标点符号 练习:复制/var目录下所有以l开头,以一个小写字母结尾,且中间出现一位数字的文件或目录至/tmp下 cp -r /var/1*[0-9]*[a-z] /tmp 练习:如果符合条件是目录,也要复制; 1、复制/etc目录下以p开头,中间跟了任意字符,并以d结尾的文件至/tmp目录中; 2、复制/etc/目录下以p开头,中间跟了4个任意字符,并以d结尾的文件至/tmp/a目录中;如果a不存在,先创建出来; 3、复制/etc/目录下以任意一位数字开头,并以非数字结尾的文件至/tmp/b目录中; 4、复制/etc/目录下以非字母开头,后面跟了一个字母及其它任何长度字符的文件至/tmp/c目录中; 1、cp -r /etc/p*d /tmp 2、cp -r /etc/p????d /tmp/a 3、cp -r /etc/[0-9]*[^0-9] /tmp/b 4、cp -r /etc/[^[:alpha:]][[:alpha:]]* /tmp/c cp命令的长用选项: -r:递归 -d: 当源为链接文件时,复制链接文件本身而非指向的源文件 -p: 保持原有属性 mv: 移动文件,或重命名 rm: 移除文件 删除非空目录:# rm -rf stat FILE 显示文件或文件系统信息,包含(access、modify、change时间) touch FILE 创建空文件或修改文件时间信息 -c: 不创建空文件 -a: 仅修改访问时间 -m: 仅修改修改时间 -t STAMP: [CC]YYMMDDhhmm.ss 修改当前时间 /etc/passwd: 用户名:x:UID:基本组ID:comment信息:HOME:默认shell useradd: adduser -u UID:指定UID -g GID: 指定GID,即指定用户的基本组,但GID要事先存在 -G GID:指定用户的额外组,组要事先存在; -c "Comment": -d /path/to/somewhre: -s /path/to/shell: 指定默认shell,应该指定使用/etc/shells文件中出现的shell; -m: 创建用户时,强制给用户创建家目录; -M: 创建用户,但不创建家目录; -r: 创建系统用户 id: 1-499 不会为用户创建家目录 默认shell为/sbin/nologin groupadd GrpName -g GID: 创建组并为其指定GID 用户类别: 管理员:0 普通用户:1-65535 系统用户:1-499 登录用户:500+ 用户组: 管理员组 普通组 以用户为视角,组可为两类: 基本组: 显示在/etc/passwd中GID字段组,为用户的基本组; 额外组,附加组: /etc/group userdel: 删除用户, 默认会保留家目录 格式:userdel UserName -r: 一并删除家目录 设定用户密码: passwd 普通用户:passwd 管理员: 改自己密码:passwd 改其它用户密码:passwd UserName /etc/shadow文件的格式: UserName:加密的密码:最近一次密码修改时间:最短使用期限:最长使用期限:警告区间:非活动区间:帐号的过期期限:预留段 passwd -l UserName 锁用户 passwd -u UserName 解锁 设定组密码:gpasswd GroupName usermod: -u UID: -g GID: -G GID: 默认会覆盖原有的附加组;如果是添加,则同时使用-a选项; -c String: -d /path/to/New_Home: 默认不会迁移用户的家目录;如果要迁移,则同时使用-m -s SHELL: -l New_login_name: -L: 锁定用户帐号 -U: 解锁 如何修改组属性定义: groupmod: -g GID -n New_Group_Name: UserName:加密的密码:最近一次密码修改时间:最短使用期限:最长使用期限:警告区间:非活动区间:帐号的过期期限:预留段 修改帐号日期属性:chage -m 修改最短使用期限。为零时代表任何时候都可以更改密码 -M 修改最长使用期限。密码保持有效的最大天数 -W 修改警告区间。用户密码到期前,提前收到警告信息的天数 -I 修改非活动区间或停滞日期。如果一个密码已过期这些天,那么此帐号将不可用 -E 修改帐号的过期期限。过了这天,此帐号将不可用 查看用户相关信息id: id UserName -u: 显示UID,跟-n一起使用则显示用户名 -g: 显示基本组ID,跟-n一起使用则显示基本组名 -G: 显示所有组ID,跟-n一起使用则显示所有组名 su -l UserName 切换用户,且切换到该用户的家目录 练习: 1、创建一个用户mandriva,其ID号为2002,基本组为distro(组ID为3003),附加组为linux; # groupadd linux # groupadd -g 3003 distro # useradd -u 2002 -g distro -G linux mandriva 2、创建一个用户fedora,其全名为Fedora Community,默认shell为tcsh; # useradd -c "Fedora Community" -s /bin/tcsh fedora 3、修改mandriva的ID号为4004,基本组为linux,附加组为distro和fedora; # usermod -u 4004 -g linux -G distro,fedora mandriva 4、给fedora加密码,并设定其密码最短使用期限为2天,最长为50天; # passwd fedora # chage -m 2 -M 50 fedora 5、将mandriva的默认shell改为/bin/bash; # chsh -s /bin/bash mandriva Linux文件类型: 普通文件 - 目录 d 链接文件 l 字符设备 c 块设备 b 命名管道 p 套接字文件 s 权限:read, write, execute 用户不拥有某位权限,则使用 - 占位; 文件: r: 可以使用内容查看类的命令来显示其相关内容; w: 可以使用编辑器修改其内容; x: 可以将其发起一个进程; 目录: r: 可以使用ls命令查看目录内容的文件信息; w: 可以创建、删除文件; x: 可以使用ls -l命令查看目录内容的文件信息,并且可用cd命令切换此目录为工作目录; chmod命令: 操作三类用户的权限:使用8进制形式 chmod [-R] OCTAL-MODE file... -R可以递归修改目录下文件的权限 操作指定类别用户的权限:使用u,g,o,a来赋权,基于=或+/-来进行 u: 属主 g: 属组 o: 其它 a: 所有 =:操作指定类别用户的权限;u=, ug=, u=,g= +/-: 操作指定类别用户的单个权限: u-x, g+r, o-x, +x 参照其它文件的权限为当文件赋权 --reference=要参照的文件 要修改权限的文件 umask 创建文件:666-umask 文件默认决不允许出现执行权限,如何具有执行权限,则权限值加1; 创建目录:777-umask root用户的umask为022;用户名和基本组组名一致umask为002,否则umask为022; 修改文件的属主或属组:chown, chgrp -R: 递归 --reference= chown [option] UserName[{:|.}GroupName] file... 权限应用模型: 进程的属主,是否与文件的属主相同;如果相同,进程则以文件属主的权限来访问文件;否则 进程的属主所属的组,是否其中之一与文件的属组相同;如果相同,进程则以文件属组的权限来访问文件;否则, 进程则以文件的其它用户的权限来访问文件; 练习: 1、新建一个用户openstack,但不给其创建家目录;创建完成后使用su命令切换至此用户,查看其命令提示符及PATH和HOME两个环境变量的值; # useradd -M openstack # su - openstack # echo $PATH $HOME 2、复制/etc/skel目录为/home/openstack; # cp -r /etc/skel /home/openstack 3、改变/home/openstack及其内部文件的属主属组均为openstack; # chown -R openstack.openstack /home/openstack 4、/home/openstack及其内部的文件,属组和其它用户没有任何访问权限; # chmod -R go= /home/openstack # su - openstack # echo $PATH $HOME 练习: 完成以下任务: (1)新建系统组mysql;新建系统用户mysql,属于mysql组,要求其没有家目录且shell为/sbin/nologin; # groupadd -r mysql # useradd -r -s /sbin/nologin -g mysql mysql (2)新建GID为600的组magedu;新建用户gentoo,要求其家目录为/users/gentoo,密码同用户名; # groupadd -g 600 magedu # mkdir /users # useradd -d /users/gentoo gentoo # passwd gentoo (3)新建用户centos,其家目录为/users/centos,密码同用户名; # useradd -d /users/centos centos # passwd centos (4)新建用户www,其家目录为/users/www;删除www用户,但保留其家目录; # useradd -d /users/www www # userdel www (5)用户gentoo和centos均以magedu为其附加组; # usermod -a -G magedu gentoo # usermod -a -G magedu centos bash特性之六:bash的快捷键 Ctrl+a: 跳至命令行首 Ctrl+e: 跳至命令行尾 Ctrl+u: 删除命令行首至当前光标所在处的内容 Ctrl+k: 删除当前光标所有处至命令行尾的内容 Ctrl+l: 清屏,相当于clear命令 Ctrl+c: 取消或终止; Ctrl+z: 将当前命令送至后台,fg调回前台 ELF: #!/bin/bash 程序=指令+数据 变量: 弱类型语言: 1、不强制区分变量的类型,无论存储何种数据,均以字符格式进行; 2、无须事先声明;用到时,直接使用,直接赋值; bash: 动态编程语言,是弱类型语言; bash的特性之九:bash中的变量 变量的类型: 本地变量:只对当前shell进程有效,对其子shell以及其它shell都无效; 定义变量: [set]Var_Name="Value" 引用变量: ${Var_Name} 撤销变量: unset Var_Name 局部变量:仅对局部代码生效 local Var_Name="Value" 环境变量:对当前shell进程及其子shell都有效; export Var_Name="Value" 或 Var_Name="Value" export Var_Name 位置变量: $1, ..., $n ./first.sh 2 8 特殊变量: $0: 脚本名称自身 $?: 上一条命令的执行状态; 状态用数字来表示:0-255; 0: 成功 1-255: 失败 $$ $! $# 位置参数的个数 $* 所有的位置参数 变量的命名要求: 只能使用数字、字母和下划线组成; 不能以数字开头; 不能使用程序中的关键字; 见名知义;totalWeight set 环境变量:用来bash的工作特性,用于保存当前会话的属性信息; 显示所有环境变量:export, env, printenv 定义:export Var_Name="Value" PATH, PS1 bash的配置文件:持久保存用户配置 profile类:为交互式登录的用户提供配置 /etc/profile:全局 /etc/profile.d/*.sh:全局 ~/.bash_profile:个人配置,仅对当前用户有效 功能: 设定环境变量 运行命令或脚本 bashrc类:非交互工登录用户提供配置 /etc/bashrc: 全局 ~/.bashrc: 个人配置 功用: 设定本地变量 定义命令别名 登录类型: 交互式登录: 直接通过终端输入用户信息登录系统; su - UserName或su -l UserName; 非交互式登录: su UserName 图形界面的终端 执行脚本 新增配置的生效方式: 通知shell重读配置文件的命令: source (.) . FILE 重新登录 交互式登录用户: /etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc 非交互式登录用户: ~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh bash脚本:面向过程的编程中 顺序执行:默认法则,逐条执行各语句 选择执行:分支,条件判断,符合条件的分支予以执行; 循环执行:将同一段代码反复执行有限次,所以,循环必须有退出条件,否则将陷入死循环; for循环: for var_Name in 列表; do 语句1 语句2 ... done 语法错误检测: # bash -n 脚本文件 列表的生成方法: 生成数字序列:{start..end}、seq [start] [step] end 练习:写一个脚本,列出1-10的奇数 #!/bin/bash for num in `seq 1 2 10`; do echo $num done 练习:写一个脚本,用file命令显示/var/log目录下每个文件的内容类型; 提示:列表生成的方法为/var/log/* #!/bin/bash # dirName=/var/log for fileName in $dirName/*; do file $fileName done 练习:写一个脚本, 1、创建/tmp/scripttest目录,用变量保存目录名; 2、在目录里创建测试文件tfile1-tfile20; 3、创建用户testuser1和testuser2; 4、将tfile1-tfile10的属主和属组改为testuser1; 5、将tfile11-tfile20的属主和属组改为testuser2; #!/bin/bash dirName=/tmp/scripttest mkdir $dirName for fileNo in {1..20}; do touch $dirName/tfile$fileNo echo "Create $dirName/tfile$fileNo finished" done useradd testuser1 useradd testuser2 for fileNo in {1..10}; do chown testuser1:testuser1 $dirName/tfile$fileNo done for fileNo in {11..20}; do chown testuser2:testuser2 $dirName/tfile$fileNo done 文本处理类的命令:wc, word count wc [option] [file]... -l: 统计行数 -c: 统计字节数 -w;统计单词数 tr: 转换字符或删除字符 tr '集合1' '集合2' 将集合1替换为集合2 tr -d '字符集合' 删除字符集合 cut -d字符 -f# 操作对象 -d字符:指定分隔符 -f#: 指定要显示字段 单个数字:一个字段 逗号分隔的多个数字:指定多个离散字段 -:连续字段,如3-5; sort: 默认按字符进行比较 sort [option] file... -f: 忽略字符大小写; -n: 比较数值大小; -u: 重复的行,只显示一次; -t: 指定分隔符 -k: 指定分隔后进行比较字段 uniq: 移除重复的行 -c:显示每行重复的次数 -d:仅显示重复过的行 -u: 仅显示不曾重复的行 练习: 1、统计/bin、/usr/bin、/sbin和/usr/sbin等各目录中的文件个数; # ls /bin | wc -l 2、显示当前系统上所有用户的shell,要求,每种shell只显示一次; # cut -d: -f7 /etc/passwd | sort -u 3、取出/etc/passwd文件的第7行; # head -7 /etc/passwd | tail -1 4、显示第3题中取出的第7行的用户名; # head -7 /etc/passwd | tail -1 | cut -d: -f1 # head -7 /etc/passwd | tail -1 | cut -d: -f1 | tr 'a-z' 'A-Z' 5、统计/etc目录下以P或p开头的文件个数; # ls -d /etc/[Pp]* | wc -l 练习:写一个脚本,用for循环实现 显示/etc/init.d/functions、/etc/rc.d/rc.sysinit和/etc/fstab各有多少行; #!/bin/bash for fileName in /etc/init.d/functions /etc/rc.d/rc.sysinit /etc/fstab; do wc -l $fileName done #!/bin/bash for fileName in /etc/init.d/functions /etc/rc.d/rc.sysinit /etc/fstab; do lineCount=`wc -l $fileName | cut -d' ' -f1` echo "$fileName: $lineCount lines." done #!/bin/bash for fileName in /etc/init.d/functions /etc/rc.d/rc.sysinit /etc/fstab; do echo "$fileName: `wc -l $fileName | cut -d' ' -f1` lines." done 练习:写一个脚本 将上一题中三个文件的复制到/tmp目录中; 用for循环实现,分别将每个文件的最近一次的修改时间改为2011年9月15号13点27分; #!/bin/bash for fileName in /etc/init.d/functions /etc/rc.d/rc.sysinit /etc/fstab; do cp $fileName /tmp baseName=`basename $fileName` touch -m -t 201109151327 /tmp/$baseName done 练习:写一个脚本 显示/etc/passwd中第3、7和11个用户的用户名和ID号; #!/bin/bash # for lineNo in 3 7 11; do userInfo=`head -n $lineNo /etc/passwd | tail -1 | cut -d: -f1,3` echo -e "User: `echo $userInfo | cut -d: -f1`\nUid: `echo $userInfo |cut -d: -f2`" done for:通过使用一个变量去遍历给定列表中的每个元素,在每次变量赋值时执行一次循环体,直至赋值完成所有元素退出循环; 总结:生成列表的方式 1、直接给出列表; 2、使用文件名通配的机制生成列表 3、可以使用{}或seq命令生成数字序列 1, $lineCount `seq 1 $lineCount` {1..$lineCount} 4、使用命令生成 本文转自开源殿堂 51CTO博客,原文链接:http://blog.51cto.com/kaiyuandiantang/1934514,如需转载请自行联系原作者

优秀的个人博客,低调大师

Web Service学习笔记(1)

Web Service的宗旨是创建不需要用户界面就能与其他应用程序交互的Web应用程序。 举例说明它的优点,假如你正在为一家股票投资公司创建网站,你并不需要把不同证劵交易所得数据库与自己的后台数据库进行整合,因为你的应用程序可以使用Web Service,并使用XML格式交换数据。 Web Service是松耦合的,它与服务器端和客户端使用的操作系统、编程语言都无关。假如你既拥有客户端又有服务器端的访问和管理权,这种情况更适合用.NET的Remoting技术,而不是Web service。 创建Web Service必须保证的是,服务器端和客户端都要支持HTTP、SOAP(简单对象访问协议)和XML等行业标准协议。 Web Service是如何工作的 Web Service允许两个程序之间交换XML文档。在这个架构的顶层,微软实现了一个远程过程调用(Remote Procedure Call,PRC)模型。 Web Service架构包括以下特性: 1。WebServcie的服务器端和客户端应用程序都能够连接到互联网。 2。用于进行通信的数据格式必须遵守相同的开放标准,并且在大多数情况下,这个标准几乎总是SOAP。 3。客户端和服务器端的系统是松耦合的。即Web Service不关心客户端和服务器端所使用的操作系统、对象模型或者编程语言。只要Web Service和使用Web Service的应用程序都能够发送和接收遵守适当协议标准的消息即可。 下图为Web Service流程的逻辑架构 如图所示,一个Web Service使用着会向Web Service发出一个调用请求。使用者会认为它通过Internet直接和Web Service进行交流,当然这实际上是个幻象。实际上,真正的调用由代理类完成。代理类对于Web Service使用者来说是一个本地类。代理会处理所有的负责的复杂架构,包括通过Internet发送请求道服务器、从web Service取回结果并呈现给Web Service使用者。 由于代理类在之前已在消费程序中注册,所有一切工作才可以顺利进行。注册有开发消费程序的程序员完成。 开发Web Service 开发Web Service的流程与开发网页的流程近乎一致: 1。所有构成网页和服务的源文件都是文本文件,它们可以使用任何文本编辑器创建和修改。而类文件可以在控制台命令行中通过命令工具进行编译。 2。可以在vs2005及以上版本中创建网页和Web Service 3。网页和Web Service既可以使用代码隐藏模型,也可以使用内联编码(inline coding)模型。Web Service中不需要使用代码隐藏技术,因为Web Service并不包括任何可视化内容。 4。网页和Web Service都充分利用了CLR和.NET Framework。 .aspx文件用于定义网页,而.asmx文件用于定Web Service,我们可以吧Web Service想象成类,类中的一些方法通过Internet被暴露给客户端。 代理 客户端应用程序如果使用Web Service,必须先创建一个代理。代理是要调用的真正代码的替身,它负责在机器边界引导调用。在代理在客户端应用程序中注册后,客户端应用程序调用方法就如调用本地对象一样。代理接受该调用,并以适当格式封装调用,然后以SOAP请求发送调用到服务器。当服务器返回SOAP包给客户端后,代理会对包进行解密,并且如同从本地对象的方法返回数据一样将其返回给客户端应用程序。如下图所示: 协议与标准(HTTP、XML、SOAP) HTTP:TCP/IP协议的最上层是超文本传输协议(HTTP)。它是用于在网络之间使用服务器和浏览器实现通讯,主要包括在服务器和浏览器建立连接,并将HTML传输到客户端浏览器。当客户端向服务器发送HTTP请求后,服务器就开始处理请求。通常,会返回HTML页面,然后通过浏览器呈现。然而对Web Service而言,服务器返回的是SOAP消息,消息中包含了被调用的Web Service方法的返回数据。 HTTP请求从请求的浏览器出传递名称和值到服务器,这种请求包括GET和POST两种。 GET请求中,名称和值会被附加到url上,数据是未加密的。当所有需要传递的数据可以使用名称和值成对表示,而且只需要传递少量字段,字段长度较短时,比较适合GET请求。另外,如果不需考虑安全问题时,也可以使用GET。 POST请求中,配对的名称和值是作为请求消息的一部分发送的。当有大量字段或者参数很长时,适合使用POST请求。从安全方面看,POST比GET更安全,因为POST请求可以被加密。和GET请求一样,POST请求无法传递复杂的数据类型(如类、结构体和DataSet)。 XML:是有W3C公布的开放标准的一种描述数据的方法。 XML和HTML十分类似。不同的是HTML使用的是预定义元素,这些元素规定了HTML在浏览器中如何显示,而XML的元素则是由开放人员自己定义的,所以几乎所有的数据都可以表示。制定XML的目的是为了使其成为一种平台无关、语言无关的标准。 XML架构(Schema)是用于定义元素已经XML文档中或者许多XML之间元素与元素之间关联的文件。在架构中将指定元素名称和内容类型。HTML与XML的显著差别:大多数HTML读取器有很好的容错能力,而XML读取器则完全不同,所以XML文件的格式必须正确。另外,XML元素都是小写的。 SOAP:(simple object access protocol,简单对象访问协议)是一种用于控制数据交换的XML语法。它是简单的、轻量级的信息交换协议。SOAP消息有消息内容和一个或多个头模块组成,并且封装在SOAP envelope中。 SOAP使用XML语法来格式化内容。在设计上,SOAP尽可能简单并且提供最小化的功能。 SOAP不需HTTP的GET和POST,它不受“名称/值”对的限制,我们可以使用它来发送复杂的对象,包括DataSet、类和其他对象。 SOAP的缺点:SOAP消息十分冗长,因此如果存在带宽或者传输性能的问题,建议使用POST或GET。 本文转自xshf12345 51CTO博客,原文链接:,http://blog.51cto.com/alexis/573704 如需转载请自行联系原作者

优秀的个人博客,低调大师

Android学习笔记--创建Dialog

创建Dialog 1.分类 (1)AlertDialog.它能够管理0个`1个`2个`3个按钮和一个包含radio或者checkbox的可选项列表. (2)ProgressDialog.一个用于显示进度圈或者进度条的dialog,继承自AlertDialog,所以它也支持按钮. (3)DatePickerDialog.用于让用户选择日期的dialog. (4)TimePickerDialog.用于让用户选择时间的dialog. 如果你需要定义自己的dialog,只需要继承dialog或者上面提到四个组件之一, 并且为新的dialog定义自己的布局就可以了. 2.显示dialog (1)一个dialog总是作为某个Activity的一部分被创建和显示.创建dialog当然是在Activity的onCreateDialog方法里做了,但是在创建不同用途的dialog却有章可循,推荐的方式是使用switch...case...结构.比如一个游戏里可能需要暂停和结束两种dialog,那我们的示例代码如下: static final int DIALOG_PAUSED_ID = 0; static final int DIALOG_GAMEOVER_ID = 1; protected Dialog onCreateDialog(int id) { Dialog dialog; switch(id) { case DIALOG_PAUSED_ID: // do the work to define the pause Dialog break; case DIALOG_GAMEOVER_ID: // do the work to define the game over Dialog break; default: dialog = null; } return dialog; } (2)当你想显示一个dialog的时候,使用showDialog(int id),参数id是你要显示的dialog的ID. (3)如果想在每次打开dialog的时候显示的内容有所不同,你应该考虑使用onPrepareDialog(int,Dialog)方法.它会在每次打开dialog时被调用,而不是像 onCreateDialog那样只在创建时被调用. (4)注意:如果你在onCreateDialog方法之外创建一个dialog,它不会默认被绑定到当前的Activity,但是你可以通过setOwnerActivity(Activity)方法来强制绑定. 3.关闭dialog (1)当你打算关闭一个dialog时,在dialog对象上调用dismiss()方法或者直接在Activity里调用dismissDialog(int)方法都可以达到这个目的. 实际上他俩是完全一样的,下面是dismissDialog方法的代码: public final void dismissDialog(int id) { if (mManagedDialogs == null) { throw missingDialog(id); } final Dialog dialog = mManagedDialogs.get(id); if (dialog == null) { throw missingDialog(id); } dialog.dismiss(); } (如果你正在使用onCreateDialog(int)方法管理你所有的dialog的状态),每次使用dismissDialog(int)方法关闭dialog时,Activity还会保留此dialog的状态.如果你确信不再需要已经关闭的dialog对象或者清除先前的状态对你的程序非常重要,那么你应该使用removeDialog(int),它会清除所有指向这个dialog对象的引用并且关闭它(如果这个dialog正在显示的话).下面是removeDialog方法的代码: public final void removeDialog(int id) { if (mManagedDialogs == null) { return; } final Dialog dialog = mManagedDialogs.get(id); if (dialog == null) { return; } dialog.dismiss(); mManagedDialogs.remove(id);//这句做了些什么呢,还没仔细看 } (2)使用dismiss listeners 如果想在关闭dialog的时候执行某些程序,那你应该考虑使用DialogInterface.OnDismissListener.使用方法如下代码所示: Dialog dialog = new Dialog(this); dialog.setOnDismissListener(new DialogInterface.OnDismissListener() { public void onDismiss(DialogInterface dialog) { // write your performance here } }); dialog也有cancel状态,这是一种较特殊的情况.当用户点击"返回","取消"或者程序里明确调用了dialog.cancel()方法时发生.注意,这个时候, 先前注册的OnDismissListener仍然会被通知(即触发调用).如果你想发出明确的取消通知(而不是简单的关闭),那你就应该使用setOnCancelListener()方法注册一个DialogInterface.OnCancelListener来做这件事. 4.创建一个AlertDialog AlertDialog类继承于 Dialog 类.它是系统推荐的方式,能够构造出用户界面上的大多数dialog.有如下任何一个需求时,你应该考虑使用它: 显示一行标题文本; 显示一段文本消息; 让用户选择由一个`两个或者三个按钮代表的操作; 显示一个可选项列表(checkbox button或者radio button) AlertDialog.Builder子类用来创建一个AlertDialog.首先使用new AlertDialog.Builder(this)来创建一个Builder对象,然后使用它的公有 接口方法设置AlertDialog的所有属性.完成后可以通过builder.create()来得到新创建的dialog.下面是使用AlertDialog.Builder类来创建不同的AlertDialog的方法: (1)带button的Dialog AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage("Are you sure you want to exit?") .setCancelable(false) .setPositiveButton("Yes", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { MyActivity.this.finish(); } }) .setNegativeButton("No", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.cancel(); } }); AlertDialog alert = builder.create(); 注意:这里的按钮有三类setPositiveButton,setNegativeButton,setNeutralButton, 每一类只允许添加一次, 也就是最多三个按钮.按钮的种类 名称只是帮助我们区分对待它们,与它们的实际功能(由我们自己在onClick方法里定义)无关. (2)添加一个列表 这个比较简单,给出代码示例 final CharSequence[] items = {"Red", "Green", "Blue"}; AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("Pick a color"); builder.setItems(items, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int item) { Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show(); } }); AlertDialog alert = builder.create(); (3)添加checkbox 和 radio 按钮 在dialog里创建多选和单选列表应分别使用setMultiChoiceItems()和setSingleChoiceItems()方法.下面是创建一个单选项列表的代码: final CharSequence[] items = {"Red", "Green", "Blue"}; AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("Pick a color"); builder.setSingleChoiceItems(items, -1, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int item) { Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show(); } }); AlertDialog alert = builder.create(); 其中,setSingleChoiceItems()方法里第二个参数的意思是默认时选中哪一项,-1表示默认不选中任何一项. 注意:这样的情况下,用户可能希望这些值能被记忆并且恢复.要持久化存储这些选项的值,须借助android的数据存取技术. (4)创建ProgressDialog ProgressDialog dialog = ProgressDialog.show(MyActivity.this, "", "Loading. Please wait...", true); 第一个参数为应用程序的Context(上下文);第二个参数为dialog的title;第三个参数是要显示的消息文本;the last parameter is whether the progress is indeterminate. ProgressDialog的默认样式是一个旋转的轮子.如果要创建一个能显示即时进度的工具条,需要更多一点的代码: ProgressDialog progressDialog; progressDialog = new ProgressDialog(mContext); progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); progressDialog.setMessage("Loading..."); progressDialog.setCancelable(false); 这个代码在我测试的时候不能直接运行,会报出以下异常: E/AndroidRuntime( 278): Uncaught handler: thread main exiting due to uncaught exception E/AndroidRuntime( 278): android.view.WindowManager$BadTokenException: Unable to add window -- token 解决办法是把第二行换成下面这样就可以了: progressDialog = new ProgressDialog(DialogActivity.this);//这里要写程序中Activity的名字 (5)创建自定义的Dialog 根据使用基类的不同可以分作两类: 使用Dialog类构造; 使用AlertDialog类构造 两种类别的不同在于,前者的Title不能为空.如果你不设置title里的文字,它占据的空间会空着,这样显然不美观.而用后面一种方法就不会出现这种问题,不设置title,Dialog里就不显示,不影响美观.所以,还是回到那句话,更推荐使用AlertDialog组件. 5.接口收集 (1)Activity里与其相关的方法: protected Dialog onCreateDialog(int id) protected void onPrepareDialog(int id, Dialog dialog) public final void showDialog(int id) public final void dismissDialog(int id) public final void removeDialog(int id) (2)android.content.DialogInterface: interface OnCancelListener interface OnDismissListener interface OnShowListener interface OnClickListener interface OnMultiChoiceClickListener interface OnKeyListener (3)/android-src/frameworks/base/core/java/android/app/Dialog.java类及其子类里的所有方法 本文转自chainli 51CTO博客,原文链接:http://blog.51cto.com/lichen/495174,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android学习笔记--Service初步

1.Service是什么 是一个应用程序组件 没有图形化界面 通常处理一些耗时较长的操作 可以是使用service更新ContnetProvider.发送intnet以及启动系统的通知等等 2.Service不是什么 不是一个单独的进程 不是一个线程 3.Service生命周期 4.启动和停止Service的方法 服务例:publicclassFirstServiceextendsService{ @Override PublicIBinderonBind(Intentintent){ System.out.println("ServiceonBind"); Returnnull; } @Override PublicvoidonCreate(){ super.onCreate(); System.out.println("ServiceonCreate"); } //启动服务时方法 @Override PublicintonStartCommand(Intentintent,intflage,intstartId){ System.out.println("flags-->"+flags); System.out.println("startId-->"+startId); System.out.println("serviceonStartCommand"); ReturnSTART_NOT_STICKY; } @Override PublicvoidonDestroy(){ System.out.println("ServiceonDestroy"); super.onDestroy(); } } 在AndroidMnaifest.xml中注册服务:<serviceandroid:name=".FirstService"></service> 在Activity中调用Service例: 1.声明控件对象(略) 2.获得控件对象(略) 3.绑定事件(略) 4.创建监听器对象 //启动服务 PublicvoidonClick(Viewv){ Intentintent=newIntent(); intent.setClass(Activity.this,FirstService.class); startService(intent); } //停止服务 PublicvoidonClick(Viewv){ Intentintent=newIntent(); intent.setClass(Activity.this,FirstService.class); stopService(intent); } 本文转自My_King1 51CTO博客,原文链接:http://blog.51cto.com/apprentice/1360561,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android学习笔记--Scoket编程

MicrosoftInternetExplorer402DocumentNotSpecified7.8Normal0 1.什么是Socket Socket英文意为"插座" 所谓Scoket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄 应用程序通常通过"套接字"向网络发出请求或者应答网络请求 2.Socket基本通信模型 3.使用基于TCP协议的Socket ServerSocketActivity代码例: 1.声明控件对象(略) 2.获得控件对象(略) 3.绑定事件(略) 4.创建监听器对象 PublicvoidonClick(Viewv){ NewServerThread().start(); } //TCPserver ClassServerThreadextendsThread{ Publicvoidrun(){ //声明一个serverSocket对象 ServerSocketserverSocket=null; Try{ //创建serverSocket对象并在4567端口监听 serverSocket=newServerSocket(4567); //调用serverSocket的accept方法,接受客户端所发送的请求 Socketsocket=serverSocket.accept();//阻塞函数 //从socket当中得到inputstream对象 InputStreaminputStream=socket.getInputStream(); Bytebuffer[]newbute[1024*4]; Inttemp=0; //从inputStream当中读取客户端所发送的数据 While((temp=inputStream.read(buffer))!=-1){ System.out,println(newString(buffer,0,temp)); } }catch(Execptione){ e.printStackTrace(); }finally{ Try{ serverSocket.close(); }catch(IOExecptione){ e.printStackTrace(); } } } } TCPClient代码例: Publicstaticvoidmain(String[]args){ Try{ //创建一个Socket对象,指定服务器端的ip地址和端口号 Socketsocket=newSocket("192.168.1.1",4567); //使用InputStream读取硬盘上的文件 InputStreaminputStream=newFileInputStream("F://file/words.txt"); //从Socket上得到outputStream outputStreamoutputStream=socket.getOutputStream(); Bytebuffer[]=newbyte[4*1024]; Inttemp=0; //将inputStream的数据取出并写入到outputStream While((temp=inputStream.read(buffer))!=-1){ outputStream.write(buffer,0,temp); } outpurStream.flush(); }catch(Execptione){ e.printStackTrace(); } } //UDPServer ClassServerThreadextendsThread{ Publicvoidrun(){ Try{ //创建一个DatagramSocket对象,并制定监听端口号 DatagramSocketsocket=newDatagramSocket(4567); Bytedata[]=newbyte[1024]; //创建一个空的DatagramPacket对象 DatagramPacketpacket=newDatagramPacket(data,data.length); //使用receive方法接受客户端所发送的数据 Socket.receive(packet);//阻塞方法 Stringresult=newString(packet.getData(),packet.getOffset(),packet.getLength());//设置数据偏移量,得到该次数据的长度 System.out.println("result-->"+result); }catch(Execptione){ e.printStackTrace(); } } } //UDPClient Publicstaticvoidmain(String[]args){ Try{ //创建一个DatagramSocket对象,并制定监听端口号 DatagramSocketsocket=newDatagramSocket(456 7); InetAddressserverAddress=InetAddress.getByName("192.168.1.1"); Stringstr="hello"; Bytedata[]=str.getBytes(); DatagramPacketpacket=newDatagramPacket(data,data.length,serverAddress,4567); Socket.send(packet); }catch(Execptione){ e.printStackTrace(); } } 4.使用基于UDP协议的Socket 本文转自My_King1 51CTO博客,原文链接:http://blog.51cto.com/apprentice/1360562,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android学习笔记--程序调试

MicrosoftInternetExplorer402DocumentNotSpecified7.8Normal0 1.DDMS的使用 LogCat的VerboseDebugInfoWarningError的功能 增加过滤器createfilter=>system.out 通过fileexplorer功能实现文件的取出,放入 2.常见程序调试 A)多多查看DDMS的log和java中的方式相同 B)使用Log类输出各类信息 本文转自My_King1 51CTO博客,原文链接:http://blog.51cto.com/apprentice/1360570,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android: NDK编程入门笔记

为何要用到NDK? 概括来说主要分为以下几种情况: 1. 代码的保护,由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大。 2. 在NDK中调用第三方C/C++库,因为大部分的开源库都是用C/C++代码编写的。 3. 便于移植,用C/C++写得库可以方便在其他的嵌入式平台上再次使用。 下面就介绍下Android NDK的入门学习过程: 入门的最好办法就是学习Android自带的例子, 这里就通过学习Android的NDK自带的demo程序:hello-jni来达到这个目的。 一、 开发环境的搭建 android的NDK开发需要在linux下进行: 因为需要把C/C++编写的代码生成能在arm上运行的.so文件,这就需要用到交叉编译环境,而交叉编译需要在linux系统下才能完成。 安装android-ndk开发包,这个开发包可以在google android 官网下载: 通过这个开发包的工具才能将android jni 的C/C++的代码编译成库 android应用程序开发环境: 包括eclipse、java、 android sdk、 adt等。 如何下载和安装android-ndk我这里就不啰嗦了,安装完之后,需要将android-ndk的路劲加到环境变量PATH中: sudo gedit /etc/environment 在environment的PATH环境变量中添加你的android-ndk的安装路劲,然后再让这个更改的环境变量立即生效: source /etc/environment 经过了上述步骤,在命令行下敲: ndk-bulid 弹出如下的错误,而不是说ndk-build not found,就说明ndk环境已经安装成功了。 Android NDK: Could not find application project directory ! Android NDK: Please define the NDK_PROJECT_PATH variable to point to it. /home/braincol/workspace/android/android-ndk-r5/build/core/build-local.mk:85: *** Android NDK: Aborting . Stop. 二、代码的编写 1.首先是写java代码 建立一个Android应用工程HelloJni,创建HelloJni.java文件: HelloJni.java : /* * Copyright (C) 2009 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package com.example.hellojni;import android.app.Activity;import android.widget.TextView;import android.os.Bundle;public class HelloJni extends Activity {/** Called when the activity is first created. */ @Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);/* Create a TextView and set its content. * the text is retrieved by calling a native * function. */ TextView tv = new TextView(this); tv.setText( stringFromJNI() ); setContentView(tv); }/* A native method that is implemented by the * 'hello-jni' native library, which is packaged * with this application. */public native String stringFromJNI();/* This is another native method declaration that is *not* * implemented by 'hello-jni'. This is simply to show that * you can declare as many native methods in your Java code * as you want, their implementation is searched in the * currently loaded native libraries only the first time * you call them. * * Trying to call this function will result in a * java.lang.UnsatisfiedLinkError exception ! */public native String unimplementedStringFromJNI();/* this is used to load the 'hello-jni' library on application * startup. The library has already been unpacked into * /data/data/com.example.HelloJni/lib/libhello-jni.so at * installation time by the package manager. */static { System.loadLibrary("hello-jni"); } } 这段代码很简单,注释也很清晰,这里只提两点:: static{ System.loadLibrary("hello-jni"); } 表明程序开始运行的时候会加载hello-jni, static区声明的代码会先于onCreate方法执行。如果你的程序中有多个类,而且如果HelloJni这个类不是你应用程序的入口,那么hello-jni(完整的名字是libhello-jni.so)这个库会在第一次使用HelloJni这个类的时候加载。 public native String stringFromJNI(); public native String unimplementedStringFromJNI(); 可以看到这两个方法的声明中有 native 关键字, 这个关键字表示这两个方法是本地方法,也就是说这两个方法是通过本地代码(C/C++)实现的,在java代码中仅仅是声明。 用eclipse编译该工程,生成相应的.class文件,这步必须在下一步之前完成,因为生成.h文件需要用到相应的.class文件。 2. 编写相应的C/C++代码 刚开始学的时候,有个问题会让人很困惑,相应的C/C++代码如何编写,函数名如何定义? 这里讲一个方法,利用javah这个工具生成相应的.h文件,然后根据这个.h文件编写相应的C/C++代码。 2.1 生成相应.h文件: 就拿我这的环境来说,首先在终端下进入刚刚建立的HelloJni工程的目录: braincol@ubuntu:~$ cd workspace/android/NDK/hello-jni/ ls查看工程文件 braincol@ubuntu:~/workspace/android/NDK/hello-jni$ ls AndroidManifest.xml assets bin default.properties gen res src 可以看到目前仅仅有几个标准的android应用程序的文件(夹)。 首先我们在工程目录下建立一个jni文件夹: braincol@ubuntu:~/workspace/android/NDK/hello-jni$ mkdir jni braincol@ubuntu:~/workspace/android/NDK/hello-jni$ ls AndroidManifest.xml assets bin default.properties gen jni res src 下面就可以生成相应的.h文件了: braincol@ubuntu:~/workspace/android/NDK/hello-jni$ javah -classpath bin -d jni com.example.hellojni.HelloJni -classpath bin:表示类的路劲 -d jni: 表示生成的头文件存放的目录 com.example.hellojni.HelloJni 则是完整类名 这一步的成功要建立在已经在 bin/com/example/hellojni/ 目录下生成了 HelloJni.class的基础之上。 现在可以看到jni目录下多了个.h文件: braincol@ubuntu:~/workspace/android/NDK/hello-jni$ cd jni/ braincol@ubuntu:~/workspace/android/NDK/hello-jni/jni$ ls com_example_hellojni_HelloJni.h 我们来看看com_example_hellojni_HelloJni.h的内容: com_example_hellojni_HelloJni.h : /* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class com_example_hellojni_HelloJni */#ifndef _Included_com_example_hellojni_HelloJni#define _Included_com_example_hellojni_HelloJni#ifdef __cplusplusextern "C" {#endif/* * Class: com_example_hellojni_HelloJni * Method: stringFromJNI * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_example_hellojni_HelloJni_stringFromJNI (JNIEnv *, jobject);/* * Class: com_example_hellojni_HelloJni * Method: unimplementedStringFromJNI * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_example_hellojni_HelloJni_unimplementedStringFromJNI (JNIEnv *, jobject);#ifdef __cplusplus }#endif#endif 上面代码中的JNIEXPORT 和 JNICALL 是jni的宏,在android的jni中不需要,当然写上去也不会有错。 从上面的源码中可以看出这个函数名那是相当的长啊。。。。 不过还是很有规律的, 完全按照:java_pacakege_class_mathod 形式来命名。 也就是说: Hello.java中 stringFromJNI() 方法对应于 C/C++中的 Java_com_example_hellojni_HelloJni_stringFromJNI() 方法 HelloJni.java中的 unimplementedStringFromJNI() 方法对应于 C/C++中的 Java_com_example_hellojni_HelloJni_unimplementedStringFromJNI() 方法 注意下其中的注释: Signature: ()Ljava/lang/String; ()Ljava/lang/String; ()表示函数的参数为空(这里为空是指除了JNIEnv *, jobject 这两个参数之外没有其他参数,JNIEnv*, jobject是所有jni函数必有的两个参数,分别表示jni环境和对应的java类(或对象)本身), Ljava/lang/String; 表示函数的返回值是java的String对象。 2.2 编写相应的.c文件: hello-jni.c : /* * Copyright (C) 2009 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */#include <string.h>#include <jni.h>/* This is a trivial JNI example where we use a native method * to return a new VM String. See the corresponding Java source * file located at: * * apps/samples/hello-jni/project/src/com/example/HelloJni/HelloJni.java */ jstring Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env, jobject thiz ) {return (*env)->NewStringUTF(env, "Hello from JNI !"); } 这里只是实现了Java_com_example_hellojni_HelloJni_stringFromJNI方法,而 Java_com_example_hellojni_HelloJni_unimplementedStringFromJNI 方法并没有实现,因为在HelloJni.java中只调用了stringFromJNI()方法,所以unimplementedStringFromJNI()方法没有实现也没关系,不过建议最好还是把所有java中定义的本地方法都实现了,写个空函数也行啊。。。有总比没有好。 Java_com_example_hellojni_HelloJni_stringFromJNI() 函数只是简单的返回了一个内容为 "Hello from JNI !" 的jstring对象(对应于java中的String对象)。 hello-jni.c文件已经编写好了,现在可以把com_example_hellojni_HelloJni.h文件给删了,当然留着也行,只是我还是习惯把不需要的文件给清理干净了。 3. 编译hello-jni.c 生成相应的库 3.1 编写Android.mk文件 在jni目录下(即hello-jni.c 同级目录下)新建一个Android.mk文件,Android.mk文件是Android 的 makefile文件,内容如下: # Copyright (C) 2009 The Android Open Source Project## Licensed under the Apache License, Version 2.0 (the "License");# you may not use this file except in compliance with the License.# You may obtain a copy of the License at## http://www.apache.org/licenses/LICENSE-2.0## Unless required by applicable law or agreed to in writing, software# distributed under the License is distributed on an "AS IS" BASIS,# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.# See the License for the specific language governing permissions and# limitations under the License.# LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS) LOCAL_MODULE := hello-jni LOCAL_SRC_FILES := hello-jni.cinclude $(BUILD_SHARED_LIBRARY) 这个Androd.mk文件很短,下面我们来逐行解释下: LOCAL_PATH := $(call my-dir) 一个Android.mk 文件首先必须定义好LOCAL_PATH变量。它用于在开发树中查找源文件。在这个例子中,宏函数’my-dir’, 由编译系统提供,用于返回当前路径(即包含Android.mk file文件的目录)。 include $( CLEAR_VARS) CLEAR_VARS由编译系统提供,指定让GNU MAKEFILE为你清除许多LOCAL_XXX变量(例如 LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES, 等等...), 除LOCAL_PATH 。这是必要的,因为所有的编译控制文件都在同一个GNU MAKE执行环境中,所有的变量都是全局的。 LOCAL_MODULE := hello-jni 编译的目标对象,LOCAL_MODULE变量必须定义,以标识你在Android.mk文件中描述的每个模块。名称必须是唯一的,而且不包含任何空格。 注意:编译系统会自动产生合适的前缀和后缀,换句话说,一个被命名为'hello-jni'的共享库模块,将会生成'libhello-jni.so'文件。 重要注意事项: 如果你把库命名为‘libhello-jni’,编译系统将不会添加任何的lib前缀,也会生成 'libhello-jni.so',这是为了支持来源于Android平台的源代码的Android.mk文件,如果你确实需要这么做的话。 LOCAL_SRC_FILES := hello-jni.c LOCAL_SRC_FILES变量必须包含将要编译打包进模块中的C或C++源代码文件。注意,你不用在这里列出头文件和包含文件,因为编译系统将会自动为你找出依赖型的文件;仅仅列出直接传递给编译器的源代码文件就好。 注意,默认的C++源码文件的扩展名是’.cpp’. 指定一个不同的扩展名也是可能的,只要定义LOCAL_DEFAULT_CPP_EXTENSION变量,不要忘记开始的小圆点(也就是’.cxx’,而不是’cxx’) include $(BUILD_SHARED_LIBRARY) BUILD_SHARED_LIBRARY表示编译生成共享库,是编译系统提供的变量,指向一个GNU Makefile脚本,负责收集自从上次调用'include $(CLEAR_VARS)'以来,定义在LOCAL_XXX变量中的所有信息,并且决定编译什么,如何正确地去做。还有 BUILD_STATIC_LIBRARY变量表示生成静态库:lib$(LOCAL_MODULE).a, BUILD_EXECUTABLE 表示生成可执行文件。 3.2 生成.so共享库文件 Andro文件已经编写好了,现在可以用android NDK开发包中的 ndk-build脚本生成对应的.so共享库了,方法如下: braincol@ubuntu:~/workspace/android/NDK/hello-jni/jni$ cd .. braincol@ubuntu:~/workspace/android/NDK/hello-jni$ ls AndroidManifest.xml assets bin default.properties gen jni libs obj res src braincol@ubuntu:~/workspace/android/NDK/hello-jni$ ndk-build Gdbserver : [arm-linux-androideabi-4.4.3] libs/armeabi/gdbserver Gdbsetup : libs/armeabi/gdb.setup Install : libhello-jni.so => libs/armeabi/libhello-jni.so 可以看到已经正确的生成了libhello-jni.so共享库了, 我们去 libs/armeabi/ 目录下看看: braincol@ubuntu:~/workspace/android/NDK/hello-jni$ cd libs/ braincol@ubuntu:~/workspace/android/NDK/hello-jni/libs$ ls armeabi braincol@ubuntu:~/workspace/android/NDK/hello-jni/libs$ cd armeabi/ braincol@ubuntu:~/workspace/android/NDK/hello-jni/libs/armeabi$ ls gdbserver gdb.setup libhello-jni.so 4. 在eclipse重新编译HelloJni工程,生成apk eclipse中刷新下HelloJni工程,重新编译生成apk,libhello-jni.so共享库会一起打包在apk文件内。 在模拟器中看看运行结果:

优秀的个人博客,低调大师

Redis自学笔记 --string类型

string类型 set 赋值 get 取值 setnx 先判断是否存在,不存在赋值,存在返回0 setrange 设置指定key的value值的子字符串赋值。 第一个字符为0,数字6代表从第6个开始修改,20代表字符串长度。 mset 一次设置多个key的赋值 msetnx 一次设置多个key的赋值,先判断是否存在,不存在赋值,存在返回0,若其中任何一个存在的话,全部都赋值不成功 。 getset 设置key的值,并返回key的旧值 getrang 获取key的alue值的子字符串。 mget 一次可以获取多个key的值。 incr 对key的值做加操作,并且返回新的值 incrby 同incr相似,加指定值,key不存在的时候会设置key,并认为原来的value是0 decr 与incre相似,最减法操作 decrby 与incrby相似,减去指定值 append 给指定key的字符串追加value strlen 取指定key的value值的长度 本文转自我爱物联网博客园博客,原文链接:http://www.cnblogs.com/yydcdut/p/3583686.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

MongoDB学习笔记(一)--基础

Insert MongoDB在执行插入时,首先会将插入的数据转换成BSON格式。然后MongoDB数据库会对BSON进行解剖,并检查是否存在_id建。 >doc = { "_id" : 1, "author" : "yyd", "title" : "MongoDB Test", "text" : "this is a test", "tags" : [ "love", "test" ], "comments" : [ { "author" : "yyd_guest", "comment" : "yes" }, { "author" : "yyd_admin", "comment" : "no" } ] } > db.yyd.insert(doc); Query 全部查找 返回除了 tags 字段外的所有字段 返回 tags = test 除了 comments 的所有列 返回 id=1 的 title 字段 <, <=, >, >= 大于 $gt、小于 $lt、大于等于 $gte、小于等于 $lte $all $all 操作类似$in 操作,但是不同的是,$all 操作要求数组里面的值全部被包含在返回的记录里面。 $exists $exists 操作检查一个字段是否存在。 $exists:true代表返回存在这个键的值。 $exists:false代表返回不存在这个键的值。 $mod > db.user.find("this._id%2==1"); > db.user.find({_id:{$mod:[2,1]}}); 两句话一样的效果。 $ne $ne 意思是 not equal,不等于。 $in $in 操作类似于传统关系数据库中的 IN。 $nin $nin 跟$in 操作相反。 $or $nor $nor 跟$or 相反。 $size $size 操作将会查询数组长度等于输入参数的数组。 skip 跳过前 2 条记录。 limit 每页返回 3 条记录 sort() sort()方法对返回记录集按照指定字段进行排序返回,1 表示升序,-1 表示降序。 count() count()方法返回查询记录的总数目。 Remove Update update() db.collection.update( criteria, objNew, upsert, multi ) 参数说明: Criteria:用于设置查询条件的对象 Objnew:用于设置更新内容的对象 Upsert:如果记录已经存在,更新它,否则新增一个记录 Multi:如果有多个符合条件的记录,全部更新 注意:默认情况下,只会更新第一个符合条件的记录 save() 如果存在更新它,如果不存在,新增记录。 $inc 增加1,对int等有效。 对一个_id=3 的 user 的年龄进行加 1,两种方法。 $set { $set : { field : value } } 把 field 的值设置成 value,当 field 不存在时,增加一个字段,类似 SQL 的 set 操作,value 支持所有类型。 $unset { $unset : { field : 1} } 删除给定的字段 field。 $push { $push : { field : value } } 如果 filed 是一个已经存在的数组,那么把 value 追加给 field; 如果 field 原来不存在,那么新增 field 字段,把 value 的值赋给 field; 如果 field 存在,但是不是一个数组,将会出错。 $pushAll { $pushAll : { field : value_array } } 功能同$push,只是这里的 value 是数组,相当于对数组里的每一个值进行$push操作。 $addToSet { $addToSet : { field : value } } 如果 filed 是一个已经存在的数组,并且 value 不在其中,那么把 value 加入到数组; 如果 filed 不存在,那么把 value 当成一个数组形式赋给 field;$pop 如果 field 是一个已经存在的非数组类型,那么将会报错。 $pop { $pop : { field : 1 } } 删除数组中最后一个元素 { $pop : { field : -1 } } 删除数组中第一个元素 $pull { $pull : { field : _value } } 如果 field 是一个数组,那么删除符合_value 检索条件的记录; 如果 field 是一个已经存在的非数组,那么会报错。 $pullAll { $pullAll : { field : value_array } } $rename { $rename : { old_field_name : new_field_name } 重命名指定的字段名称。 本文转自我爱物联网博客园博客,原文链接:http://www.cnblogs.com/yydcdut/p/3557414.html,如需转载请自行联系原作者

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册