TextMate for PHP Development

TextMate for PHP Development

If you want to improve your productivity and programming skills in general, getting to know better the tools you use every day is one of  the important things to invest your time in. Keyboard shortcuts of your favorite editor are especially important and using them in your daily routine will save you lot of hand movements towards mouse, lot of context switching and will help you focus on what is important. I use TextMate for everyday PHP development and I find it excellent. There are some features that more complex IDEs provide out of the box, but after you get used to work with TextMate and learn how to be productive you can hardly find better option. Keyboard shortcuts are one of its good parts and key to boosting your productivity. There are some general purpose shortcuts that will work on any type of document, therefore on PHP files as well. Regarding the notation: A + B means press in same time, A -> B means type A and then after it press B
  • mate filename1 filename2 - you can always start TextMate from command line and give list of files/folders to open
  • open projectname.tmproj - if you saved your TextMate project to a file, which is good way to preserve custom project configuration, you can open it from shell with standard OSX open command
  • Cmd + T - search for file in the project
  • Cmd + Shift + F - search for a given string through all files in the project
  • Cmd + F - regular search for a given string in current file
  • Ctrl + S - faster way to search for strings in current file. Notice the input text box at the bottom of you TextMate window. Hit Esc to get out of fast search mode.
  • Cmd + Shift + T - search for a function/class name in current file
  • Cmd + Ctrl + R - see where the current file is in the project folder tree.
  • Ctrl + W - select whole word under cursor
  • Ctrl + Shift + A - gives you the list of SVN commands to execute on current file or folder if it is selected in project file tree.
  • Ctrl + Shift + G - gives you the list of Git commands to execute on current file or folder if it is selected in project file tree.
  • Alt + Mouse Selection - selecting in vertical blocks has never been easier, and editing afterwards as well :)
  • Set of shortcuts for doing fast search and replace
    • Cmd + E - set keyword to be replaced
    • Shift + Cmd + E - set replacement word
    • Ctrl + Cmd + F - replace in current file
    • Ctrl + Shift + Cmd + F - replace in selection only

Great thing about TextMate is its possibility to be customized for specific needs by adding so called bundles. TextMate comes with default PHP bundle embedded. You can see all the functionalities it provides in TextMate -> Bundles -> Bundle Editor -> Show Bundle Editor or Ctrl + Alt + Cmd + B as shortcut. Here are some interesting ones from this bundle or useful for development in general

  • Esc - hitting escape after you typed couple of letters  will do code completion from the symbols defined in current editing file. Will work as well for native PHP functions. Just start typing mk and hit escape then and it will complete it asmktime :)
  • Alt + Esc - this will give you list of possible completions. After selecting one of them, you’ll get full function signature injected in the document.
  • Ctrl + H - will give you PHP documentation related to the selected word in your current editing document.
  • Ctrl + Shift + V - will check your file for syntax validity.
  • Shift + Cmd + D - will jump to file that is included in the current PHP file.
  • doc -> Tab - if you type word doc above class/method/function and hit Tab after it, you will get documentation block for the related entity.
  • Cmd + Shift + R - will run your file with current system PHP executable. This is very nice when you just test something and want to see the output, but don’t want to get out to shell and command line.
  • Alt + F1 - documentation about function signature in the form of tooltip. If you forgot weather $haystack or $needle goes first as the param in the array function this is easy way not to search through extensive documentation.
  • Shift + Ctrl + T - if you like to place lot of TODOFIXME or CHANGED meta information in your comments for later addressing, this will help you find them quickly and navigate through them easily.

Beside these shortcuts there are a lot of snippets triggered by hitting Tab after typing its abbreviation. For example doc_f -> Tab will create new function together with doc block. You can see list of all of them in the mentioned bundle editor in the section for PHP bundle. It is pretty easy as well to create your own specific snippets. Many more general or specific shortcuts can be found online e.g. as printable cheatsheets. Or in TextMate manual. The best way to adopt them is to take them one by one and pay attention to use it regularly, as soon as it is at the back of the brain start with new one until you become TextMate productivity wizard.

Posted in Uncategorized | Leave a comment

iPhone创建自定义图标和图像

iPhone应用程序的用户界面向来以其精美的图像和丰富的色彩著称。作为应用程序的设计者,您需要提供一个美观的用户界面以融入这样的整体风格。虽然iPhone OS提供了大量精美的用户界面元素,但是每个应用程序仍然需要两个自定义元素:应用程序图标和启动图像。此外,应用程序还应该为iPhone OS提供用于显示在Spotlight搜索结果中的小图标。

有些应用程序需要自定义图标,用于在导航栏,工具栏和标签栏中表示应用程序的特定功能和模式。遵循创建这些图标的准则,您就可以设计出既与内置图标相称,又能巧妙地突显您应用程序风格的图标和图像。

注意: 图标和图像的标准比特深度是24位(其中,红色,绿色和蓝色各占8比特),外加8位的alpha通道。建议您使用PNG格式,因为它保留了颜色深度,并且内置支持ɑ通道。您可以使用预览应用程序产生最终的PNG文件。

您无须将颜色限定在Web安全色内。虽然您可以在为导航栏,工具栏和标签栏创建的图标中使用alpha透明度,但不要在应用程序图标中这么做。

 

应用程序图标

应用程序图标是用户会放置在其主屏幕上的图标,点击该图标可以启动应用程序。在这里您可以将品牌宣传和强烈的视觉效果结合起来,使其简洁,易辨认且引人注目。

用户可以选择想要在主屏幕上显示的应用程序图标,因此您应该设计一个这样的图标:

  • 具有吸引力的,以至于用户觉得应该将它留在主屏幕上

  • 独特的,以便用户可以很容易地在众多的图标中找到它

尽量使您的图标在吸引眼球和表意清晰之间找到平衡点,这样可以使图标既丰富,漂亮,又能传达应用程序的本意。此外,调查一下具有不同文化背景的人们会对您选择的图像和颜色产生哪些不同的理解也是不错的办法。

当用户决定在主屏幕上显示您的应用程序图标时,iPhone OS会自动为其添加一些视觉效果,以便该图标与内置图标保持一致。具体包括:

  • 圆角

  • 阴影

  • 反光

例如,图11-1显示了一个由应用程序提供的简单图标。

图 11-1  一个简单的应用程序图标,未显示在主屏幕之前的样子

图11-2显示了同一个图标被iPhone OS显示在主屏幕时的样子。

图 11-2  一个简单的应用程序图标,显示在主屏幕时的样子

在主屏幕上,具有清晰背景的应用程序图标看起来效果最佳。这主要是因为iPhone OS添加了圆角效果:统一的圆角效果使用户主屏幕上的所有图标都具有一致的可点击外观。如果您创建的图标具有黑色背景,当显示在主屏幕上时,它的背景会消失,用户就无法看到它的圆角效果。这样的图标往往让人觉得是无法点击的,会干扰到主屏幕的次序结构。

为了确保您的图标可以充分利用iPhone OS所提供的视觉增强功能,建议您创建这样的PNG格式图像:

  • 尺寸为57×57像素,90度直角(如果图像使用了其它尺寸,iPhone OS会对其进行调整)

  • 不要使用光晕或者修饰效果

  • 不要使用alpha透明度

将您的图标文件命名为Icon.png,并将它放在应用程序包的顶层。要了解更多与应用程序包的内容相关的信息,请参考iPhone应用程序编程指南中的“应用程序包”一节。

