??xml version="1.0" encoding="utf-8" standalone="yes"?> 一、关于AndroidManifest.xml AndroidManifest.xml 是每个androidE序中必ȝ文g。它位于整个目的根目录Q描qCpackage中暴露的lgQactivities, services, {等Q,他们各自的实现类Q各U能被处理的数据和启动位|?除了能声明程序中的Activities, ContentProviders, Services, 和Intent Receivers,q能指定permissions和instrumentationQ安全控制和试Q?/p>
二、AndroidManifest.xmll构 <?xmlversion="1.0"encoding="utf-8"?> <manifest> <application> <activity> <intent-filter> <action/> <category/> </intent-filter> </activity> <activity-alias> <intent-filter></intent-filter> <meta-data/> </activity-alias> <service> <intent-filter></intent-filter> <meta-data/> </service> <receiver> <intent-filter></intent-filter> <meta-data/> </receiver> <provider> <grant-uri-permission/> <meta-data/> </provider> <uses-library/> </application> <uses-permission/> <permission/> <permission-tree/> <permission-group/> <instrumentation/> <uses-sdk/> <uses-configuration/> <uses-feature/> <supports-screens/> </manifest> 三、各个节点的详细介绍 上面是整个am(androidManifest).xml的结构,下面以外向内开始阐qͽ?/p>
1、第一?<Manifest>):(属? <manifest xmlns:android=" package="com.woody.test" A、xmlns:android 定义android命名I间Q一般ؓhttp://schemas.android.com/apk/res/androidQ这样得Android中各U标准属性能在文件中使用Q提供了大部分元素中的数据?/p>
指定本应用内javaȝ序包的包名,它也是一个应用进E的默认名称 表明数据权限Q因为默认情况下QAndroidl每个APK分配一个唯一的UserIDQ所以是默认止不同APK讉K׃n数据的。若要共享数据,W一可以采用Share PreferenceҎQ第二种可以采用sharedUserId了,不同APK的sharedUserId都设ZP则这些APK之间可以互相共享数据了。详见:http://wallage.blog.163.com/blog/static/17389624201011010539408/ D、sharedUserLabel 一个共享的用户名,它只有在讄了sharedUserId属性的前提下才会有意义 是给讑֤E序识别版本(升)用的必须是一个intergerg表app更新q多次Q比如第一版一般ؓ1Q之后若要更新版本就讄?Q?{等。。?/p>
q个名称是给用户看的Q你可以你的APP版本可|ؓ1.1版,后箋更新版本讄?.2?.0版本{等。。?/p>
安装参数Q是Android2.2中的一个新Ҏ,installLocation有三个值可以选择QinternalOnly、auto、preferExternal 选择preferExternal,pȝ会优先考虑APK安装到SD卡上(当然最l用户可以选择为内部ROM存储上,如果SD存储已满Q也会安装到内部存储? 选择autoQ系l将会根据存储空间自己去适应 选择internalOnly是指必须安装到内部才能运?/p>
(注:需要进行后台类监控的APP最好安装在内部Q而一些较大的游戏APP最好安装在SD卡上。现默认为安装在内部Q如果把APP安装在SD卡上Q首先得讄你的level?Qƈ且要配置android:installLocationq个参数的属性ؓpreferExternal) 一个AndroidManifest.xml中必d有一个Application标签Q这个标{֣明了每一个应用程序的lg及其属?如icon,label,permission{? <application android:allowClearUserData=["true" | "false"] A、android:allowClearUserData('true' or 'false') 用户是否能选择自行清除数据Q默认ؓtrueQ程序管理器包含一个选择允许用户清除数据。当为trueӞ用户可自己清理用h据,反之亦然 是否允许activity更换从属的Q务,比如从短信息d切换到浏览器d q也是Android2.2中的一个新Ҏ,讄该APP的备份,属性值应该是一个完整的cdQ如com.project.TestCaseQ此属性ƈ没有默认|q且cd必须得指?是个备份工P数据备份到云端的操? q个从字面上可以看出是什么作用的Q当讄为trueӞ表明该APP在手Z可以被调试。默认ؓfalse,在false的情况下调试该APPQ就会报以下错误Q?/p>
Device XXX requires that applications explicitely declare themselves as debuggable in their manifest. Application XXX does not have the attribute 'debuggable' set to TRUE in its manifest and cannot be debugged. 此两个属性都是ؓ许可提供的,均ؓ字符串资源,当用户去看许可列?android:label)或者某个许可的详细信息(android:description)Ӟq些字符串资源就可以昄l用戗label应当量短,之需要告知用戯许可是在保护什么功能就行。而description可以用于具体描述获取该许可的E序可以做哪些事情,实际上让用户可以知道如果他们同意E序获取该权限的话,该程序可以做什么。我们通常用两句话来描q许可,W一句描q该许可Q第二句警告用户如果批准该权限会可能有什么不好的事情发生 Androidpȝ是否能够实例化该应用E序的组Ӟ如果为trueQ每个组件的enabled属性决定那个组件是否可以被 enabled。如果ؓfalseQ它覆盖lg指定的|所有组仉是disabled?/p>
表示此APP是否包含M的代码,默认为trueQ若为falseQ则pȝ在运行组件时Q不会去试加蝲M的APP代码 一个应用程序自w不会含有Q何的代码Q除非内|组件类Q比如Activityc,此类使用了AliasActivityc,当然q是个罕见的现象 (在Android2.3可以用标准C来开发应用程序,可在androidManifest.xml中将此属性设|ؓfalse,因ؓq个APP本n已经不含有Q何的JAVA代码? H、android:icon q个很简单,是声明整个APP的图标,囄一般都攑֜drawable文g夹下 I、android:killAfterRestore J、android:manageSpaceActivity K、android:name 为应用程序所实现的Application子类的全名。当应用E序q程开始时Q该cd所有应用程序组件之前被实例化? 若该c?比方androidMainc?是在声明的package下,则可以直接声明android:name="androidMain",但此cL在package下面的子包的话,必d明ؓ全\径或android:name="package名称.子包名成.androidMain" L、android:permission 讄许可名,q个属性若?lt;application>上定义的话,是一个给应用E序的所有组件设|许可的便捷方式Q当然它是被各组件设|的许可名所覆盖?/p>
M、android:presistent 该应用程序是否应该在M时候都保持q行状?默认为false。因为应用程序通常不应该设|本标识Q持l模式仅仅应该设|给某些pȝ应用E序才是有意义的? N、android:process 应用E序q行的进E名Q它的默认gؓ<manifest>元素里设|的包名Q当然每个组仉可以通过讄该属性来覆盖默认倹{如果你想两个应用程序共用一个进E的话,你可以设|他们的android:process相同Q但前提条g是他们共享一个用户ID及被赋予了相同证书的时?/p>
O、android:restoreAnyVersion 同样也是android2.2的一个新Ҏ,用来表明应用是否准备试恢复所有的备䆾Q甚臌备䆾是比当前讑֤上更要新的版本,默认是false P、android:taskAffinity 拥有相同的affinity的Activity理论上属于相同的TaskQ应用程序默认的affinity的名字是<manifest>元素中设定的package?/p>
是一个资源的风格Q它定义了一个默认的主题风格l所有的activity,当然也可以在自己的theme里面去设|它Q有点类似style?/p>
3、第三层(<Activity>):属?/p>
<activity android:allowTaskReparenting=["true" | "false"] (注:有些在application中重复的׃多阐qC) 1、android:alwaysRetainTaskState 是否保留状态不变, 比如切换回home, 再从新打开Qactivity处于最后的状态。比如一个浏览器拥有很多状?当打开了多个TAB的时?Q用户ƈ不希望丢p些状态时Q此时可此属性设|ؓtrue 2、android:clearTaskOnLaunch 3、android:configChanges 当配|list发生修改Ӟ 是否调用 onConfigurationChanged() Ҏ 比如 "locale|navigation|orientation". 4、android:excludeFromRecents 是否可被昄在最q打开的activity列表里,默认是false 5、android:finishOnTaskLaunch 当用户重新启动这个Q务的时候,是否关闭已打开的activityQ默认是false 如果q个属性和allowTaskReparenting都是true,q个属性就是王牌。Activity的亲和力被忽略。该Activity已经被摧毁ƈ非re-parented 在多Activity开发中Q有可能是自己应用之间的Activity跌{Q或者夹带其他应用的可复用Activity。可能会希望跌{到原来某个Activity实例Q而不是生大量重复的Activity。这需要ؓActivity配置特定的加载模式,而不是用默认的加蝲模式 Activity有四U加载模式: standard、singleTop、singleTask、singleInstance(其中前两个是一l、后两个是一l?Q默认ؓstandard standardQ就是intent发送给新的实例Q所以每ơ蟩转都会生成新的activity?/p>
singleTopQ也是发送新的实例,但不同standard的一ҎQ在h的Activity正好位于栈顶?配置成singleTop的Activity)Q不会构造新的实?/p>
singleTaskQ和后面的singleInstance都只创徏一个实例,当intent到来Q需要创|ؓsingleTask的Activity的时候,pȝ会检查栈里面是否已经有该Activity的实例。如果有直接intent发送给它?/p>
singleInstanceQ?/p>
首先说明一下taskq个概念QTask可以认ؓ是一个栈Q可攑օ多个Activity。比如启动一个应用,那么Android创Z一个TaskQ然后启动这个应用的入口ActivityQ那在它的界面上调用其他的Activity也只是在q个task里面。那如果在多个task中共享一个Activity的话怎么办呢。D个例来说Q如果开启一个导游服务类的应用程序,里面有个Activity是开启GOOGLE地图的,当按下home键退回到主菜单又启动GOOGLE地图的应用时Q显C的是刚才的地图,实际上是同一个ActivityQ实际上q就引入了singleInstance。singleInstance模式是该Activity单独攑օ一个栈中,q样q个栈中只有q一个ActivityQ不同应用的intent都由q个Activity接收和展C,q样做C׃n。当然前提是q些应用都没有被销毁,所以刚才是按下的HOME键,如果按下了返回键Q则无效 7、android:multiprocess 是否允许多进E,默认是false 具体可看该篇文章Q?a >http://www.bangchui.org/simple/?t3181.html 8、android:noHistory 当用户从Activity上离开q且它在屏幕上不再可见时QActivity是否从Activity stack中清除ƈl束。默认是false。Activity不会留下历史痕迹 9、android:screenOrientation activity昄的模?/p>
默认为unspecifiedQ由pȝ自动判断昄方向 landscape横屏模式Q宽度比高度?/p>
portrait竖屏模式, 高度比宽度大 user模式Q用户当前首选的方向 behind模式Q和该Activity下面的那个Activity的方向一?在Activity堆栈中的) sensor模式Q有物理的感应器来决定。如果用h转设备这屏幕会横竖屏切换 nosensor模式Q忽略物理感应器Q这样就不会随着用户旋{讑֤而更改了 10、android:stateNotNeeded activity被销毁或者成功重启时是否保存状? 11、android:windowSoftInputMode activityȝ口与软键盘的交互模式Q可以用来避免输入法面板遮挡问题QAndroid1.5后的一个新Ҏ?/p>
q个属性能影响两g事情Q?/p>
【A】当有焦点生时QY键盘是隐藏还是显C?/p>
【B】是否减活动主H口大小以便腑ևI间放Y键盘 各值的含义Q?/p>
【A】stateUnspecifiedQY键盘的状态ƈ没有指定Q系l将选择一个合适的状态或依赖于主题的讄 【B】stateUnchangedQ当q个activity出现Ӟ软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显C?/p>
【C】stateHiddenQ用户选择activityӞ软键盘L被隐?/p>
【D】stateAlwaysHiddenQ当该Activityȝ口获取焦ҎQY键盘也L被隐藏的 【E】stateVisibleQY键盘通常是可见的 【F】stateAlwaysVisibleQ用户选择activityӞ软键盘L昄的状?/p>
【G】adjustUnspecifiedQ默认设|,通常ql自行决定是隐藏q是昄 【H】adjustResizeQ该ActivityL调整屏幕的大以便留Y键盘的空?/p>
【I】adjustPanQ当前窗口的内容自动移动以便当前焦点从不被键盘覆盖和用戯L看到输入内容的部?/p>
4、第四层(<intent-filter>) l构图: <intent-filter android:icon="drawable resource" <action /> <category /> <data /> </intent-filter> intent-filter属?/p>
android:priority(解释Q有序广播主要是按照声明的优先别,如A的别高于BQ那么,q播先传lAQ再传给B。优先别就是用讄priority属性来定Q范围是?1000?000Q数大优先U别高) action很简单,只有android:nameq个属性。常见的android:namegؓandroid.intent.action.MAINQ表明此activity是作为应用程序的入口。有关android:name具体有哪些|可参照这个网址Q?a >http://hi.baidu.com/linghtway/blog/item/83713cc1c2d053170ff477a7.html category属?/p>
category也只有android:name属性。常见的android:namegؓandroid.intent.category.LAUNCHER(军_应用E序是否昄在程序列表里) 有关android:name具体有哪些|可参照这个网址Q?a >http://chroya.javaeye.com/blog/685871 data属?/p>
<data android:host="string" ?】每?lt;data>元素指定一个URI和数据类型(MIMEcdQ。它有四个属性scheme、host、port、path对应于URI的每个部分: scheme的g般ؓ"http"Qhost为包名,port为端口号Qpath为具体地址。如Q?a >http://com.test.project:200/folder/etc 其中host和port合v来构成URI的凭?authority)Q如果host没有指定Q则port也会被忽?/p>
要让authority有意义,scheme也必要指定。要让path有意义,scheme+authority也必要指定 ?】mimeTypeQ指定数据类型)Q若mimeType?Image'Q则会从content Provider的指定地址中获取imagecd的数据。还?video'啥的Q若讄为video/mp4Q则表示在指定地址中获取mp4格式的video文g ?】而pathPattern和PathPrefix主要是ؓ了格式化path所使用?/p>
5、第四层<meta-data> <meta-data android:name="string" q是该元素的基本l构.可以包含?lt;activity> <activity-alias> <service> <receiver>四个元素中?/p>
android:nameQ解释:元数据项的名字,Z保证q个名字是唯一的,采用java风格的命名规范,如com.woody.project.fried) android:resource(解释Q资源的一个引用,指定l这个项的值是该资源的id。该id可以通过ҎBundle.getInt()来从meta-data中找到? android:value(解释Q指定给q一的倹{可以作为值来指定的数据类型ƈ且组件用来找回那些值的BundleҎQ[getString],[getInt],[getFloat],[getString],[getBoolean]) <activity-alias android:enabled=["true" | "false"] <intent-filter/> <activity-alias>是ؓactivity创徏快捷方式的,如下实例Q?/p>
<intent-filter> <action android:name="android.intent.action.MAIN" /> </intent-filter> </activity> <activity-alias android:name=".CreateShortcuts" android:targetActivity=".shortcut" android:label="@string/shortcut"> <intent-filter> <action android:name="android.intent.action.CREATE_SHORTCUT" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity-alias> 其中android.targetActivity是指向对应快h式的activity,如上q的shortcut(此Activity? android:label是指快捷方式的名Uͼ而快h式的图标默认是给定的application图标 ?】service与activity同Q与activity不同的是Q它不能自己启动的,q行在后台的E序Q如果我们退出应用时QServiceq程q没有结束,它仍然在后台q行。比如听音乐Q网l下载数据等Q都是由serviceq行?/p>
?】service生命周期QService只承了onCreate(),onStart(),onDestroy()三个ҎQ第一ơ启动ServiceӞ先后调用了onCreate(),onStart()q两个方法,当停止ServiceӞ则执行onDestroy()ҎQ如果Service已经启动了,当我们再ơ启动ServiceӞ不会在执行onCreate()ҎQ而是直接执行onStart()Ҏ ?】service与activity间的通信 Service后端的数据最l还是要呈现在前端Activity之上的,因ؓ启动ServiceӞpȝ会重新开启一个新的进E,q就涉及C同进E间通信的问题了(AIDL)QActivity与service间的通信主要用IBinder负责。具体可参照Q?a >http://zhangyan1158.blog.51cto.com/2487362/491358 ??/p>
<service android:enabled=["true" | "false"] android:exported[="true" | "false"] android:icon="drawable resource" android:label="string resource" android:name="string" android:permission="string" android:process="string"> </service> service标签内的属性之前已有描qͼ在此不重复了?/p>
8、第三层<receiver> receiver的属性与service一Pq里׃昄?/p>
BroadcastReceiverQ用于发送广播,broadcast是在应用E序之间传输信息的一U机Ӟ而BroadcastReceiver是对发送出来的 Broadcastq行qo接受q响应的一cȝӞ具体参照http://kevin2562.javaeye.com/blog/686787 9、第三层<provider>属?/p>
<provider android:authorities="list" android:enabled=["true" | "false"] android:exported=["true" | "false"] android:grantUriPermissions=["true" | "false"] android:icon="drawable resource" android:initOrder="integer" android:label="string resource" android:multiprocess=["true" | "false"] android:name="string" android:permission="string" android:process="string" android:readPermission="string" android:syncable=["true" | "false"] android:writePermission="string"> <grant-uri-permission/> <meta-data/> </provider> contentProvider(数据存储) ?】android:authoritiesQ?/p>
标识q个ContentProviderQ调用者可以根据这个标识来扑ֈ?/p>
?】android:grantUriPermissionQ?/p>
Ҏ个URI授予的权?/p>
?】android:initOrder 10、第三层<uses-library> 用户库,可自定义。所有android的包都可以引?/p>
11、第一?lt;supports-screens> <supports-screens android:smallScreens=["true" | "false"] q是在android1.6以后的新Ҏ,支持多屏q机?/p>
各属性含义:q四个属性,是否支持大屏Q是否支持中屏,是否支持屏Q是否支持多U不同密?/p>
12、第二层<uses-configuration />?lt;uses-feature>性能都差不多 <uses-configuration android:reqFiveWayNav=["true" | "false"] <uses-feature android:glEsVersion="integer" q两者都是在描述应用所需要的g和Y件特性,以便防止应用在没有这些特性的讑֤上安装?/p>
<uses-sdk android:minSdkVersion="integer" 描述应用所需的api levelQ就是版本,目前是android 2.2 = 8Qandroid2.1 = 7Qandroid1.6 = 4Qandroid1.5=3 在此属性中可以指定支持的最版本,目标版本以及最大版?/p>
14、第二层<instrumentation /> <instrumentation android:functionalTest=["true" | "false"] 定义一些用于探和分析应用性能{等相关的类Q可以监控程序。在各个应用E序的组件之前instrumentationc被实例?/p>
android:functionalTest(解释QinstrumentationcL否能q行一个功能测试,默认为false) 15?lt;permission>?lt;uses-permission>?lt;permission-tree />?lt;permission-group />区别?/p>
最常用的当?lt;uses-permission>Q当我们需要获取某个权限的时候就必须在我们的manifest文g中声明,?lt;uses-permission>?lt;application>同Q具体权限列表请看此?/p>
通常情况下我们不需要ؓ自己的应用程序声明某个权限,除非你提供了供其他应用程序调用的代码或者数据。这个时候你才需要?lt;permission> q个标签。很昄q个标签可以让我们声明自q权限。比如: <permission android:name="com.teleca.project.MY_SECURITY" . . . /> 那么在activity中就可以声明该自定义权限了,如: <activity android:name="XXX" . . . > android:permission="com.teleca.project.MY_SECURITY"> </activity> </application> 当然自己声明的permission也不能随意的使用Q还是需要?lt;uses-permission>来声明你需要该权限 <permission-group> 是声明一个标{,该标{代表了一lpermissionsQ?lt;permission-tree>是ؓ一lpermissions声明了一个namespace。这两个标签可以看之前的pd文章?br />
android:sharedUserId="string"
android:sharedUserLabel="string resource"
android:versionCode="integer"
android:versionName="string"
android:installLocation=["auto" | "internalOnly" | "preferExternal"] >
</manifest>
B、package
C、sharedUserId
E、versionCode
F、versionName
G、installLocation
2、第二层(<Application>):属?/p>
android:allowTaskReparenting=["true" | "false"]
android:backupAgent="string"
android:debuggable=["true" | "false"]
android:description="string resource"
android:enabled=["true" | "false"]
android:hasCode=["true" | "false"]
android:icon="drawable resource"
android:killAfterRestore=["true" | "false"]
android:label="string resource"
android:manageSpaceActivity="string"
android:name="string"
android:permission="string"
android:persistent=["true" | "false"]
android:process="string"
android:restoreAnyVersion=["true" | "false"]
android:taskAffinity="string"
android:theme="resource or theme" >
</application>
B、android:allowTaskReparenting('true' or 'false')
C、android:backupAgent
D、android:debuggable
E、android:description/android:label
F、android:enabled
G、android:hasCode('true' or 'false')
Q、android:theme
android:alwaysRetainTaskState=["true" | "false"]
android:clearTaskOnLaunch=["true" | "false"]
android:configChanges=["mcc", "mnc", "locale",
"touchscreen", "keyboard", "keyboardHidden",
"navigation", "orientation", "screenLayout",
"fontScale", "uiMode"]
android:enabled=["true" | "false"]
android:excludeFromRecents=["true" | "false"]
android:exported=["true" | "false"]
android:finishOnTaskLaunch=["true" | "false"]
android:icon="drawable resource"
android:label="string resource"
android:launchMode=["multiple" | "singleTop" |
"singleTask" | "singleInstance"]
android:multiprocess=["true" | "false"]
android:name="string"
android:noHistory=["true" | "false"]
android:permission="string"
android:process="string"
android:screenOrientation=["unspecified" | "user" | "behind" |
"landscape" | "portrait" |
"sensor" | "nosensor"]
android:stateNotNeeded=["true" | "false"]
android:taskAffinity="string"
android:theme="resource or theme"
android:windowSoftInputMode=["stateUnspecified",
"stateUnchanged", "stateHidden",
"stateAlwaysHidden", "stateVisible",
"stateAlwaysVisible", "adjustUnspecified",
"adjustResize", "adjustPan"] >
</activity>
比如 P ?activity, Q 是被P 触发?activity, 然后q回Home, 重新启动 PQ是否显C?Q
q个我用q?主要用来看手机方向改变的. android手机在旋转后,layout会重新布局, 如何做到?
正常情况? 如果手机旋{?当前Activity后杀?然后Ҏ方向重新加蝲q个Activity. ׃从onCreate开始重新加?
如果你设|了 q个选项, 当手机旋转后,当前Activity之后调用onConfigurationChanged() Ҏ. 而不跑onCreateҎ{?
6、android:launchMode(Activity加蝲模式)
android:label="string resource"
android:priority="integer" >
Intent filter内会讑֮的资料包括action,data与category三种。也是说filter只会与intent里的q三U资料作Ҏ动作
action属?/p>
android:mimeType="string"
android:path="string"
android:pathPattern="string"
android:pathPrefix="string"
android:port="string"
android:scheme="string"/>
scheme://host:port/path
android:resource="resource specification"
android:value="string"/>
6、第三层<activity-alias>属?/p>
android:exported=["true" | "false"]
android:icon="drawable resource"
android:label="string resource"
android:name="string"
android:permission="string"
android:targetActivity="string">
<meta-data/>
</activity-alias>
<activity android:name=".shortcut">
7、第三层<service>
android:normalScreens=["true" | "false"]
android:largeScreens=["true" | "false"]
android:anyDensity=["true" | "false"] />
android:reqHardKeyboard=["true" | "false"]
android:reqKeyboardType=["undefined" | "nokeys" | "qwerty" | "twelvekey"]
android:reqNavigation=["undefined" | "nonav" | "dpad" | "trackball" | "wheel"]
android:reqTouchScreen=["undefined" | "notouch" | "stylus" | "finger"] />
android:name="string"
android:required=["true" | "false"] />
13、第二层<uses-sdk />
android:targetSdkVersion="integer"
android:maxSdkVersion="integer"/>
android:handleProfiling=["true" | "false"]
android:icon="drawable resource"
android:label="string resource"
android:name="string"
android:targetPackage="string"/>
<application . . .>
文章转蝲自:
]]>
]]>Null value was assigned to a property of primitive
癑ֺ了一下,发现?br />
javabean.hbm.xml
type="int" 改ؓtype="java.lang.Integer"
javabean
或者直接徏库的时候设定全部数值类型默认ؓ0好Q?img src ="http://www.aygfsteel.com/jay485584/aggbug/362391.html" width = "1" height = "1" />
]]>
]]>
优于WindowsC本的一个文本编辑器Q完全免费且开源,对于不同的编E语a可以实现语法高亮Q代码折叠以及宏Qv可定制性非常强?/p>
Emacs (所有^?
Emacs文本~辑器深受高U程序员的喜爱,h内置的宏功能以及强大的键盘命令,q对于编辑代码来说真是一Un受,q个E序几乎被移植到了每一个^収ͼq有多个发行版,其中最行的是GNU Emacs?a >XEmacsQ它们是跨^台、完全免费ƈ且开源?/p>
UltraEdit (Windows)
UltraEdit是一?9.95元的共享YӞ也提供了友好界面的编E编辑器Q支持语法高亮,代码折叠和宏Q以及一大堆其他的功能,内置了对于HTML、PHP和JavaScript{语法的支持Q和其类似的一个共享Y件EditPlus也不错?/p>
TextMate (Mac OS X)
价?3元的TextMate功能强大且更具吸引力Q其界面很具吸引力,在短短几q中p得了大量的爱好者。Windows用户如果喜欢TextMate的话可以试用一下类似TextMate?a target="_blank" >E Text Editor?/p>
Vim (所有^?
和Emacs一PVim以键盘宏而广受欢q,做ؓ著名的老牌~辑器Vi的后代,Vim很适合键盘操作的程序员的口呟뀂Vim的可定制性很强,Windows用户可以试试gVim ?a target="_blank" >gVim Portable QMac用户则有MacVim。如果你只是需要Vim最有特色的部分的轻量型~辑器,可以试试Cream ?/p>
TextPad (Windows)
ZWindows的共享Y件TextPad售h32.5元Q它同样拥有适合E序员的多种功能Q语法高亮,代码拦截以及宏,TextPadh不错的搜索能力和易用性?/p>
英文原文Q?a target="_blank" >Best Text Editors
中文译Q?a target="_blank" >William Long
中文译文Q?a target="_blank" >五个最佳编E文本编辑器