??xml version="1.0" encoding="utf-8" standalone="yes"?> This is called for activities that set launchMode to "singleTop" in their package, or if a client used the An activity will always be paused before receiving a new intent, so you can count on Note that
]]>protected void onNewIntent (Intent intent)
FLAG_ACTIVITY_SINGLE_TOP
flag when calling startActivity(Intent)
. In either case, when the activity is re-launched while at the top of the activity stack instead of a new instance of the activity being started, onNewIntent() will be called on the existing instance with the Intent that was used to re-launch it.onResume()
being called after this method.getIntent()
still returns the original Intent. You can use setIntent(Intent)
to update it to this new Intent.
一、其他应用发IntentQ执行下列方法:
I/@@@philn(12410): onCreate
I/@@@philn(12410): onStart
I/@@@philn(12410): onResume
发Intent的方?
Uri uri = Uri.parse("philn://blog.163.com");
Intent it = new Intent(Intent.ACTION_VIEW, uri);
startActivity(it);
二、接收Intent声明Q?br style="line-height: 22px; " />
<activity android:name=".IntentActivity" android:launchMode="singleTask"
android:label="@string/testname">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="philn"/>
</intent-filter>
</activity>
三、如果IntentActivity处于d栈的端Q也是说之前打开q的ActivityQ现在处?br style="line-height: 22px; " />
I/@@@philn(12410): onPause
I/@@@philn(12410): onStop 状态的?br style="line-height: 22px; " />
其他应用再发送Intent的话Q执行顺序ؓQ?br style="line-height: 22px; " />
I/@@@philn(12410): onNewIntent
I/@@@philn(12410): onRestart
I/@@@philn(12410): onStart
I/@@@philn(12410): onResume
]]>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="*/*">
</intent-filter>
q样把当前E序注册?可以打开/查看所有类型的文g. 或者要查看jpeg, mimeType要改? image/jpeg
当在文g理器里点击M文g, pȝ都会试图L行你的程?
转自 http://chaozhong84.spaces.live.com/blog/cns!FC149E9A3FC0182B!297.trak
【Android】【{】Android Log Analysis
---------------------------------------------------
本文原创,转蝲h明出处,如有错误之处Ƣ迎指出
---------------------------------------------------
adb bugreport > bugreport.txt
copy bugreport to the current directory.
bugreport里面包含了各Ulog信息,大部分log也可以通过直接q行相关的程序来直接获得.
步骤如下:
1.adb shell 2.q入相关工具E式的目?3.执行相关E式 4.得到相关信息
下面以输E信息ؓ?1.adb shell 2.输入ps -P 3.可以看到相关q程信息
bugreport记录android启动q程的log,以及启动后的pȝ状?包括q程列表Q内存信息,VM信息{等?
MEMORY INFO
获取该log:d文g/proc/meminfo
pȝ内存使用状?/p>
CPU INFO
获取该log:执行/system/bin/top -n 1 -d 1 -m 30 -t
pȝCPU使用状?/p>
PROCRANK
获取该log:执行/system/bin/procrank
执行/system/xbin/procrank后输出的l果,查看一些内存用状?/p>
VIRTUAL MEMORY STATS
获取该log:d文g/proc/vmstat
虚拟内存分配情况
vmalloc甌的内存则位于vmalloc_start~vmalloc_end之间Q与物理地址没有单的转换关系Q虽然在逻辑上它们也是连l的Q但是在物理上它们不要求q箋?/p>
VMALLOC INFO
获取该log:d文g/proc/vmallocinfo
虚拟内存分配情况
SLAB INFO
获取该log:d文g/proc/slabinfo
SLAB是一U内存分配器.q里输出该分配器的一些信?/p>
ZONEINFO
获取该log:d文g/proc/zoneinfo
zone info
SYSTEM LOG(需要着重分?
获取该log:执行/system/bin/logcat -v time -d *:v
会输出在E序中输出的Log,用于分析pȝ的当前状?/p>
VM TRACES
获取该log:d文g/data/anr/traces.txt
因ؓ每个E序都是在各自的VM中运行的,q个Log是现实各自VM的一些traces
EVENT LOG TAGS
获取该log:d文g/etc/event-log-tags
EVENT LOG
获取该log:执行/system/bin/logcat -b events -v time -d *:v
输出一些Event的log
RADIO LOG
获取该log:执行/system/bin/logcat -b radio -v time -d *:v
昄一些无U设备的链接状?如GSMQPHONE,STK(Satellite Tool Kit)...
NETWORK STATE
获取该log:执行/system/bin/netcfg (得到|络链接状?
获取该log:d文g/proc/net/route (得到路由状?
昄|络链接和\?/p>
SYSTEM PROPERTIES
获取该log:参考代码实?/p>
昄一些系l属?如Version,Services,network...
KERNEL LOG
获取该log:执行/system/bin/dmesg
昄Android内核输出的Log
KERNEL WAKELOCKS
获取该log:d文g/proc/wakelocks
内核对一些程式和服务唤醒和休眠的一些记?/p>
KERNEL CPUFREQ
(Linux kernel CPUfreq subsystem) Clock scaling allows you to change the clock speed of the CPUs on the fly.
This is a nice method to save battery power, because the lower the clock speed is, the less power the CPU consumes.
PROCESSES
获取该log:执行ps -P
昄当前q程
PROCESSES AND THREADS
获取该log:执行ps -t -p -P
昄当前q程和线E?/p>
LIBRANK
获取该log:执行/system/xbin/librank
剔除不必要的library
BINDER FAILED TRANSACTION LOG
获取该log:d文g/proc/binder/failed_transaction_log
BINDER TRANSACTION LOG
获取该log:d文g/proc/binder/transaction_log
BINDER TRANSACTIONS
获取该log:d文g/proc/binder/transactions
BINDER STATS
获取该log:d文g/proc/binder/stats
BINDER PROCESS STATE
获取该log:d文g/proc/binder/proc/*
bind相关的一些状?/p>
FILESYSTEMS
获取该log:执行/system/bin/df
主要文g的一些容量用状?cache,sqlite,dev...)
PACKAGE SETTINGS
获取该log:d文g/data/system/packages.xml
pȝ中package的一些状?讉K权限,路径...)Q类似Windows里面的一些lnk文g?
PACKAGE UID ERRORS
获取该log:d文g/data/system/uiderrors.txt
错误信息
KERNEL LAST KMSG LOG
最新kernel message log
LAST RADIO LOG
最新radio log
KERNEL PANIC CONSOLE LOG
KERNEL PANIC THREADS LOG
控制?U程的一些错误信息log
BACKLIGHTS
获取该log:获取LCD brightness?sys/class/leds/lcd-backlight/brightness
获取该log:获取Button brightness?sys/class/leds/button-backlight/brightness
获取该log:获取Keyboard brightness?sys/class/leds/keyboard-backlight/brightness
获取该log:获取ALS mode?sys/class/leds/lcd-backlight/als
获取该log:获取LCD driver registers?sys/class/leds/lcd-backlight/registers
获取相关亮度的一些信?/p>
VERSION INFO输出下列信息
当前旉
当前内核版本:可以d文g(/proc/version)获得
昄当前命o:可以d文g?/proc/cmdline)获得
昄pȝbuild的一些属?可以d文g(/system/build.prop)获得
输出pȝ一些属?br style="line-height: normal; " /> gsm.version.ril-impl
gsm.version.baseband
gsm.imei
gsm.sim.operator.numeric
gsm.operator.alpha
执行/system/bin/dumpsys后可以获得这个log.
l常会发现该log输出不完?因ؓ代码里面要求该工h多只执行60ms,可能会导致log无法完全输出?
可以通过修改旉参数来保证log完全输出.
信息:
Currently running services
DUMP OF SERVICE services-name(running)
Site: ."frameworks"base"cmds"dumpstate"
相关LogE序的代码可以从上面目录获取
1.查看一些版本信?br style="line-height: normal; " /> 认问题的系l环?br style="line-height: normal; " /> 2.查看CPU/MEMORY的用状?br style="line-height: normal; " /> 看是否有内存耗尽,CPUJ忙q样的背景情况出?
3.分析traces
因ؓtraces是系l出错以后输出的一些线E堆栈信?可以很快定位到问题出在哪?
4.分析SYSTEM LOG
pȝLog详细输出各种log,可以扑և相关logq行逐一分析
下面分析我写的一个测试例?在OnCreate做一个死循环,q样ȝE会被锁住,在按下硬件的Back之后会出现ANR的错?
在traces中发现该E序的堆栈信息如?----- pid 20597 at 2010-03-15 01:29:53 -----
Cmd line: com.android.test
DALVIK THREADS:
"main" prio=5 tid=3 TIMED_WAIT
| group="main" sCount=1 dsCount=0 s=N obj=0x2aac6240 self=0xbda8
| sysTid=20597 nice=0 sched=0/0 cgrp=default handle=1877232296
at java.lang.VMThread.sleep(Native Method)
at java.lang.Thread.sleep(Thread.java:1306)
at java.lang.Thread.sleep(Thread.java:1286)
at android.os.SystemClock.sleep(SystemClock.java:114)
at com.android.test.main.onCreate(main.java:20)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
at android.app.ActivityThread.access$2200(ActivityThread.java:119)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4363)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
at dalvik.system.NativeStart.main(Native Method)
"Binder Thread #2" prio=5 tid=11 NATIVE
| group="main" sCount=1 dsCount=0 s=N obj=0x2fb7c260 self=0x143860
| sysTid=20601 nice=0 sched=0/0 cgrp=default handle=1211376
at dalvik.system.NativeStart.run(Native Method)
"Binder Thread #1" prio=5 tid=9 NATIVE
| group="main" sCount=1 dsCount=0 s=N obj=0x2fb7c1a0 self=0x14c980
| sysTid=20600 nice=0 sched=0/0 cgrp=default handle=1207920
at dalvik.system.NativeStart.run(Native Method)
"Signal Catcher" daemon prio=5 tid=7 RUNNABLE
| group="system" sCount=0 dsCount=0 s=N obj=0x2fb7a1e8 self=0x126cc0
| sysTid=20599 nice=0 sched=0/0 cgrp=default handle=1269048
at dalvik.system.NativeStart.run(Native Method)
"HeapWorker" daemon prio=5 tid=5 VMWAIT
| group="system" sCount=1 dsCount=0 s=N obj=0x2e31daf0 self=0x135c08
| sysTid=20598 nice=0 sched=0/0 cgrp=default handle=1268528
at dalvik.system.NativeStart.run(Native Method)
----- end 20597 -----该文件的堆栈l构从下往上进行分?br style="line-height: normal; " /> (1)栈底at dalvik.system.NativeStart.run(Native Method)
pȝ为当前的task(应用E式)启动一个专用的虚拟?nbsp;
(2) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
Activity Services是在后台负责理Activity,它此时将试例子的Activity启动h?br style="line-height: normal; " /> (3)at com.android.test.main.onCreate(main.java:20)
启动试E序
(4)栈顶at java.lang.VMThread.sleep(Native Method)
U程被sleep掉了,所以无法响应用?出现ANR错误.
上面是对一个非常简单的问题的分?
如果遇到比较复杂的问题还需要详l分析SYSTEM LOG.
1.比如|络异常,要通过SYSTEM LOG里面输出的网l链接信息来判断|络状?br style="line-height: normal; " />
2.数据传输,|络链接{耗时的操作需要分析SYSTEM LOG里面ActivityManager的响应时?/p>
转自:http://blog.csdn.net/liujian885/archive/2010/03/22/5404834.aspx
http://hi.baidu.com/donghaozheng/blog/item/30a00d4f9fca873baec3ab69.html
?android 的API中有提供 SystemClock.setCurrentTimeMillis()函数来修改系l时_可惜无论你怎么调用q个函数都是没用的,无论模拟器还是真机,在logcat中M得到"Unable to open alarm driver: Permission denied ".q个函数需要root权限或者运行与pȝq程中才可以用?/p>
本来以ؓ没有办法在应用E序q一层改pȝ旉了,后来在网上搜了好久,知道q个目的q是可以辑ֈ的?/p>
W一个方法简单点Q不q需要在Androidpȝ源码的环境下用make来编译:
1. 在应用程序的AndroidManifest.xml中的manifest节点中加入android:sharedUserId="android.uid.system"q个属性?/p>
2. 修改Android.mk文gQ加入LOCAL_CERTIFICATE := platformq一?/p>
3. 使用mm命o来编译,生成的apk有修改pȝ旉的权限了?/p>
W二个方法麻烦点Q不q不用开虚拟到源码环境下用make来编译:
1. 同上Q加入android:sharedUserId="android.uid.system"q个属性?/p>
2. 使用eclipse~译出apk文gQ但是这个apk文g是不能用的?/p>
3. 用压~Y件打开apk文gQ删掉META-INF目录下的CERT.SF和CERT.RSA两个文g?/p>
4. 使用目标pȝ的platform密钥来重新给apk文g{。这步比较麻烦,首先扑ֈ密钥文gQ在我的Android源码目录中的位置?build\target\product\security"Q下面的platform.pk8和platform.x509.pem两个文g。然后用Android提供的Signapk工具来签名,signapk的源代码是在"build\tools\signapk"下,用法?signapk platform.x509.pem platform.pk8 input.apk output.apk"Q文件名最好用绝对\径防止找不到Q也可以修改源代码直接用?/p>
q样最后得到的apk和第一个方法是一L?/p>
最后解释一下原理,首先加入android:sharedUserId="android.uid.system"q个属性。通过Shared User id,拥有同一个User id的多个APK可以配置成运行在同一个进E中。那么把E序的UID配成android.uid.systemQ也是要让E序q行在系l进E中Q这样就有权限来修改pȝ旉了?/p>
只是加入UIDq不够,如果q时候安装APK的话发现无法安装Q提C签名不W,原因是程序想要运行在pȝq程中还要有目标pȝ的platform keyQ就是上面第二个Ҏ提到的platform.pk8和platform.x509.pem两个文g。用q两个key{后apk才真正可以放入系l进E中。第一个方法中加入LOCAL_CERTIFICATE := platform其实是用这两个key来签名?/p>
q也有一个问题,是q样生成的程序只有在原始的Androidpȝ或者是自己~译的系l中才可以用Q因Lpȝ才可以拿到platform.pk8和platform.x509.pem两个文g。要是别家公司做的Android上连安装都安装不了。试试原始的Android中的key来签名,E序在模拟器上运行OKQ不q放到G3上安装直接提C?Package ... has no signatures that match those in shared user android.uid.system"Q这样也是保护了pȝ的安全?/p>
最最后还说下Q这个android:sharedUserId属性不只可以把apk攑ֈpȝq程中,也可以配|多个APKq行在一个进E中Q这样可以共享数据,应该会很有用的?/p>
博主补充Q?/strong>
signapk~译l束后在 android目录?out/host/linux-x86/framework/signapk.jar
使用ҎQjava -jar signapk.jar platform.x509.pem platform.pk8 test.apk test_signed.apk
实践证明Q第二种Ҏ不需要删掉META-INF目录下的CERT.SF和CERT.RSA两个文gQ直接signapk可以?/p>
(1) Loopercd用来Z个线E开启一个消息@环。默认情况下Android中新诞生的线E是没有开启消息@环的。(ȝE除外,ȝE系l会自动为其创徏Looper对象Q开启消息@环)
Looper对象通过MessageQueue来存放消息和事g。一个线E只能有一个LooperQ对应一个MessageQueue?/p>
(2) 通常是通过Handler对象来与Looper交互的。Handler可看做是Looper的一个接口,用来向指定的Looper发送消息及定义处理Ҏ?/p>
默认情况下Handler会与其被定义时所在线E的Looperl定Q比如,在主U程中定义,其是与主U程的Looperl定?/p>
mainHandler = new Handler() {h于new HandlerQLooper.myLooper()Q?
Looper.myLooper()QReturn the Looper object associated with the current thread 获取当前q程的looper对象?/p>
q有一个类似的 Looper.getMainLooper() 用于获取ȝE的Looper对象?/p>
(3) 在非ȝE中直接new Handler() 会报如下的错?
E/AndroidRuntime( 6173): Uncaught handler: thread Thread-8 exiting due to uncaught exception
E/AndroidRuntime( 6173): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
原因是非ȝE中默认没有创徏Looper对象Q需要先调用Looper.prepare()启用Looper?/p>
(4) Looper.loop(); 让Looper开始工作,从消息队列里取消息,处理消息?/p>
注意Q写在Looper.loop()之后的代码不会被执行Q这个函数内部应该是一个@环,当调用mHandler.getLooper().quit()后,loop才会中止Q其后的代码才能得以q行?/p>
(5) Z以上知识Q可实现ȝE给子线E(非主U程Q发送消息?/p>
把下面例子中的mHandler声明成类成员Q在ȝE通过mHandler发送消息即可?/p>
(6) Android官方文档中Looper的介l:
Class used to run a message loop for a thread. Threads by default do not have a message loop associated with them; to create one, call prepare() in the thread that is to run the loop, and then loop() to have it process messages until the loop is stopped.
Most interaction with a message loop is through the Handler class.
This is a typical example of the implementation of a Looper thread, using the separation ofprepare() and loop() to create an initial Handler to communicate with the Looper.
class LooperThread extends Thread {
public Handler mHandler;
public void run() {
Looper.prepare();
mHandler = new Handler() {
public void handleMessage(Message msg) {
// process incoming messages here
}
};
Looper.loop();
}
}
很多|友可能发现在Android的layout文g中layout_width或layout_height有时候可能会指定具体的单位,比如有时候ؓpx、dip或者sp{等。下面android123把常见的单位做下单的介绍Q比如说
px (pixels)像素 -- 一般我们HVGA代表320x480像素Q这个用的比较多?/p>
dip或dp (device independent pixels)讑֤独立像素 -- q个和设备硬件有养I一般我们ؓ了支持WVGA、HVGA和QVGA cwj推荐使用q个Q不依赖像素?/p>
sp (scaled pixels ?best for text size)攑֤像素-- 主要处理字体的大?/p>
下面的几个是不常用的Q大家也知道q里android123׃再过多的赘述?/p>
in (inches)英寸
mm (millimeters)毫米
pt (points)?/p>
px像素如何转ؓdip讑֤独立像素
最q有|友问如何将px像素转ؓdip独立讑֤像素Q由于Android的设备分辨率众多Q目前主的为wvgaQ而很多老的讑֤为hvga甚至?端的qvgaQ对于兼Ҏ来说用dip无非是比较方便的Q由于他和分辨率无关和屏q的密度大小有关Q所以推荐用,不过q里android123提示?Ӟophone os的手机对于dip的支持糟p透了Q显C的l果会放大很多,同时黑色的主题会D常规的黑色文字让用户无法分L?/p>
px= (int) (dip*density+0.5f) //q里android开发网提示大家很多|友获取density的方法存在问题,从资源中获取的是静态定义的Q一般ؓ1.0对于HVGA是正好的Q而对于wvgaq样的应该从WindowsManager中获取,WVGA?.5
QVGA HVGA WVGA区别
文章分类:Ud开?/p>
QVGA?Quarter VGA"。顾名思义即VGA的四分之一寸Q亦卛_液晶屏幕QLCDQ上输出的分辨率?40×320像素。QVGA支持屏幕旋{Q可以开发出相应的程序,以显C旋?0°?80°?70°屏幕位置。由HandEra公司发布。多用于手持/Ud讑֤? 需要说明的是有些媒体把QVGA屏幕当成与TFT和TFD{LCD材质相同的东西是错误的,QVGA屏幕的说法多见与日本的一些手ZQ目前采用微软Pocket PC操作pȝ的智能手机屏q也大多?20×240像素的QVGA屏幕? 所谓QVGA液晶技术,是在液晶屏q上输出的分辨率?40×320的液晶输出方式。这个分辨率其实和屏q本w的大小q没有关pR比如说Q如?.1英寸液晶昄屏幕可以昄240×320分L率的囑փQ就叫做“QVGA 2.1英寸液晶昄?#8221;Q如?.8英寸液晶昄屏幕可以昄240×320的图像,叫?#8220;QVGA 3.8英寸液晶昄?#8221;Q以上两U情况虽然具有相同的分L率,但是׃寸的不同实际的视觉效果也不同,一?HVGA 即VGA(640*480)的一?分L率ؓ(480*320),(3:2宽高? 它是用于各种各样的PDA讑֤Q首先是2002q的索尼Clie PEG - NR70Q?来说屏幕的一个画面自然也会细M些?WVGA 数码产品屏幕材质的一U,VGA的另一UŞ式,比VGA分L率高Q别?Q?Wide VGA, Q其分辩率ؓ800×480象素。是扩大了VGAQ?40×480)的分辨率。应用于PDA和手机等Q因为很多网늚宽度都是800Q所以WVGA的屏q会更加适和于浏览网,可以说是未来手持讑֤的分辨率的大势
From http://blog.csdn.net/maxleng/archive/2010/05/24/5621349.aspx
3 Activity设计框架
3.1 外特性空间的Activity
我们先来看看QAndroid应用开发h员接触的外特性空间中的ActivityQ对于AMS来讲Q这个Activity是客服端的Activity。应用程序员在徏立Android应用Ӟ构徏Activity的子cd是Andoid外特性空间展现的接口。我们可以从下面的简单的例子描述看看ActivityQ到底如何徏立的?/font>
DemoActivity extend Activity
{
onCreate
onResume
onPause
onStop
}
在Android的外Ҏ空?SDK)中,Android应用E序员根本不知道q程是什么时候v来的Q系l消息是如何传递过来的。这个DemoActivity是如何实例化的呢Qƈ且该Activity是托在哪个q程的呢Q本节的分析给出答案?/font>
我们从ActivityThread中可以看到在应用q程中的Activity都被攄在mActivities中?/font>
q些ActivityRecord记录了应用进E中Q程序员建立的Activity子类的实例,我们UC为外Ҏ空间的Activity。这些Activitycd例是攑֜应用E序端进行实际交互的ActivityQ而ؓ了管理这些ActivityQAMS内核中还有一个媄子ActivityQ被UCؓHistoryRecord?/font>
3.2 Activity与HistoryRecord的关p?/font>
在整个系l中QActivity实际上有两个实体。一个在应用q程中跟应用E序员打交道的ActivityQ一个是在AMS的中h理功能的History Record。应用进E中的Activity都登记ActivityThread实例中的mActivity数组中,而在AM端,HistroytRecord实例攄在mHistroy栈中。mHistory栈是Android理Activity的场所Q放|在栈顶的就是User看到的处于活动状态的Activity?/font>
Activity与HistrotyRecord的关pd可以表示如下Q?/font>
Activity的内核实体是依靠在ProcessRecord的成员变量中Q通过ProcessRecord我们可以讉K到所有的属于该Process的Activity。而在ProcessRecord记录了与应用q程之间的联p:IActivtityThread接口。通过该接口,可以讉K到所对应的Activity的方法。在Launch ActivityӞAMS对应的HistoryRecord作ؓtoken传递到客服端和客服端的Activity建立联系。在AMS中Activity状态变化时Q将通过该联pL到客服端的ActivityQ从而将消息或者动作传递应用程序面对的接口QxxxActivity?/font>
1)发vhstartActivity(intent)
2QActivity Service Manager接收到请求执行StartActivity函数?/font>
建立QHistoryRecord实例r.
r 加入到mHistory?/font>
Q?Q通过app.thread.scheduleLaunchActvity( app,r)@ActivityThread.java
Q?Q在App应用中徏立新的ActivityRecord?/font>
Q?Q徏立新的Activity对象q放入到ActivityRecord中?/font>
Q?Q将ActivityRecord加入到mActivites@ActivityThread
(7)发vActivity.onCreate(..),,该onCreate是在你的应用程序XXXActivity中的onCreate?/font>
3.4 Activity的Resume
Q?QActivity什么时候被Resume
Q?QRusume的过E?/font>
通过该过E的研究我们会进一步的了解到AMS与应用进E的交互q程?/font>
在AMS端,满resume条g都会调用Q?/font>Resume的核心函敎ͼresumeTopActivityLocked@ActivityManagerService
XXX当前栈顶的HistroyRecord
1Q窗口切换:隐藏前一个Activity的窗口,
2Q更新LRUListQ(LRUList是淘汰应用程序的依据之一Q?/font>
3) XXX.app.thread.scheduleResumeActivity(XXX,
isNextTransitionForward());
4)completeResumeLocked
setFocusedActivityLocked
mFocusActivity=xxx //此时焦点Actvitiy切换了?/font>
WM.setFocusedApp(xxx,
mWindowManager.executeAppTransition();
mNoAnimActivities.clear();
在应用程序端Q?/font>
Q?QscheduleResumeActivity
handleResumeActivity(IBinder token, boolean clearHide, boolean isForward) {
ActivityRecord r = performResumeActivity(token, clearHide);
ActivityRecord r = mActivities.get(token);
r.activity.performResume()
performResume
整个Resume的过E如下:
Android提供l开发程序员的概늩间中Application只是一个松散的表征概念Q没有多实质上的表征。在Android实际I间中看不到实际意义上的应用E序的概?即有一个叫Application的类Q这个也是个应用程序上下文状态,是一个极度弱化的概念。Application只是一个空间范畴的概念QApplication是ActivityQService之类的组件上下文描述。Applicationq不是Android的核心概念,而Activity才是Android的核心概c?/font>
从Android的SDK文档中,我们知道一般情况Android应用E序是由以下四种lg构造而成的:ActivityQBroadcast Intent ReceiverQ服务(ServiceQ,内容提供器(Content ProviderQ。我们可以用下面的图来表示一下Android的概늩间。这些组件依附于应用E序中,应用E序q不会一开始就建立hQ而是在这些组件徏立v来后Q需要运行时Q才开始徏立应用程序对象?/font>
Z么要从应用进E名U开始?作ؓ内核研究Q我们还是回到问题的最本质处:不管ActivityQService{组件如何设计和q行Q它要提供服务,必要依附在Linux的进E上Q徏立消息@环,lg才能够真正的q作。Activity实例是如何Hosting在Linuxq程上的Q这个是我们首先惌弄明白的?/font>
我们?/font>
allowClearUserData=["true" | "false"]
android:allowTaskReparenting=["true" | "false"]
android:backupAgent="string"
…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" >
. . .
在SDK用已l描q的很清楚到了?/font>
android:process
The name of a process where all components of the application should run. Each component can override this default by setting its own process attribute.
By default, Android creates a process for an application when the first of its components needs to run. All components then run in that process. The name of the default process matches the package name set by the
By setting this attribute to a process name that's shared with another application, you can arrange for components of both applications to run in the same process ?but only if the two applications also share a user ID and be signed with the same certificate.
Z么要提出q么一个定义?android:process名称?/font>
默认状态下QActivity Manager Service在应用程序的W一个组仉要运行时会为应用程序徏立一个进E,而这个进E的名字是android:process=”string”所指定Q缺省的是应用程序包的名字。该q程一旦徏立,后面的该应用的组仉运行在该进E中Q他们绑定的Ҏ是q个AndroidQProcess指定的名Uͼ因ؓ在他们都在同一个应用程序包里,也就h了同Lq程名字Q于是他们都托管在了同一q程中。组件将通过ClassLoader从Package中获取到应用E序的信息?/font>
在徏立ActvitiyӞ如果在应用进E端没有应用对象Q系l在该过E中利用makeApplication建立一个Application对象Q实例化"android.app.Application"Q徏立一个应用程序上下文完成例如资源Qpackage{信息管理?/font>
在分析中Q我们可以看到真正对应应用进E的不是Application而是ActivityThread。我们从实际的应用堆栈可以看刎ͼ
NaiveStart.main()
ZygoteInit.main
ZygoteInit$MethodAndArgsCall.run
Method.Invoke
method.invokeNative
ActivityThread.main()
Looper.loop()
....
每个应用E序都以ActivityThread.main()为入口进入到消息循环处理。对于一个进E来Ԍ我们需要这个闭合的处理框架?/font>
ActivitiyThread是应用程序概늩间的重要概念Q他建立了应用进E运行的框架Qƈ提供了一个IActivityThread接口作ؓ与Activity Manager Service的通讯接口.通过该接口AMS可以Activity的状态变化传递到客户端的Activity对象?/font>
Z叙述的方便我Actvitiy Manager Service写成AMS?/font>
在AMS中关于应用程序的概念是ProcessRecordQ请求都是从ActivityQService…{开始的Q在Activity需要ResumeӞ此时如果与Activity相关的应用进E没有v来,AM则启动应用进E?/font>
AMS与应用进E的l定分ؓ两个部分Q第一部分是AM建立应用q程Q第二部分就是应用进EAttach到AMQ与AM建立通讯通道?/font>
1Q创建徏立进E:startProcessLocked(processName,Appinfo.uid)。该函数在StartSecificActivityLocked{调用?/font>
Q?Q徏立ProcessRecord对象app,q将该对象添加到mProcessNames中。应用对象在mProcessNames中用应用名字和uid来标识自己。如果在同一个Package中的Activity,如果都用默认设|,那么q些Activity都会托管在同一个进E中Q这是因Z们在带的ApplicationInfo中的ProcessName都是一L?/font>
mPidsSelfLocked数组记录了PIDQ这个将会在应用q程跑v来后Q将自己Attach到AMӞҎpid扑ֈ自己的前世:ProcessRecord.
2Qandroid.app.ActivityThreadq程启动
Android.app.ActivityThreadq程建立后,蟩入到ActivityThread的main函数开始运行,q入消息循环?/font>
应用q程使用thread.attach()发vAMS的AttachApplicationLocked调用Qƈ传?ActvitiyThread对象和CallingPid。AttachApplicationLocked根据CallingPid在mPidsSelfLocked扑ֈ对应的ProcessRecord实例app,ActvitiyThread攄app.thread中。这样应用进E和AMS建立h双向q接。AM可以使用AIDL接口Q通过app.thread可以讉K应用q程的对象?/font>
应用E序通过ActivityThread提供的框Ӟ建立消息循环Looper和Handler。从前面的相关章节我们知道有Looper和Handler,整个pȝ可以运作了?/font>
Z更ؓpȝ的了解应用程序的建立时序及其涉及到数据操作,我给Z应用q程的徏立过E示意图Q?/font>
看到可能很多朋友对于G1版本的不解,我就把我的理解发出来分nl大?br />
如果有疑问或者徏议可以提出来Q我们互相学习进步,有不对的指出h出,新手也可以看看,帮助学习理解G1的版本问题?br />
杰尼原创Q{载请注明
通常我们所说的关键词有很多比如RC30 RC8 RC33 JFV1.31 JFV.1.41 汉化?nbsp; 主题?nbsp; 降包之cȝ
下面我来详细解释下?/font>