注意:您也可以选择让iPhone OS不要为您的图标添加光晕效果。要做到这一点,您需要在应用程序的Info.plist文件(要了解该文件,请阅读iPhone应用程序编程指南中的“信息属性列表”一节)中添加UIPrerenderedIcon键。

无论您是否使用光晕效果,您的图标都应该采用57 x 57像素。

 

当您提交您的应用程序时,必须包含一个512 x 512像素版本的应用程序图标,用于在App Store中显示。虽然,让用户一眼就能认出这个版本的图标就是您的应用程序的图标非常重要,但这个版本的图标应该更华丽,更精细。换句话说,您不应该只是简单地放大应用程序图标,直接作为您为App Store创建的图标。

如果您正在开发一个私下发布的应用程序(即不通过App Store发布),您也必须提供一个512 x 512像素版本的应用程序图标。在这种情况下,将图标文件命名为iTunesArtwork(没有文件扩展名),并把它放在应用程序包的顶层。这个图标用于在iTunes中标识您的应用程序。

 

 

小图标

每个应用程序都应该提供一个小图标,当应用程序的名称与Spotlight搜索栏中的词条相匹配时,iPhone OS可以显示这个小图标。

具有设置功能的应用程序也应该提供这种小图标,用于在内置的设置应用程序中标识应用程序。

 

您的小图标应该能清晰地标识您的应用程序,以便用户可以在搜索结果列表中明确地识别出来。要做到这一点,您应该创建这样精简而吸引人的图标:

  • 使用PNG格式。

  • 尺寸约为29 x 29像素。

 

将您的图标文件命名为Icon-Small.png,并将它放在应用程序包的顶层。要了解更多与应用程序包的内容相关的信息,请参考iPhone应用程序编程指南中的“应用程序包”一节。

注意:如果您没有提供名为Icon-Small.png的图标,并且您的应用程序包中不包含早期版本的名为Icon-Settings.png的小图标的话,那么iPhone OS会将您的应用程序图标进行缩放,用于在搜索结果和设置应用程序中进行显示。

如果您的应用程序包中包含名为Icon-Settings.png的小图标,但是不包含名为Icon-Small.png的图标,那么iPhone OS会在搜索结果中显示设置图标。不过,您应该更新应用程序包,使其只包含Icon-Small.png文件。

 

启动图像

为了增强应用程序启动时的用户体验,您应该提供一个启动图像。启动图像与应用程序的首屏幕看起来非常相似。当用户在主屏幕上点击您的应用程序图标时,iPhone OS会立即显示这个启动图像。一旦准备就绪,您的应用程序就会显示它的首屏幕,来替换掉这个启动占位图像。

一定要强调的是,之所以提供启动图像,是为了改善用户体验,并是为了提供:

  • “应用程序进入体验”,比如启动动画

  • “关于”窗口

  • 品牌宣传元素,除非它们是您应用程序首屏幕的静态组成部分

由于用户可能会频繁,快速地在应用程序之间进行切换,因此,您应该尽一切努力将启动时间降到最短,而且您设计的启动图像应该尽量减轻用户等待的体验,而不是吸引用户的注意力。

要做到这一点,您应该设计这样的PNG格式的图像:

  • 尺寸为320 x 480像素。其中包含的状态栏区可以立即显示您选择的状态栏颜色,而不是等到您的应用程序启动完成后才显示。

  • 与应用程序的首屏幕相同,除了:

    • 文本。启动图像是静态的,因此您在其中显示的任何文本都不会本地化。

    • 可能动态改变的用户界面元素。不要包含在应用程序启动完成后看上去不同的元素,防止用户感觉到启动图像和应用程序首屏幕之间的闪动。

将您的启动图像命名为Default.png,并把它放在您的应用程序包的最顶层。要了解更多与应用程序包的内容相关的信息,请参考iPhone应用程序编程指南

您可能觉得遵循这些准则会导致启动图像显得平淡无趣,然而,实际上正是这样。请记住,启动图像并不是为您提供机会进行艺术展示;它完全是为了增强用户对应用程序能够快速启动并立即投入使用的感知度。下面的例子向您展示了启动图像有多么简单。

第一个例子是内置设置应用程序的启动图像,如图11-3所示。设置应用程序的启动图像只显示了应用程序的背景,因为应用程序中的其他内容都无法保证是静态的。

图 11-3  设置应用程序的启动图像

另一个启动图像的例子源自内置股票应用程序,如图11-4所示。请注意,只有包含在启动图像中的图像才是静态的图像,它们在股票应用程序的正面视图中总是可见的。

图 11-4  股票应用程序的启动图像

导航栏,工具栏和标签栏的图标

如果可能的话,您应该在导航栏,工具栏和标签栏中使用系统提供的按钮和图标。iPhone OS提供了各式各样的标准按钮和图标,用户看到它们就会联想到内置应用程序所支持的标准任务和模式。如果您的应用程序支持一些标准功能(比如刷新内容区视图或删除一项),或者会显示不同的数据子集(比如联系人或书签),一定要使用系统提供的相应按钮或图标来表示它们。关于标准按钮和图标的完整列表,以及如何使用它们的指南,请参考“系统提供的按钮和图标”

当然,并不是应用程序所执行的每个任务都是一个标准功能。如果您的应用程序支持一些用户需要频繁执行的自定义任务,您需要创建自定义的图标,用于在工具栏或导航栏中代表这些任务。同样,如果您的应用程序显示了标签栏,允许用户在自定义的应用程序模式之间,或者自定义的数据子集之间进行切换,你需要设计自定义的标签栏图标,用于清晰地描述这些模式和子集。本节向您介绍如何设计出能够很好地用于导航栏,工具栏和标签栏的图标。

在您为图标创建美术图案之前,您需要花些时间想想该图标应该传达些什么信息。当您考虑设计的时候,请以这样的图标为目标:

  • 简明扼要。太多的细节会使图标显得杂乱或是难以理解。

  • 不会被误认为是系统提供的图标。用户应该能够一眼就将您的自定义图标与标准图标区分开。

  • 易于理解且广为接受。请尽力创建一个能够被大多数用户正确理解,不会令任何用户反感的符号。

在您确定了图标的外观之后,请在创建时遵循以下准则:

  • 使用PNG格式。

  • 使用带有适当alpha透明度的纯白色。

  • 不要添加阴影效果。

  • 使用抗锯齿效果。

  • 如果您要添加斜边效果,请确保角度为90°(为了便于理解和操作,您可以想象在图标的顶部有一处光源)。

  • 对于工具栏和导航栏图标,尺寸应为20 x 20像素。

    对于标签栏图标,尺寸应为30 x 30像素的图标。

注意:您为工具栏,导航栏和标签栏提供的图标在您的应用程序中将用做创建图标的蒙板。没必要创建全彩色的图标。

 

 

iPhone OS自动为导航栏,工具栏和标签栏中的项目提供了被按下或被选中时的外观,因此您只需要提供图标的单个版本。由于这些视觉效果是自动呈现的,您无法改变它们的外观。


Posted in iphone | Leave a comment

在ARC下使用asihttp等框架的方法

1、创建一个静态库工程模板,不要选择Arc选项
2、加入asihttp的文件(不知道加入哪些吗?去看asihttp官网吧)
3、编译后得到asihttp的.a文件,这个就是静态库文件

