??xml version="1.0" encoding="utf-8" standalone="yes"?>
最q?nbsp; http://developer.android.com不知道咋回事下蝲不了(jin) Q给大家提供一个地 址 http://dl.google.com/android/android-sdk-windows-1.6_r1.zip 速度很快 我这700k左右
2 下蝲 JDK6
http://java.sun.com/javase/downloads/index.jsp
3Q下?Eclipse 3.2Q?.3版本Q开?Android?IDEQ?/strong>
http://www.eclipse.org/downloads/
然后安装android的eclipse插g
1. 启动 Eclipse, 选择 Help > Software Updates > Find and Install..
2. 弹出对话框后Q选择 Search for new features to install 点击 Nex
3. 点击 New Remote Site.
4. 在编辑框中输入更新插件的|址:
https://dl-ssl.google.com/android/eclipse/. 点击 OK
5. 看到一个更新的列表Q点?sFinish.
6. 在返回的对话框中选择 Android Plugin > Eclipse Integration >
Android Development Tools q且点击 Next.
7. 选择 Accept terms of the license agreement, 点击 Next.
8. 点击 Finish.
9. 点击 Install All.
10. 重新启动 Eclipse.
q样安装完毕了(jin)
4 讄a(chn)ndroid的sdk目录
5 建立新项?/strong>
输入信息Q?/p>
q行q时候会(x)提示Q?/p>
也就是说需要我们徏立android的虚拟设备区支持我们的sdk 1.6
选择yesQ输入信?其中选择1.6的那?/p>
选择createAvd
也可以通过命o(h)来徏立:(x)
q时候就需要在环境变量的path里面W一步解压sdk的根目录下的tools目录Q或者直接{向tools目录再运?/p>
命o(h)android create avd --target 2 --name avdname
然后可以运行我们的E序?/p>
昄l果Q?/p>
屏幕上的相关信息可见于项目根目录下的res目录Q例如:(x)values/strings.xml
内容Q?/p>
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello World, HelloWorld!</string> <string name="app_name">my-first-android-application</string> </resources>
相关问题Q?/strong>
Failed to find an AVD compatible with target 'Android 1.6' Qno compatible AVDs with target
Q还有无法找到avd的path问题
Ҏ(gu)我的遭遇Q由于我以前用的盗版xp新徏立的avdq不在当前用L(fng)录下也:(x)我的文档目录是dQ\我的文档 而不?nbsp; C:\Documents and Settings/administrator 。因此需要将.android目录拯到C:\Documents and Settings\administrator ?重要的一步是要主意看里面的ini文g里面的\径是否对应,否则?x)出现\径问题:(x)
.android/avd里面以avd名命名的.ini文gQ例如我的是Q?/strong>
target=android-4path=C:\Users\qiaobing\.android\avd\dvd6.avdQVista环境Qxp要注意看是否在当前用户下
基本上就可以?
׃CQ可以看到红色的 kernel 层,l色的系l函式库Q黄色的虚拟机器Q以?qing)蓝色?font face="Times New Roman"> Java E序代码。以下将一一介绍?br />
Linux kernel
必也正名乎:(x)一般所U?font face="Times New Roman"> LinuxQ其实是l称Q指根基?font face="Times New Roman"> Linux kernel 以及(qing)其它许多?font face="Times New Roman"> kernel 不见得有关的软g所l成的操作系l。最早,Linux 一词其实是专指 kernelQ它提供?jin)系l底层与g间的基本q_Q让其它E序可以在上头执行。其最早作者是 Linus TorvaldsQ他用自q名字Q加上采用了(jin)?font face="Times New Roman"> Unix pȝ兼容的接口,自q作品命名?font face="Times New Roman"> Linux?br />
如前所qͼ?font face="Times New Roman"> Linux kernel 上头执行的程序,?font face="Times New Roman"> kernel 本n不见得有关系。可以是自由软gQ也可以完全不是。把它加上一些自pYӞ例如基本的函式库、工兗图形接口,应用E序{等Q所l成的一套完整操作系l,才是一般所U的 Linux。ؓ(f)?jin)避免误解,而且也ؓ(f)?jin)正传达自w的贡献Q自pY件基金会(x)大家U呼q样的一套操作系lؓ(f) GNU/Linux。其中的原因是,kernel 提供底层机制Q但pȝ中重要的lg几乎都是来自?font face="Times New Roman"> GNUQ也是自由软g基金?x)?br />
希望大家q没被这些名词搞淗要弄清q些不同的原因是Q?font face="Times New Roman">Android 是在 Linux kernel 上头q作的,但他q不?font face="Times New Roman"> GNU/Linux。因为在一?font face="Times New Roman"> GNU/Linux 里面?x)有的东西?font face="Times New Roman">Android 很多都没有?br />
Linux kernel 的版权是 GNU General Public License version 2 (GPLv2)Q这又是什么玩意呢Q?font face="Times New Roman">GPLv2 是所谓的 Copyleft 版权Q简单来_(d)是Z(jin)保智慧财能够l箋(hu)公开传Q所以Q何基于此创作的g伸创作,都自动采用了(jin)相同版权?font face="Times New Roman">GPL本nq有个特Ԍ是「共同运作」也是延的一部分Q意思是说你的程序没直接?font face="Times New Roman">GPL的程序代码,但是q结?font face="Times New Roman">GPL的东西跟你的E序共同q作Q那你的E序也必采?font face="Times New Roman">GPL版权?br />
举例来讲Q假定今天某公司觉得?font face="Times New Roman">GPL软g不错Q拿来改?jin)改Q放在自q产品里头拿出dQ那某公司就一定要明确的一h布修改后的程序代码。如果没有,那就是触犯版权了(jin)。有个组l叫 GPL ViolationsQ专门抓q种案例Q国内公司如 D-Link 以及(qing) ASUS 都上q榜。这下问题来?jin)?x)如果你是g厂商Q希望你的硬件能?font face="Times New Roman"> Linux kernel 下运作,那么必要有驱动程序。驱动程序就是按照硬件的规格写的E序Q用来告?font face="Times New Roman"> kernel 怎么操作q个g。如果驱动程序的E序代码公开Q等于硬件规g公开的差不多?jin)。许多厂商不愿意q么做,所以就提供~好的驱动程序,但不提供原始码。版权所有者,也就?font face="Times New Roman"> Linus Torvalds 以及(qing)其它许许多多?font face="Times New Roman"> kernel 作者们Qؓ(f)?jin)支持尽可能多的gQ对q种行ؓ(f)是采取睁一只眼闭一只眼的态度Q也是目前q种~译好的驱动E序Q算是处在灰色地带?br />
既然 Android 采用?font face="Times New Roman"> Linux kernelQ当然得照游戏规矩来。但我们从前文可知,Android 的重点就是商业应用,他们可不愿意pȝ里有什么「灰色地带」,于是采用?jin)一些手法来l过q问题。他们把驱动E序Ud“userspace”Q也是_(d)把驱动程序变成在 Linux kernel 上头跑,而不是一赯的东西,q样可以避q?font face="Times New Roman">GPL。然后,?font face="Times New Roman"> kernel q边开个小门,让本来不能直接控制到g?#8220;userspace”E序也可以碰得到Q这样只要把「开个小门」的E序代码公布?yu)p啦。事实上Q目前因?font face="Times New Roman"> Android 已经发行Q所以依法他们已l公开?jin)?font face="Times New Roman"> kernel 的修改,其原始码?font face="Times New Roman"> http://git.android.com/?br />
走笔x(chng)Q可以看?font face="Times New Roman"> Google 的原则之一“Do no evil”是很有意思的。他们自q承诺,而且也愿意公开 Android 的程序代码,但是他们l了(jin)其它?#8220;Do evil”的选择。这栯不是 Do no evil 呢?当作哲学问题吧?br />
关于 Android ?font face="Times New Roman"> kernel 的修改,Google 的简报还提供?jin)两个重点?x)
Binder (IPC)Q提供有效率的程序间沟通管?font face="Times New Roman">(Inter-Process Communication)?font face="Times New Roman">Android pȝ中有很多服务Q而上层的应用E序l常要取用这些服务,一般的 Linux pȝ已经提供?jin)不?font face="Times New Roman"> IPC 的方式,不过 Android q是搞了(jin)套自q。虽说文件中解释原因为「一?font face="Times New Roman"> IPC ?x)造成额外资源pQ以?qing)安全问题」,但其实这些都是可以基于原有架构在 kernel 外头解决的,Z要改?font face="Times New Roman"> kernel 里头Q笔者对此存疑,也只能等找时间去研究E序代码才知?jin)?br />
Power ManagementQ与桌上型计机或笔记型计算Z同,手持装置的电(sh)源一向相当有限,必须无所不用其极的去惛_法省?sh),但又不损及(qing)顺畅的使用l验?font face="Times New Roman">Android 在此采取?jin)颇为积极的作法Q「没有h说要用,关掉」。例如某E序在放 MP3 音乐Q于是此E序?x)需?font face="Times New Roman"> CPU 的计能力,那就得开口要。如果与此同时没其它E序在执行,那么 LCD 昄器就可能被关掉,藉以省电(sh)。另一特别处,是在?font face="Times New Roman"> Linux kernel 一般考虑的都是在计算Z的作法,所以多半只有进入暂停、休眠等{的选择Q而不?x)如此细致的L制到各个装|的甉|供应?br />
pȝ函式?br />
q里说的pȝ函式库是?#8220;native libraries”Q是跑在pȝ里头的函式库Q采用的语言不是 JavaQ提供一些基。里头有几个值得一提的lgQ?br />
BionicQ这?font face="Times New Roman"> Android 版的 libc?font face="Times New Roman">libc ?font face="Times New Roman"> GNU/Linux 以及(qing)其它cM Unix pȝ上最基础的函式库Q一般最常用的是 glibcQ就?font face="Times New Roman"> GNU 做的 libc。不然在比较?yu)型的装|上也可以用 uclibc。不论是 glibc or uclibcQ版权都?font face="Times New Roman">LGPL (GPL 的略为弱化版)。看到这大概可以猜到?jin)吧Q又?font face="Times New Roman"> Copyleft 问题。官方的说法是,除了(jin)版权问题?sh)外Q还考虑必须轻量以及(qing)快速,所以才做了(jin)自己?font face="Times New Roman"> libc。不q轻量、快速,本来是型装置用的 uclibc 一开始的目标Q因此,最主要的恐怕还是版权问题?br />
WebkitQ鼎鼎大名的 Apple Safari 览器背后的引擎是 WebkitQ?font face="Times New Roman">Android 也包含进M(jin)。离U用的 html 配上 html 5 的一些新发展Q生了(jin)各种有趣的可能,q部分值得另文介绍Q这里就不再赘述?br />
Surface FlingerQ提供把各种”surface”l合在一L(fng)能力。在q里 surface 解释为程序想要显C在屏幕的东西,可能同一屏幕上有来自不同E序的内容,而这些内Ҏ(gu)可能?font face="Times New Roman"> 2D 昄或是 3D 昄{等之类?font face="Times New Roman">Surface flinger 是把这些东西结合v来,一起送到屏幕上。目前程序代码还没公布,不过 2D ?font face="Times New Roman"> 3D 的合显CZ直都是问题,Ҏ(gu)原因是我们通常告诉 3D 昄卡的东西都是一些「我要在哪里哪里M什么ŞӞ贴上某某材质然后旋{多少度」之cȝ事情Q也是_(d)我们q不知道最后显C出来会(x)长什么样子,那是昄卡上头的 GPU ȝ出来的。一般这些东西是昄在一个有装饰的窗口里_(d)q装饰通常?font face="Times New Roman"> 2D 效果。接下来假定我们惌旋{q整个窗口,而且里头的东西还要l动Q那{于要随时把?font face="Times New Roman"> 3D H口里的东西长什么样子,然后把它?font face="Times New Roman"> 2D 的窗口框框结合,然后再开始{动。目前在一?font face="Times New Roman"> GNU/Linux 上这件事情还没有处理的非常好Q?font face="Times New Roman">Android 怎么做,值得在程序代码公布之后注意?br />
g抽象?font face="Times New Roman"> (Hardware Abstraction Libraries)Q这是前文所q的 userspace 驱动E序Q如果想要将 Android 在某gq_上执行,基本上完成这些驱动程序就行了(jin)。其内定义了(jin) Android 对各g装置例如昄芯片、声韟뀁数字相机?font face="Times New Roman">GPS?font face="Times New Roman">GSM {等的需求?br />
Android Runtime 前文已有涉及(qing)Q这里不再重复。另外蓝色部分的“Application Framework”主要是跟如何?font face="Times New Roman"> Android 上写E序有关p,之后另文介l?/p>
转蝲自:(x)http://hi.baidu.com/weiyousheng/blog/item/43ef7f2e5a457e574fc226a0.html
转蝲自:(x)http://hi.baidu.com/weiyousheng/blog/item/1e5da62417021d3b8744f9cd.html
一 什么是Service
ServiceQ看名字q道跟正常理解?#8220;服务”差不多,后台q行Q可交互q样的一个东ѝ它跟Activity的别差不多Q但是他不能自己q行Q需要通过某一个Activity或者其他Context对象来调用, Context.startService() ?Context.bindService()?br />
两种启动Service的方式有所不同。这里要说明一下的是如果你?strong style="color: black; background-color: rgb(160,255,255)">Service的onCreate或者onStart做一些很耗时间的事情Q最好在 Service里启动一个线E来完成Q因?strong style="color: black; background-color: rgb(160,255,255)">Service是跑在主U程中,?x)?jing)响到你的UI操作或者阻塞主U程中的其他事情?br />
什么时候需?strong style="color: black; background-color: rgb(160,255,255)">Service呢?比如播放多媒体的时候用户启动了(jin)其他Activityq个时候程序要在后台l播放,比如(g)SD卡上文g的变化,再或者在后台记录你地理信息位|的改变{等QM服务嘛,L藏在后头的?br />
?如何使用Service
那接下来用代码来说明一下怎么使用ServiceQ这里我们要讲的是Local Service也就是你自己的一?strong style="color: black; background-color: rgb(160,255,255)">Service, 你也可以操作别的应用E序?strong style="color: black; background-color: rgb(160,255,255)">service如果它允怽那么d的话Q这p计到一个比较麻?ch)的东西interprocess communication (IPC)Q在不同的进E中通信的机Ӟq个我自׃q没有用q,{用?jin)以后再跟大伙说_(d)通常情况下Local的就够用啦?br />
跟Activity一样首先你要写一个类l承?strong style="color: black; background-color: rgb(255,255,102)">android.app.Service,在这里我叫他TestService
代码如下Q?br />
其中用到Notification是ؓ(f)?jin)明昑֜表?strong style="color: black; background-color: rgb(160,255,255)">Service存活的状态,跟demo的code学过来的Q这L(fng)上去直观一点,更多关于Notification的内容以后UI部分来写吧,现在q道怎么使用好?jin)?/font>
@Override像这P我在Service的几个生命周期函C加了(jin)打印l(f)og的语句,方便试?/font>
public class LocalBinder extends Binder {
q个Ҏ(gu)是ؓ(f)?jin)让调用者得到这?strong style="color: black; background-color: rgb(160,255,255)">Serviceq操作它?br />
Service本npL(fng)单了(jin)Q你需要做什么就在onCreate和onStart里做好了(jin)Qv个线E什么的?br />
再看一下它的调用者,TestServiceHolder
q里可以看到两种启动Ҏ(gu)Qstart和bindQ当然也是通过intent调用的,在intent中指明指定要启动?strong style="color: black; background-color: rgb(160,255,255)">Service的名字,stop也一?/font> Q?/p>
private void startService() { 对于bind的话Q需要一个ServiceConnection对象 用来把Activity和特定的Serviceq接在一P共同存(sh)Q具体的生命周期l节下一D|讌Ӏ?br />
Service的生命周期方法比Activity一些,只有onCreate, onStart, onDestroy Service?x)经?onCreate -> onStart 如果是调用?TestServiceHolder)自己直接退?gu)没有调用stopService?br />
话,Service?x)一直在后台q行?br />
下次TestServiceHolder再v来可以stopService?/font> 2 通过bindService Service只会(x)q行onCreateQ?q个时?/font> TestServiceHolder 和TestServicel定在一?br />
TestServiceHolder 退Z(jin)QSrevice׃(x)调用onUnbind->onDestroyed 那有同学问了(jin)Q要是这几个Ҏ(gu)交织在一L(fng)话,?x)出C么情况呢Q?br />
一个原则是Service的onCreate的方法只?x)被调用一ơ,是你无论多次的startService?bindServiceQ?strong style="color: black; background-color: rgb(160,255,255)">Service只被创徏一ơ。如果先是bind?jin),那么start的时候就直接q行Service的onStartҎ(gu)Q如果先 是startQ那么bind的时候就直接q行onBindҎ(gu)。如果你先bind上了(jin)Q就stop不掉?jin),对啊Q就是stopService不好使了(jin)Q只 能先UnbindService, 再StopService,所以是先startq是先bind行ؓ(f)是有区别的?br />
转蝲自:(x)http://hi.baidu.com/weiyousheng/blog/item/b82f228bb1cdaf1ac9fc7a40.html
Intent i = new Intent(this, TestService.class);
this.startService(i);
}
private void stopService() {
Intent i = new Intent(this, TestService.class);
this.stopService(i);
}
public void onServiceConnected(ComponentName className, IBinder service) {
_boundService = ((TestService.LocalBinder)service).getService();
Toast.makeText(TestServiceHolder.this, "Service connected",
Toast.LENGTH_SHORT).show();
}
public void onServiceDisconnected(ComponentName className) {
// unexpectedly disconnected,we should never see this happen.
_boundService = null;
Toast.makeText(TestServiceHolder.this, "Service connected",
Toast.LENGTH_SHORT).show();
}
};
?Service的生命周?/font>
我们有两U方式启动一?strong style="color: black; background-color: rgb(160,255,255)">Service,他们?strong style="color: black; background-color: rgb(160,255,255)">Service生命周期的媄(jing)响是不一L(fng)?/font>
1 通过startService
stopService的时候直接onDestroy
所谓绑定在一起就共存?sh)?jin)?br />
看v来情况很多,不过我会(x)把这ơ的代码包括上回Activity生命周期的研I代码都贴上?jin),希望你喜Ƣ!大家有兴可以回ȝ?gu)钮看看logQ多看几遍就知道?jin)?/font>
]]>
对于一个Android应用E序来说Q是由四U构造块l织而成的,q四U构造块如下Q?/p>
但是Qƈ不是每一个Android应用E序都需要这四种构造块Q这不是必须的,某些时候,我们只需要这四种中的几种l合成我们的应用?/p>
当我们明了(jin)我们的应用需要哪些构造块后,我们需要在AndroidManifest.xml中登记这些构造块的清单。这是一个XML配置文gQ这个配|文件用于定义我们的应用E序的组件、组件的功能?qing)必要条件等。这个配|文件是每个Android应用必需的。对于AndroidMainfest.xml的SchemaQ参考SDK包附带的文档。以下,我们对四U构造块做一些说明:(x)
1、Activity
Activity是Android构造块中最基本的一U,在应用中Q一个activity通常是一个单独的屏幕。每一个activity都被实现Z个独立的c,q且l承于Activityq个基类。这个activitycd?x)显C由几个Views控gl成的用h口,q对事g做出响应。大部䆾的应用都?x)包含多个的屏幕。例如,一个短消息应用E序会(x)有一个屏q用于显CpMh列表Q第二个屏幕用于写短消息Q同时还?sh)(x)有用于览旧短消息及(qing)进行系l设|的屏幕。每一个这L(fng)屏幕Q就是一个activity。从一个屏q导航到另一个屏q是很简单的。在一些应用中Q一个屏q甚至会(x)q回值给前一个屏q?/p>
当一个新的屏q打开后,前一个屏q将?x)暂停,q保存在历史堆栈中。用户可以返回到历史堆栈中的前一个屏q。当屏幕不再使用Ӟq可以从历史堆栈中删除。默认情况下QAndroid会(x)保留从主屏幕到每一个应用的q行屏幕?/p>
Android使用?jin)Intentq个Ҏ(gu)c,实现在屏q与屏幕之间Ud。Intentcȝ于描qC个应用将?x)做什么事。在Intent的描q结构中Q有两个最重要的部分:(x)动作和动作对应的数据。典型的动作cd有:(x)MAINQactivity的门P(j)、VIEW、PICK、EDIT{。而动作对应的数据则以URI的Ş式进行表C。例如:(x)要查看一个h的联pL式,你需要创Z个动作类型ؓ(f)VIEW的intentQ以?qing)一个表C个h的URI?/p>
与之有关pȝ一个类叫I(xin)ntentFilter。相对于intent是一个有效的做某事的hQ一个intent filter则用于描qC个activityQ或者Intent ReceiverQ能够操作哪些intent。一个activity如果要显CZ个h的联pL式时Q需要声明一个IntentFilterQ这个IntentFilter要知道怎么d理VIEW动作和表CZ个h的URI。IntentFilter需要在AndroidManifest.xml中定义?/p>
通过解析各种intentQ从一个屏q导航到另一个屏q是很简单的。当向前DӞactivity会(x)调用startActivity(Intent myIntent)Ҏ(gu)。然后,pȝ?x)在所有安装的应用E序中定义的IntentFilter中查找,扑ֈ最匚wmyIntent的Intent对应的activity。新的activity接收到myIntent的通知后,开始运行。当startActivityҎ(gu)被调用将触发解析myIntent的动作,q个机制提供?jin)两个关键好处?x)
A、Activities能够重复利用从其它组件中以Intent的Ş式生的一个请求;
B、Activities可以在Q何时候被一个具有相同IntentFilter的新的Activity取代?/p>
2、Intent Receiver
当你希望你的应用能够对一个外部的事gQ如当电(sh)话呼入时Q或者数据网l可用时Q或者到?jin)晚上时Q做出响应,你可以用一个Intent Receiver。虽然Intent Receiver在感兴趣的事件发生时Q会(x)使用NotificationManager通知用户Q但它ƈ不能生成一个UI。Intent Receiver在AndroidManifest.xml中注册,但也可以在代码中使用Context.registerReceiver()q行注册。当一个intent receiver被触发时Q你的应用不必对h调用intent receiverQ系l会(x)在需要的时候启动你的应用。各U应用还可以通过使用Context.broadcastIntent()它们自qintent receiverq播l其它应用程序?/p>
3、Service
一个Service是一D长生命周期的,没有用户界面的程序。比较好的一个例子就是一个正在从播放列表中播放歌曲的媒体播放器。在一个媒体播攑֙的应用中Q应该会(x)有多个activityQ让使用者可以选择歌曲q播放歌曌Ӏ然而,音乐重放q个功能q没有对应的activityQ因Z用者当然会(x)认ؓ(f)在导航到其它屏幕旉乐应该还在播攄。在q个例子中,媒体播放器这个activity?x)用Context.startService()来启动一个serviceQ从而可以在后台保持音乐的播放。同Ӟpȝ也将保持q个service一直执行,直到q个serviceq行l束。另外,我们q可以通过使用Context.bindService()Ҏ(gu)Q连接到一个service上(如果q个serviceq没有运行将启动它)(j)。当q接C个service之后Q我们还可以service提供的接口与它进行通讯。拿媒体播放器这个例子来_(d)我们q可以进行暂停、重播等操作?/p>
4、Content Provider
应用E序能够它们的数据保存到文件中、SQL数据库中Q甚x(chng)M有效的设备中。当你想你的应用数据与其它的应用共享时QContent Provider会(x)很有用。一个Content ProvidercdC(jin)一l标准的Ҏ(gu)Q从而能够让其它的应用保存或d此Content Provider处理的各U数据类型?/p>
更详l的Content Provider资料Q可以参考附带文档中的Accessing Content Providers?/p>
Android一个重要ƈ且特D的Ҏ(gu)就是,一个应用的q程的生命周期不是由应用自n直接控制的,而是ql,Ҏ(gu)q行中的应用的一些特征来军_的,包括Q这些应用对用户的重要性、系l的全部可用内存?/p>
对于应用开发者来_(d)理解不同的应用组Ӟ特别是Activity、Service、Intent ReceiverQ对应用q程的生命周期的影响Q这是非帔R要的。如果没有正地使用q些lgQ将?x)导致当应用正在处理重要的工作时Q进E却被系l消毁的后果?/p>
对于q程生命周期Q一个普遍的错误是Q当一个Intent Receiver在它的onReceiveIntent()Ҏ(gu)中,接收C个intent后,׃(x)从这个方法中q回。而一旦从q个Ҏ(gu)q回后,pȝ会(x)认ؓ(f)q个Intent Receiver不再处于zd状态了(jin)Q也׃(x)认ؓ(f)它的宿主q程不需要了(jin)Q除非宿主进E中q存在其它的应用lgQ。从而,pȝ随时都会(x)消毁q个q程Q收回内存,q中止其中还在运行的子线E。问题的解决办法是Q在IntentReceiver中,启动一个ServiceQ这L(fng)l就?x)知道在q个q程中,q有zd的工作正在执行?/p>
Z(jin)军_在内存(sh)x(chng)况下消毁哪个q程QAndroid?x)根据这些进E内q行的组件及(qing)q些lg的状态,把这些进E划分出一?#8220;重要性层?#8221;。这个层ơ按序如下Q?/p>
1、前端进E是拥有一个显C在屏幕最前端q与使用者做交互的ActivityQ它的onResume已被调用Q的q程Q也可能是一个拥有正在运行的IntentReceiverQ它的onReceiveIntent()Ҏ(gu)正在q行Q的q程。在pȝ中,q种q程是很的Q只有当内存?sh)到不于支持这些进E的l箋(hu)q行Q才?x)将q些q程消毁。通常q时候,讑֤已经辑ֈ?jin)需要进行内存整理的状态,Z(jin)保障用户界面不停止响应,只能消毁q些q程Q?/p>
2、可视进E是拥有一个用户在屏幕上可见的Q但q没有在前端昄的ActivityQ它的onPause已被调用Q的q程。例如:(x)一个以对话框显C的前端activity在屏q上昄Q而它后面的上一Uactivity仍然是可见的。这L(fng)q程是非帔R要的Q一般不?x)被消毁Q除非ؓ(f)?jin)保障所有的前端q程正常q行Q才?x)被消毁?/p>
3、服务进E是拥有一个由startService()Ҏ(gu)启动的Service的进E。尽这些进E对于用者是不可见的Q但他们做的通常是用者所x(chng)的事情(如后台MP3播放器或后台上传下蝲数据的网l服务)(j)。因此,除非Z(jin)保障前端q程和可视进E的正常q行Q系l才?x)消毁这U进E?/p>
4、后台进E是拥有一个用户不可见的ActivityQonStop()Ҏ(gu)已经被调用)(j)的进E。这些进E不直接影响用户的体验。如果这些进E正地完成?jin)自q生命周期Q详l参考Activityc)(j)Q系l会(x)Z(jin)以上三种cdq程Q而随时消毁这U进E以释放内存。通常?x)有很多q样的进E在q行着Q因些这些进E会(x)被保存在一个LRU列表中,以保证在内存?sh)Ӟ用户最后看到的q程在最后才被消毁?/p>
5、空q程是那些不拥有Mzd的应用组件的q程。保留这些进E的唯一理由是,做ؓ(f)一个缓存,在它所属的应用的组件下一ơ需要时Q羃短启动的旉。同L(fng)Qؓ(f)?jin)在q些~存的空q程和底层的核心(j)~存?sh)间qpȝ资源Q系l会(x)l常消毁q些IE?/p>
当要对一个进E进行分cLQ系l会(x)选择在这个进E中所有活动的lg中重要等U最高的那个做ؓ(f)依据。可以参考Activity、Service、IntentReceiver文档Q了(jin)解这些组件如何媄(jing)响进E整个生命周期的更多l节。这些类的文档都对他们如何媄(jing)响他们所属的应用的整个生命周期,做了(jin)详细的描q?/p>
转蝲地址Qhttp://hi.baidu.com/weiyousheng/blog/item/c56fa81940f1bd72dbb4bd55.html
cd | Ҏ(gu) | 描述 |
---|---|---|
Creation | Constructors | |
onFinishInflate() |
当View和它的所有子对象从XML中导入之后,调用此方?/td> | |
Layout | onMeasure(int, int) |
View?x)调用此?gu)Q来认自己?qing)所有子对象的大?/td> |
onLayout(boolean, int, int, int, int, int, int) |
当View要ؓ(f)所有子对象分配大小和位|时Q调用此Ҏ(gu) | |
onSizeChanged(int, int, int, int) |
当View大小改变Ӟ调用此方?/td> | |
Drawing | onDraw(Canvas) |
当View要绘制它的内Ҏ(gu)Q调用此Ҏ(gu) |
Event processing | onKeyDown(int, KeyEvent) |
当一个新的按键事件发生时Q调用此Ҏ(gu) |
onKeyUp(int, KeyEvent) |
当一个按键释放事件发生时Q调用此Ҏ(gu) | |
onMotionEvent(MotionEvent) |
当一个动作事Ӟ如触摸)(j)发生Ӟ调用此方?/td> | |
Focus | onFocusChanged(boolean, int) |
当View获得或失ȝҎ(gu)Q调用此Ҏ(gu) |
Attaching | onAttachedToWindow() |
当View附加C个窗体上Ӟ调用此方?/td> |
onDetachedFromWindow() |
当Viewd它的H体Ӟ调用此方?/td> |
public class SendResult extends Activity屏幕元素层次l构
{
protected void onCreate(Bundle savedValues)
{
...
Button button = (Button)findViewById(R.id.corky);
button.setOnClickListener(mCorkyListener);
}
private OnClickListener mCorkyListener = new OnClickListener()
{
public void onClick(View v)
{
setResult(RESULT_OK, "Corky!");
finish();
}
};
首先找一个png的图片放在res/drawable文g架下Q文件名和扩展名全部用小写(注意Q,我的文g名称Qandroid.png
1.code方式Q?/p>
ImageView imageView = new ImageView(this); imageView.setImageResource(R.drawable.android);//R.drawable.android后面的android是你的图片文件名 setContentView(imageView);
2Qxm方式Q?/p>
修改main.xml
dQ?/p>
<ImageView
android:id="@+id/imageview"
android:layout_height="wrap_content" //囄原来的size 如果用fill_parent ׃(x)拉
android:layout_width="wrap_content"
android:src="@drawable/android" //注意文g?br />
/>
代码加入QsetContentView(R.layout.main);卛_
q行Q?/p>