4、将.a文件加入你的工程依赖,具体的地方最好是自己找,这样印象深刻。。。
5、记得把.h的头文件加入你的工程当中,要不就一个.a文件怎么用啊,哈哈

It’s very easy to use asi-http-request in an ARC environment without changing anything, simply follow these steps:

Simply create a static library target.
Add asi-http-request files as required to the library target
Configure the target to build without ARC
Add that static library as a dependency to your app target
Add that static library in the build phases link section.

直接加-fno-objc-arc到asi的compiler flag不就行了

Posted in iphone | Leave a comment

个人常用 OS X 软件集合

用了 OS X 已经半年多了,整理下日常常用的软件。大多数都是开源或者免费软件,少数需要购买

  • AppCleaner:卸载软件必备,适合用于第三方安装和 App Store
  • aliwangwang:淘宝用户必备
  • DiffMerge:文件、文件夹对比的工具,貌似对中文支持有问题(没有细研究)
  • Dropbox:改 hosts 还能继续用的多平台文件云同步软件
  • DoubanFM:豆瓣电台
  • Cdto:可以快速从 Finder 切换当前路径到 terminal 里
  • Evernote:笔记整理同步必备
  • Facetime:大家都知道,免费版, HD 是收费版
  • Firefox:就是一火狐
  • FIT:免费开源的 OSX 输入法
  • fraise:文本编辑器,个人比较喜欢,比 TextWrangler 好用
  • git:SCM 软件
  • brew:terminal 下的软件包管理器
  • Chrome:浏览网页的神器
  • Growl:消息半透明窗提醒,Ubuntu 都模仿
  • iOS Simulator Cropper:可以截 iOS 模拟器截图
  • iTerm:Cocoa 重写的 Terminal,支持 Linux 下快捷键切换 Tab
  • MesaSQLite:SQLite 数据库管理软件
  • MPlayerX:视频播放器
  • mysql workbench:Mysql 建模软件
  • OmniDiskSweeper:磁盘空间使用率情况
  • PHPStorm:Jetbrain 的新一神器,PHP IDE(收费)
  • PlistEditPro:plist 编辑器
  • PowerWord:金山词霸(最新版是 08 年,汗颜)
  • Reeder:Google Reader for OSX
  • Sequel pro:Mysql 数据库管理软件
  • SIMBL
  • Simple Comic:漫画软件
  • Skitch:处理截图的好工具
  • Sparrow:Gmail 客户端
  • TextWrangler:又一文本编辑器
  • The Unarchiver: 最智能且免费的解压缩软件
  • TotalFinder:Finder 增强型工具,强烈推荐(收费)
  • VirtualBox:开源虚拟机
  • Xcode 4:Apple 开发必备
Posted in iphone | Leave a comment

xcode 4.2 破解及真机调试

网上有不少关于xocde3.x真机调试的文章,但鲜有xcode4.2相关的资料。参考了一些文章,终于可以在xcode4.2上进行真机调试了,在此记录下。

我会分几步来说明。值得说明的是,要想真机调试,ios device必须事先越狱 :-)

 

1.创建证书,这个没什么好说的,网上资料一大堆,只要别写错名字就好,证书名一定要为 iPhone Developer

 

2.破解ios sdk及其xcode的相关配置文件(双击配置文件就可以打开,注意SDKSettings.plist有权限控制)

修改/Developer/Platforms/iPhoneOS.platform目录下的Info.plist文件,将其中的 XCiPhoneOSCodeSignContext 都改为XCCodeSignContext

修改/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk目录下的SDKSettings.plist文件,修改如下字段:

<key>CODE_SIGNING_REQUIRED</key>
<string>NO</string>

<key>ENTITLEMENTS_REQUIRED</key>
<string>NO</string>

 

3.破解xcode二进制文件。建立一个crack文件,内容如下:

#!/bin/bash
cd /Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/PrivatePlugIns/iPhoneOS\ Build\ System\ Support.xcplugin/Contents/MacOS/
dd if=iPhoneOS\ Build\ System\ Support of=working bs=500 count=255
printf "xc3x26x00x00" >> working
/bin/mv -n iPhoneOS\ Build\ System\ Support iPhoneOS\ Build\ System\ Support.original
/bin/mv -n working iPhoneOS\ Build\ System\ Support
chmod a+x iPhoneOS\ Build\ System\ Support

然后执行 chmod +x crack

执行./crack,没错误就正常

 

4.修改xcode工程配置文件

1) 下载脚本

打开终端,执行如下操作

cd  /Developer
mkdir xcode-crack
cd xcode-crack
curl -O http://www.alexwhittemore.com/iphone/gen_entitlements.txt
mv gen_entitlements.txt gen_entitlements.py
chmod 777 gen_entitlements.py

2) 禁用Xcode自动的签名操作

将工程配置中所有的Code Signing选项全部设为Don’t Code Sign,如图。可能需要先点击“All”让这个选项显示出来

3)添加自定义的生成后脚本

在Build Phases中添加一个Phase,右下角的Add Build Phase,然后单击Add Run Script,输入以下脚本(如图)

export CODESIGN_ALLOCATE=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate
if [ "${PLATFORM_NAME}" == "iphoneos" ]; then
/Developer/xcode-crack/gen_entitlements.py "my.company.${PROJECT_NAME}" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/${PROJECT_NAME}.xcent";
codesign -f -s "iPhone Developer" --entitlements "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/${PROJECT_NAME}.xcent" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/"
fi

 

5。打包应用程序,生成ipa文件

在xcode上选择product菜单,选择Build For —> Build for Achiving,就能成ipa文件了。如图:

 

可以将这个文件拖到itunes,就可以生成一个ipa文件,如图:

 

至此,我们就可以随心所欲地开发并调试ios程序了,并可以将打包好的ipa文件分享给他人 :-)

 

旁门左道生成IPA文件
如果我的程序调试好了,怎么才能发给别人用呢?正常情况下IPA文件是从Xcode的Organizer中输出的,但是我们没有证书,这样输出会产生错误。我们只能用个小trick来完成这个操作了。
先将代码生成为Release目标,然后打开工程的输出文件夹,通常情况下这个目录是
/Users/你都用户名/Library/Developer/Xcode/DerivedData/以工程名打头的文件夹/Build/Products/Release-iphoneos
很纠结吧~这个目录下有个.app的文件,就是生成的程序了。把这个.app拖到iTunes中,它会出现在应用程序那个列表中,然后再把它从iTunes的那个列表中拖出来(比如拖到桌面),发生了什么?哈哈,它就这样变成.ipa了!
把这个.ipa发给朋友,大家就可以跟您一起分享这个程序了。

参考了http://kqwd.blog.163.com/blog/static/4122344820117191351263/  在此表示感谢!

相关文件我放在115网盘了,请猛击 http://115.com/file/dn97kaah#xcode.tar.gz

Posted in iphone, Uncategorized | Leave a comment

Xcode开发环境 理解 Xcode 工程

Xcode是一个强大的专业开发工具,可以简单快速、而且以您熟悉的方式执行绝大多数常见的软件开发任务。相对于创建单一类型的应用程序所需要的能力而言,Xcode要强大得多,它的设计目的是使您可以创建任何想像得到的软件产品类型,从Cocoa及Carbon应用程序,到内核扩展及Spotlight导入器等各种开发任务,Xcode都能完成。

Xcode独具特色的用户界面可以帮助您以各种不同的方式来漫游工程中的代码,并且使您可以访问工具箱下面的大量功能,包括GCC,javac,jikes,和GDB,这些功能都是制作软件产品需要的。它是一个由专业人员设计的、又由专业人员使用的工具。

由于能力出众,Xcode已经被Mac开发者社区广为采纳。而且随着苹果电脑向基于Intel的Macintosh迁移,转向Xcode变得比以往的任何时候更加重要。这是因为使用Xcode可以创建通用的二进制代码,这里所说的通用二进制代码是一种可以把PowerPC和Intel架构下的本地代码同时放到一个程序包的执行文件格式。事实上,对于还没有采用Xcode的开发人员,转向Xcode是将应用程序连编为通用二进制代码的第一个必要的步骤。

无论您是已经有一定Xcode经验的开发者,还是刚刚开始迁移的新用户,都需要对Xcode的用户界面及如何用Xcode组织软件工程有一些理解,这样才能真正高效地使用这个工具。这种理解可以大大加深您对隐藏在Xcode背后的哲学的认识,并帮助您更好地使用Xcode。

Xcode 工程定义的信息

在Xcode中的所有活动,从文件的创建和编辑,到应用程序的连编和调试,都是围绕着工程来进行的。Xcode工程对创建软件产品需要用到的文件和资源进行组织,并使您可以对其进行访问。无论您创建的是什么样的产品,Xcode都会为您管理三种类型的信息:

源文件的引用,包含源代码、图像、本地化的字符串文件、数据模型、以及更多的信息。

目标,定义要制作的产品。目标将制作产品需要的文件和指令组织为一个可以执行的连编动作序列。

执行环境,您可以在这个环境中运行和测试软件产品。执行环境定义了运行产品时使用的程序。在很多情况下,这个程序就是产品的本身,但是不一定是这样。另外,执行环境还可以定义命令行参数和需要用到的环境变量。

Xcode工程中的三个元素按图1所示的方式关联在一起。

Xcode开发环境 理解 Xcode 工程

图1:Xcode如何使用源文件引用、目标、和执行环境。

当您执行连编和运行命令(Command-R)时,Xcode会对指定的目标进行处理,该目标则执行一系列对源代码进行操作的动作,并最终生成一个产品。然后,Xcode就用当前活动的执行环境运行该产品。

“但是请等一下” ,您可能会问:”为什么要建立一个执行环境呢?难道我们不能直接运行产品吗?” 这是个好问题。如果这仅仅是运行一个连编了的Cocoa应用程序的话,则定义一个执行环境就太过复杂了。然而,有很多产品,比如插件,要求定义一个宿主应用程序才能运行产品。执行环境也用于在调试器中运行产品。您甚至可以定义多个执行环境,以便以不同的方式运行同样的产品。

工程的组&文件列表

在Xcode的用户界面上,组成工程的源文件引用、目标、和执行环境都显示在组&文件(Groups & Files)列表中。您现在已经认识这些组件了,让我们接着看看各个组件在组&文件列表中的位置,如图2所示。下面我们看一下DotView实例程序。

如果您喜欢的话,可以自行进行操作。打开/Developer/Examples/AppKit/DotView/DotView.xcodeproj文件就可以了。

Xcode开发环境 理解 Xcode 工程
图2:组&文件列表将很多不同类型的信息封装在一个简洁的界面上

您可以看到,所有的源文件引用都在一个工程中,您可以展开工程中的每个产品,看看它们是如何组织在一起的,如图3所示。

Xcode开发环境 理解 Xcode 工程
 
图3:将一个产品展开可以显示其所有的连编组件,本例显示的是一个Cocoa应用程序。

同样地,您也可以展开一个目标,其内容是生成产品所需要的各个步骤,如图4所示。

Xcode开发环境 理解 Xcode 工程

图4:展开一个目标,显示生成产品需要的所有步骤。

工程漫游

组&文件列表中的源代码文件、工程、目标、和执行环境的下面是一组对工程内容进行漫游的工具。这些条目以智能组(Smart Groups)的形式存在,智能组的工作方式和Finder中的智能文件夹(Smart Folders)及iTunes中的智能播放列表(Smart Playlists)一样。这些工具如图5所示。

Xcode开发环境 理解 Xcode 工程

图5:Xcode的组&文件列表中含有几个工具,可以帮助您在工程中进行漫游。

在某些时候,Xcode的新用户会发现组&文件列表提供的功能太多了,特别是和他们在其它环境中用惯了的简单文件列表相比较的时候。然而,一旦您熟悉了这些项目的功能,工程面板就会变成一个强大的工具,帮助您访问Xcode提供的所有功能。

深入理解源文件引用

现在,您已经了解了Xcode工程的基本组件,是时候将我们的注意力关注在源文件引用上了。如果您双击一个源文件引用,Xcode就会弹出一个适合的编辑器,使您可以对该文件进行修改。然而,您可能可以从上面的图示中推断出来,一个源文件引用也意味着一套指令,在源文件被加入到某个目标的时候执行。举例来说,当您将一个Objective-C源代码文件(带有.m后缀)加入到工程、并和某个目标相关联的时候,该文件将会被加入到目标中的编译源代码(Compile Sources)步骤中,由GCC编译器进行处理。

您可以通过Xcode的工程界面来控制一个源文件引用是否为某个目标的一部分,如图6所示。Xcode开发环境 理解 Xcode 工程

图6:Xcode界面,使您可以快速调整源文件引用和目标的关联关系。

您也可以通过源文件引用的Get Info(获取信息)窗口来调整这些设置,访问File > Get Info菜单项或者输入Command-I可以打开该窗口。该窗口如图7所示。

Xcode开发环境 理解 Xcode 工程


图7:文件引用的Info窗口,使您可以指定当前文件属于哪个目标,以及设置其它连编选项。

将之前图示的Objective-C源文件包含到活动的目标中会使其被GCC编译,并连接到最后的执行文件中。如果您不希望将它包含到最后的产品中,则简单地将它从生成产品的目标中删除就可以了。

目标是如何被处理的

现在,让我们把注意力转移到目标上,并关注目标是如何被处理的。如果您详细察看组&文件中的目标,就可以大致看出生成产品时发生了什么。图8更加详细地解释了生成DotView产品的过程。

Xcode开发环境 理解 Xcode 工程

图8:文件被加入到目标后进行的动作。

通过图9所示的连编结果(Build Results)窗口,您可以看到连编一个目标的整个工作过程。您可以访问Build > Build Results菜单项或输入Command-Shift-B来弹出连编结果窗口。

Xcode开发环境 理解 Xcode 工程

图9:连编结果窗口中按步骤显示的目标连编过程。

连编规则和设置

那么,Xcode怎么知道如何处理目标中的文件引用呢?这个问题很简单:Xcode根据与目标相关联的连编规则和设置来进行连编。缺省的规则和设置指定:任何使用GCC支持的语言写成的代码文件,都由GCC来编译。然而,如果您希望用先前的GCC版本来编译C的源代码文件,则可以通过目标的Info窗口来简单地进行设置,如图10所示。

Xcode开发环境 理解 Xcode 工程

图10:目标的连编设置和连编规则,可以在相应的Info窗口进行修改。

现在,您已经详细了解了源文件引用和目标,让我们看看Xcode工程的最后一部分:执行环境。

执行环境

我们之前已经说过,执行环境指的是产品如何在Xcode中运行。执行环境定义了Xcode应该运行什么程序,以及如何运行这个程序。您可以建立多个执行环境,以便在不同的条件下对产品进行测试。

简单地说,执行环境定义了下列内容:

使用什么执行文件,可能是目标连编之后生成的产品之一,或者系统中的其它执行文件。

要传递给执行文件的命令行参数。

启动执行文件之前需要在执行环境中设置的环境变量。

应该使用的调试器,以及如何在调试器中运行执行文件。

您可以在Info窗口中看到如何为执行文件定义这些项目,如图11所示。

Xcode开发环境 理解 Xcode 工程

图11:您可以通过执行文件的Info窗口考察产品运行的细节。

小结:关于Xcode开发环境 理解 Xcode 工程的内容介绍完了,希望本文对你有所帮助!

Posted in iphone | Leave a comment

Mac OS启动服务优化高级篇(launchd tuning)

Mac下的启动服务主要有三个地方可配置:
1,系统偏好设置->帐户->登陆项
2,/System/Library/StartupItems 和 /Library/StartupItems/
3,launchd 系统初始化进程配置。

前两种优化比较简单,本文主要介绍的是第三种更为复杂的launchd配置优化。
launchd是Mac OS下,用于初始化系统环境的关键进程。类似Linux下的init, rc。

我们先来看一下Mac OS X的启动原理:
1,mac固件激活,初始化硬件,加载BootX引导器。
2,BootX加载内核与内核扩展(kext)。
3,内核启动launchd进程。
4,launchd根据  /System/Library/LaunchAgents , /System/Library/LaunchDaemons ,  /Library/LaunchDaemons, Library/LaunchAgents , ~/Library/LaunchAgents 里的plist配置,启动服务守护进程。

看完了Mac OS X的启动原理,我们不难发觉 /System/Library/LaunchAgents , /System/Library/LaunchDaemons ,  /Library/LaunchDaemons, Library/LaunchAgents 五个目录下的plist属性文件是优化系统的关键。

下面再来理解几个基础概念:
/System/Library和/Library和~/Library目录的区别?
/System/Library目录是存放Apple自己开发的软件。
/Library目录是系统管理员存放的第三方软件。
~/Library/是用户自己存放的第三方软件。

LaunchDaemons和LaunchAgents的区别?
LaunchDaemons是用户未登陆前就启动的服务(守护进程)。
LaunchAgents是用户登陆后启动的服务(守护进程)。

上面提到的五个目录下的plist文件格式及每个字段的含义:

Key Description Required
Label The name of the job yes
ProgramArguments Strings to pass to the program when it is executed yes
UserName The job will be run as the given user, who may not necessarily be the one who submitted it to launchd. no
inetdCompatibility Indicates that the daemon expects to be run as if it were launched by inetd no
Program The path to your executable. This key can save the ProgramArguments key for flags and arguments. no
onDemand A boolean flag that defines if a job runs continuously or not no
RootDirectory The job will be chrooted into another directory no
ServiceIPC Whether the daemon can speak IPC to launchd no
WatchPaths Allows launchd to start a job based on modifications at a file-system path no
QueueDirectories Similar to WatchPath, a queue will only watch an empty directory for new files no
StartInterval Used to schedule a job that runs on a repeating schedule. Specified as the number of seconds to wait between runs. no
StartCalendarInterval Job scheduling. The syntax is similar to cron. no
HardResourceLimits Controls restriction of the resources consumed by any job no
LowPriorityIO Tells the kernel that this task is of a low priority when doing file system I/O no
Sockets An array can be used to specify what socket the daemon will listen on for launch on demand no

看不懂上面地plist配置吗?没关系,我们的优化策略是完全卸载服务,所以我们不用关心plist里的配置含义。

开始优化

禁用服务,我们需要用到Mac OS提供的一个工具指令-launchctl
launchctl 指令会针对服务设置一个禁用标志,launchd启动时会先检查这个服务是否被禁用,从而确定是否需要启用这个服务。

禁用服务的方法1
先找到禁用标志文件 /var/db/launchd.db/com.apple.launchd/overrides.plist,查看你要禁用的服务是否已被禁用了。
有些服务已被禁用,但未列在overrides.plist里。此时,你还需要检查这个服务的plist文件Label字段是否已经标记为 Disable。

确认这个服务未禁用后,我们就可以通过调用如下命令,来禁用服务:
sudo launchctl unload plist文件路径
sudo launchctl unload -w plist文件路径
比如,我想禁用spotlight,则输入
sudo launchctl unload /System/Library/LaunchAgents/com.apple.Spotlight.plist
sudo launchctl unload -w /System/Library/LaunchAgents/com.apple.Spotlight.plist

禁用完服务以后,重启Mac OS即可生效。

禁用服务的方法2,一种更有效且暴力的方法(推荐)
先卸载服务
sudo launchctl unload /System/Library/LaunchAgents/com.apple.Spotlight.plist
然后将plist文件mv到其他目录备份。重启。搞定。是不是很简单!

我个人比较喜欢这种禁用服务的方式,所以推荐一下。

如果发现服务禁用后,系统或软件出现异常,可以通过如下命令,还原服务:
方法1:
sudo launchctl load -wF plist文件路径
方法2:
将备份的plist文件mv回原来的文件夹。
sudo launchctl load plist文件路径

注意:系统级服务的禁用要异常小心,请在禁用前google,确保你熟知这个服务的作用。否则可能导致系统无法启动。
最安全的做法就是不要去禁用它了。

当然,用户服务我们还是可以放心禁用的,有问题最多再启用呗。

下面是我禁用的服务列表:
/System/Library/LaunchDaemons/com.apple.metadata.mds.plist (禁用spotlight的前提)
/System/Library/LaunchAgents/com.apple.Spotlight.plist (Spotlight)
/Library/LaunchDaemons/com.google.keystone.daemon.plist  (Google Software Update)
/Library/LaunchAgents/com.google.keystone.root.agent  (Google Software Update)
~/Library/LaunchAgents/com.google.keystone.agent.plist (Google Software Update,用户下的进程不需要加 sudo)
~/Library/LaunchAgents/com.apple.CSConfigDotMacCert-ken.wug\@me.com-SharedServices.Agent.plist (me.com的共享服务,我不用)
/System/Library/LaunchDaemons/org.cups.cupsd.plist (打印机)
/System/Library/LaunchDaemons/org.cups.cups-lpd.plist (打印机)
/System/Library/LaunchDaemons/com.apple.blued.plist (蓝牙)
/System/Library/LaunchAgents/com.apple.AirPortBaseStationAgent.plist (apple无线基站,我没有这个设备)

知道守护进程(服务)名,如何找到对应的plist文件?
将进程(服务)名拷贝,然后到 /System/Library/LaunchAgents , /System/Library/LaunchDaemons ,  /Library/LaunchDaemons, Library/LaunchAgents , ~/Library/LaunchAgents 五个目录里,通过以下命令查找:

ll|grep 进程(服务)名
比如
ll|grep blued
在  /System/Library/LaunchDaemons 中找到了它。接下来,请按上面指导的步骤,禁用该服务。

Posted in Uncategorized | Leave a comment

Mac startup items

Apple的開發網頁上有提及,Mac「啟動」時會去處理哪些程式,這裡只用了「啟動」這個字眼是因為,它分成開機跟使用登入時兩者。

對於不是那麼了解作業系統的人,可以看《Start Me Up: Writing and Understanding OS X StartupItems》。它的說明比較簡單。

下面大略地整理一下:
/System/Library/StartupItems    這是 10.3 之前的架構,用來放置在開機時要啟動的程式,此目錄底下的程式是整個系統預設的
/Library/StartupItems    同上,只差在這是系統管理者自行安裝的
/System/Library/LaunchDaemons    這是 10.4 之後的架構,用來放置 XML 設定檔(launchd.plist 格式),每個開機時要啟動的常駐背景程式都會有一個對應的 plist 檔放置在這
/System/Library/LaunchAgents    這也是 10.4 之後的架構,差別是 agent 是指每個使用者登入後才要在背景執行的常駐程式
/Library/LaunchDaemons    同上,差在這是系統管理者自行安裝的
/Library/LaunchAgents    同上
~/Library/LaunchAgents/    這個是使用者自行安裝的部份
~/Library/Preferences/com.apple.loginitems.plist    這個則是透過系統偏好設定>使用者帳號>啟動項目指定登入後要執行的軟體,也就是 delimport 使用的方式;這個檔案是 binary 的,要用 Property List Editor 才能看

最後,有一套我愛用的軟體叫 DocumentPalette,它會建立一個叫 ~/Library/Startup Items/ 的目錄,跟系統的啟動項目沒有關係,是該軟體沒有依照系統的方式去實作。

Posted in Uncategorized | Leave a comment

Android Gallery Control

In Android the Gallery control is a selection control that displays items in a horizontal gallery. the items in the gallery appear beside each other. they can appear separated by a pre-defined space.

remember that there is a sample demo application for the gallery to download at the end of the post

we can use the gallery to display String items using a simple ArrayAdapter.
so let’s see how to create a gallery that displays the word “Hello” in several languages:

the layout:

01 <?xmlversion="1.0"encoding="utf-8"?>
02 <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
03 android:orientation="vertical"
04 android:layout_width="fill_parent"
05 android:layout_height="fill_parent"
06 >
07 <TextView
08 android:layout_width="fill_parent"
09 android:layout_height="wrap_content"
10 android:text="Gallery Demo"
11 />
12 <Gallery
13 android:id="@+id/gallery"
14 android:layout_width="fill_parent"
15 android:layout_height="wrap_content"
16 android:gravity="center_horizontal"
17 android:spacing="100px"
18
19 />
20 </LinearLayout>

and in the OnCreate method

01 @Override
02 publicvoidonCreate(Bundle savedInstanceState) {
03 super.onCreate(savedInstanceState);
04 setContentView(R.layout.main);
05 gallery=(Gallery)findViewById(R.id.gallery);
06 //String array holding the values
07 String [] text=newString[]{"Hello","Hi","Alloha","Bonjour","Hallo","¡Hola"};
08 //Array adapter to display our values in the gallery control
09 ArrayAdapter<string> arr=newArrayAdapter<string>(this, android.R.layout.simple_gallery_item, text);
10 gallery.setAdapter(arr);
11 }
12 </string></string>

the gallery will be like this

we can increse the spacing between the items by increasing the value of android:spacing property.

we can display a scroll bar to indicate the position of the current selected item in the gallery like this:

01 <Gallery
02 android:id="@+id/gallery"
03 android:layout_width="fill_parent"
04 android:layout_height="wrap_content"
05 android:gravity="center_horizontal"
06 android:spacing="100px"
07 android:scrollbars="horizontal"
08 android:scrollbarFadeDuration="0"
09 android:scrollX="100px"
10 />

setting the android:scrollbarFadeDuration=”0″ makes the scroll bar always visible.

The android:scrollX property defines the initial scroll offset of the scroll bar which is the initial distance that the gallery is scrolled for.

Handling Gallery Events
since the gallery is a selction Control (a adapter view) so it can register a OnItemSelectedListener to handle the selection of items within the gallery.

01 finalString [] text=newString[]{"Hello","Hi","Alloha","Bonjour","Hallo","¡Hola"};
02 gallery.setOnItemSelectedListener(newOnItemSelectedListener() {
03
04 @Override
05 publicvoidonItemSelected(AdapterView parent, View view,
06 intposition, longid) {
07 // TODO Auto-generated method stub
08 TextView txt=(TextView)findViewById(R.id.txt);
09 txt.setText(text[position].toString());
10 }
11
12 @Override
13 publicvoidonNothingSelected(AdapterView parent) {
14 // TODO Auto-generated method stub
15
16 }
17 });

now the final step is to add two navigation buttons: Next and Previous to navigate throught the items in the gallery.
the layout is gonna be like this:

01 <?xmlversion="1.0"encoding="utf-8"?>
02 <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
03 android:orientation="vertical"
04 android:layout_width="fill_parent"
05 android:layout_height="fill_parent"
06 >
07 <TextView
08 android:layout_width="fill_parent"
09 android:layout_height="wrap_content"
10 android:text="Gallery Demo"
11 android:id="@+id/txt"
12 />
13 <Gallery
14 android:id="@+id/gallery"
15 android:layout_width="fill_parent"
16 android:layout_height="wrap_content"
17 android:gravity="center_horizontal"
18 android:spacing="100px"
19 android:scrollbars="horizontal"
20 android:scrollbarFadeDuration="0"
21 android:scrollX="100px"
22 />
23 <LinearLayout
24 android:layout_width="fill_parent"
25 android:layout_height="wrap_content"
26 android:orientation="horizontal"
27 android:layout_marginTop="5px"
28 >
29 <Button
30 android:text="Previous"
31 android:layout_width="wrap_content"
32 android:layout_height="wrap_content"
33 android:id="@+id/btnPrev"
34 android:onClick="onClick"
35 />
36 <Button
37 android:text="Next"
38 android:layout_width="wrap_content"
39 android:layout_height="wrap_content"
40 android:id="@+id/btnNext"
41 android:onClick="onClick"
42 />
43
44 </LinearLayout>
45
46 </LinearLayout>

now in order to keep track of the index of the currently selected item we need to define two variables

1 //Variable to store the number of items in the gallery
2 intItemsInGallery=0;
3 intCurrentIndex=0;

and the navigation buttons click handlers:

01 @Override
02 publicvoidonClick(View v) {
03 // TODO Auto-generated method stub
04 switch(v.getId())
05 {
06 caseR.id.btnNext:
07 //Increase the index
08 CurrentIndex++;
09 //if reached the end of the gallery, then start from the first item
10 if(CurrentIndex>ItemsInGallery-1)
11 CurrentIndex=0;
12 gallery.setSelection(CurrentIndex,true);
13 txt.setText(String.valueOf(CurrentIndex));
14 break;
15 caseR.id.btnPrev:
16 //Decrease the index
17 CurrentIndex=CurrentIndex-1;
18 //If reached the first item, then return to the last item in the gallery
19 if(CurrentIndex<0)
20 CurrentIndex=ItemsInGallery-1;
21 gallery.setSelection(CurrentIndex,true);
22 txt.setText(String.valueOf(CurrentIndex));
23 break;
24 }
25 }

you can download a sample program from here

Posted in Android | Leave a comment

百度Android开发面试题

1、 Android dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念
DVM指dalivk的虚拟机。每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。而每一个DVM都是在Linux 中的一个进程,所以说可以认为是同一个概念。

2、sim卡的EF 文件有何作用
sim卡的文件系统有自己规范,主要是为了和手机通讯,sim本身可以有自己的操作系统,EF就是作存储并和手机通讯用的

3、嵌入式操作系统内存管理有哪几种,各有何特性 ?
页式,段式,段页,用到了MMU,虚拟空间等技术

4、什么是嵌入式实时操作系统, Android 操作系统属于实时操作系统吗?
嵌入式实时操作系统是指当外界事件或数据产生时,能够接受并以足够快的速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统作出快速响应,并控制所有实时任务协调一致运行的嵌入式操作系统。主要用于工业控制、军事设备、航空航天等领域对系统的响应时间有苛刻的要求,这就需要使用实时系统。又可分为软实时和硬实时两种,而android是基于linux内核的,因此属于软实时。

5、一条最长的短信息约占多少byte?
中文70(包括标点),英文160个字节

6、 android中的动画有哪几类,它们的特点和区别是什么?
两种,一种是Tween动画、还有一种是Frame动画。Tween动画,这种实现方式可以使视图组件移动、放大、缩小以及产生透明度的变化;另一种Frame动画,传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影。

7、handler机制的原理
andriod提供了 Handler 和 Looper 来满足线程间的通信。Handler 先进先出原则。Looper类用来管理特定线程内对象之间的消息交换(Message Exchange)。
1)Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的Message Queue(消息队列)。
2)Handler: 你可以构造Handler对象来与Looper沟通,以便push新消息到Message Queue里;或者接收Looper从Message Queue取出)所送来的消息。
3) Message Queue(消息队列):用来存放线程放入的消息。
4)线程:UI thread 通常就是main thread,而Android启动程序时会替它建立一个Message Queue。

8、说说mvc模式的原理,它在android中的运用
MVC(Model_view_contraller)” 模型_视图_控制器”。 MVC应用程序总是由这三个部分组成。Event(事件)导致Controller改变Model或View,或者同时改变两者。只要 Controller改变了Models的数据或者属性,所有依赖的View都会自动更新。类似的,只要Controller改变了View,View会
从潜在的Model中获取数据来刷新自己。
View重绘和内存泄露的好像是面试经常问的问题
1. View的刷新:
在需要刷新的地方,使用handle.sendmessage发送信息,然后在handle的getmessage里面执行invaliate或者postinvaliate.
2. GC内存泄露
出现情况:
1.数据库的cursor没有关闭
2.构造adapter时,没有使用缓存contentview
衍生listview的优化问题—–减少创建view的对象,充分使用contentview,可以使用一静态类来优化处理getview的过程/
3.Bitmap对象不使用时采用recycle()释放内存
4.activity中的对象的生命周期大于activity
调试方法: DDMS==> HEAPSZIE==>dataobject==>[Total Size]

还有其他问题,大家欢迎提出阿,可以是整体架构的,还有这个Hal层.
这篇文章会涉及到以下几个内容
一 Activity的生命周期
二 让Activity变成一个窗口:Activity属性设定
三 你后台的Activity被系统
回收怎么办:onSaveInstanceState
四 调用与被调用:我们的通信使者 – Intent
一 Activity的生命周期
和其他手机 平台 的应用程序一样,Android的应用程序的生命周期是被统一掌控的,也就是说我们写的应用程序命运掌握在别人(系统)的手里,我们不能改变它,只能学习并适应它。
简单地说一下为什么是这样:我们手机在运行
一个应用程序的时候,有可能打进来电话发进来短信,或者没有电了,这时候程序都会被中断,优先去服务电话的基本功能,另外系统也不允许你占用太多资源,至少要保证电话功能吧,所以资源不足的时候也就有可能被干掉。言归正传,Activity的基本生命周期如下代码所示:
Java 代码
public class MyActivity extends Activity
{
protected void onCreate(Bundle savedInstanceState);
protected void onStart();
protected void onResume();
protected void onPause();
protected void onStop();
protected void onDestroy();
}
你自己写的Activity会按需要
重 载这些方法,onCreate是免不了的,在一个Activity正常启动的过程中,他们被调用的顺序是 onCreate -> onStart ->onResume, 在Activity被干掉的时候顺序是onPause -> onStop -> onDestroy ,这样就是一个完整的生命周期,但是有人问了
,程序正运行着呢来电话了,这个程序咋办?中止了呗,如果中止的时候新出的一个Activity是全屏的那么:onPause->onStop ,恢复的时候onStart->onResume ,如果打断
这个应用程序的是一个Theme为Translucent 或者Dialog 的Activity那么只是onPause ,恢复
的时候onResume 。
详细介绍一下这几个方法中系统在做什么以及我们应该做什么:
onCreate:
在这里创建界面,做一些数据的初始化工作
onStart:
到这一步变成用户可见不可交互的
onResume:
变成和用户可交互的,(在activity 栈系统通过栈的方式管理这些个Activity的最上面,运行完弹出栈,则回到上一个Activity)
onPause:
到 这一步是可见但不可交互的,系统会停止动画等消耗CPU 的事情从上文的描述已经知道,应该在这里保存你的一些数据,因为这个时候你的程序的优先级降低,有可能被系统收回。在这里保存的数据,应该在 onResume里读出来,注意:这个方法里做的事情时间要短,因为下一个activity不会等到这个方法完成才启动
onstop:
变得不可见,被下一个activity覆盖了
onDestroy: 这是activity被干掉前最后一个被调用方法了,可能是外面类调用finish方法或者是系统为了节省空间将它暂时性的干掉,可以用 isFinishing()来判断它,如果你有一个Progress Dialog在线程中转动,请在onDestroy里把他cancel掉,不然等线程结束的时候,调用Dialog的cancel方法会抛异常的。
onPause,onstop, onDestroy,三种状态下 activity都有可能被系统干掉为了保证程序的正确性,你要在onPause()里写上持久层操作的代码,将用户编辑的内容都保存到存储介质上(一般 都是数据库)。实际工作中因为生命周期的变化而带来的问题也很多,比如你的应用程序起了新的线程在跑,这时候中断了,你还要去维护那个线程,是暂停还是杀 掉还是数据回滚,是吧?因为Activity可能被杀掉,所以线程中使用的变量和一些界面元素就千万要注意了,一般我都是采用Android的消息机制 [Handler,Message]来处理多线程和界面交互的问题。这个我后面会讲一些,最近因为这些东西头已经很大了,等我理清思绪再跟大家分享。

二 让Activity变成一个窗口:Activity属性设定
讲点轻松的吧,可能有人希望做出来的应用程序是一个漂浮在手机主界面的东西,那么很 简单你只需要设置一下Activity的主题就可以了在AndroidManifest.xml 中定义 Activity的地方一句话:
Xml代码
android
:theme=”@android:style/Theme.Dialog”
android:theme=”@android:style/Theme.Dialog”
这就使你的应用程序变成对话框的形式弹出来了,或者 Xml代码
android:theme=”@android:style/Theme.Translucent”
android:theme=”@android:style/Theme.Translucent”
就 变成半透明的,[友情提示-.-]类似的这种activity的属性可以在android.R.styleable 类的AndroidManifestActivity 方法中看到,AndroidManifest.xml中所有元素的属性的介绍都可以参考这个类android.R.styleable
上面说的是属性名称,具体有什么值是在android.R.style中
可以看到,比如这个”@android:style/Theme.Dialog”就对应于android.R.style.Theme_Dialog ,(’_'换成’.’ <–注意:这个是文章内容不是笑脸)就可以用在描述文件
中了,找找类定义和描述文件中的对应关系就都明白了。
三 你后台的Activity被系统回收怎么办:onSaveInstanceState
当你的程序中某一个Activity A 在运行时中,主动或被动地运行另一个新的Activity B 这个时候A会执行
Java代码
public
void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putLong(“id”, 1234567890);
}
public void
onSaveInstanceState(Bundle outState) {
B 完成以后又会来找A, 这个时候就有两种情况,一种是A被回收,一种是没有被回收,被回 收的A就要重新调用onCreate()方法,不同于直接启动的是这回 onCreate()里是带上参数 savedInstanceState,没被收回的就还是onResume就好了。
savedInstanceState是一个Bundle对象,你基本上可以把他理解为系统帮你维护的一个Map对象。在onCreate()里你可能会用到它,如果正常启动onCreate就不会有它,所以用的时候要判断一下是否为空。
Java代码
if(savedInstanceState !=null){
long id =savedInstanceState.getLong(“id”);
}
if(savedInstanceState !=null){
就像官方的Notepad教程
里的情况,你正在编辑某一个note,突然被中断,那么就把这个note的id记住,再起来的时候就可以根据这个id去把那个note取出来,程序就完整一些。这也是看你的应用需不需要保存什么,比如你的界面就是读取一个列表,那就不需要特殊记住什么,哦,
没准你需要记住滚动条的位置…
四 调用与被调用:我们的通信使者Intent
要 说Intent了,Intent就是这个这个意图,应用程序间Intent进行交流,打个电话啦,来个电话啦都会发Intent, 这个是Android架构的松耦合的精髓部分,大大提高了组件的复用性,比如你要在你的应用程序中点击按钮,给某人打电话,很简单啊,看下代码先:
Java代码 :
Intent intent = new Intent();
intent.setAction(Intent.ACTION_CALL);
intent.setData(Uri.parse(“tel:”+ number));
startActivity(intent); 复制代码
扔出这样一个意图,系统看到了你的意图就唤醒了电话拨号程序,打出来电话。什么读联系人,发短信啊,邮件啊,统统只需要扔出intent就好了,这个部分设计地确实很好啊。
那Intent通过什么来告诉系统需要谁来接受他呢?
通常使用Intent有两种方法,第一种是直接说明需要哪一个类来接收代码如下:
Java代码
Intent intent = new Intent(this,MyActivity.class);
intent.getExtras().putString(“id”,”1″);
startActivity(intent);
Intent intent = new Intent(this,MyActivity.class);intent.getExtras().putString(“id”,”1″);tartActivity(intent);复制代码
第一种方式很明显,直接指定了MyActivity为接受者,并且传了一些数据给MyActivity,在MyActivity里可以用getIntent()来的到这个intent和数据。
第二种就需要先看一下AndroidMenifest中的intentfilter的配置了
Xml代码
<intent-filter>
<action android:name=”android.intent.action.VIEW” />
<action android:value=”android.intent.action.EDIT” />
<action android:value=”android.intent.action.PICK” />
<category android:name=”android.intent.category.DEFAULT”/>
<data android:mimeType=”vnd.android.cursor.dir/vnd.google.note” />
</intent-filter>
<intent-filter>
<action android:name=”android.intent.action.VIEW”/>
<action android:value=”android.intent.action.EDIT” />
<action android:value=”android.intent.action.PICK” />
<category android:name=”android.intent.category.DEFAULT” />
<data android:mimeType=”vnd.android.cursor.dir/vnd.google.note” />
</intent-filter>
这里面配置用到了action, data, category这些东西,那么聪明的你一定想到intent里也会有这些东西,然后一匹配不就找到接收者了吗?
action其实就是一个意图的字符串名称。
上 面这段intent-filter的配置文件说明了这个Activity可以接受不同的 Action,当然相应的程序逻辑也不一样咯,提一下那个 mimeType,他是在
ContentProvider里定义的,你要是自己实现一个ContentProvider就知道了,必须指定 mimeType才能让数据被别人使用。
不知道原理说明白没,总结一句,就是你调用别的界面不是直接new那个界面,而是通过扔出一个intent,让系统帮你去调用那个界面,这样就多么松藕合啊,而且符合了生命周期被系统管理的原则。
想知道category都有啥,Android为你预先定制好的action都有啥等等,请亲自访问官方链接Intent
ps:想知道怎么调用系统应用程序的同学,可以仔细看一下你的logcat,每次运行一个程序的时候是不是有一些信息比如:
Starting activity: Intent {action=android.intent.action.MAINcategories={android.intent.category.LAUNCHER}flags=0x10200000comp={com.android.camera/com.android.camera.GalleryPicker} }

再对照一下Intent的一些set方法,就知道怎么调用咯,希望你喜欢:)
一,listview你是怎么优化的。
二,view的刷新,之前说过
三,IPC及原理
四,Android多线程
五,Android为什么要设计4大组件,他们之间的联系,不设计行不行(主要是为了实现MVC模式,然而java中最难的模式也是这个,很少有产品能将这个模式做得很好【Technicolor的面试官问的这个】)
六,service的周期,activity的周期,谈下你对Android内部应用的了解,比如他做电话,以及联系人等等应用。框架层有很多东西还是多看看,熟悉Android怎么做的,不管你做应用程开发还是应用框架层开发很有好处的。
在就是你项目经验,突出你遇到什么难点,然后是怎么解决的!尽量将每个技术点凸显出来,当然面试官有时候会为了体现你是否真正做过,他会问你,你在这个应用中做那个模块,用了多少个类之类的问题。
偶尔有的面试官会问你,你用过Android自带的单元测试了没,怎么用的?
当然我面试过很多家单位,有的是做平板,手机,数字电视,有的是做出个erp之类的客户端等等,出于前面的三个,基本上都是将Android的全部改掉,如果真正要做Android的话,大家要学的还很多。

总 之,一句话,什么样的面试官都有,去面试的时候要做好一切心理准备,不管是技术还是基础都得扎实。一个人的交谈能力也很重要,总之不是非常标准的普通话, 最起码你说的得让别人听得懂,而且得把面试官讲得非常彻底,这样你获得offer的机会更大,谈工资也有优势~~当然曾经一家公司的面试官跟我说过,技术 是不惜钱的,只要你有能力,多少钱他都请。
1.View如何刷新?
2.DDMS与TraceView的区别?
3.activity被回收了怎么办?
4.在Java中如何引入C语言?
参考答案 :
1.View 可以调用invalidate()和postInvalidate()这两个方法刷新
2.DDMS是一个程序执行查看器,在里面你可以看见线程和堆栈等信息,TraceView是程序性能分析器
3.activity回收了,那就只有另起了
4.java调用C语言程序,可以用JNI接口来实现
上面答案仅作参考,毕竟我个人能力也有限嘛,难免会回答错误,呵呵…..
解答:
1.View受系统刷新(系统内部有个循环,监控事件、做业务处理、绘UI),可以用postInvalidate()促使系统刷新。
2.(还真不知道)
3.请参照Activity生命周期,如果被系统destroy了,也就是说的回收,只有从新start了
4.通过JNI调用。建议阅读《The Java Native InterfaceProgrammer’s Guide and Specification》,英文版的,从sun网站下吧。

Posted in Android, Uncategorized | Leave a comment