首页 文章 精选 留言 我的

精选列表

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

ASP.NET 2.0 XML 系列(4):用XmlReader类介绍

(本文摘自MSDN) XmlReader类是一个提供对 XML 数据的非缓存、只进只读访问的抽象基类。该类符合 W3C 可扩展标记语言 (XML) 1.0 和 XML 中的命名空间的建议。 XmlReader 类支持从流或文件读取 XML 数据。该类定义的方法和属性使您可以浏览数据并读取节点的内容。当前节点指读取器所处的节点。使用任何返回当前节点值的读取方法和属性推进读取器。 XmlReader 类使您可以: 检查字符是不是合法的 XML 字符,元素和属性的名称是不是有效的 XML 名称。 检查 XML 文档的格式是否正确。 根据 DTD 或架构验证数据。 从 XML 流检索数据或使用提取模型跳过不需要的记录。 使用XmlReader读取XML文档之前,我们有必要了解一下这个类的属性和方法,以及节点XmlNode的类型。 1. XmlReader类的属性 名称 说明 AttributeCount 当在派生类中被重写时,获取当前节点上的属性数。 BaseURI 当在派生类中被重写时,获取当前节点的基 URI。 CanReadBinaryContent 获取一个值,该值指示 XmlReader 是否实现二进制内容读取方法。 CanReadValueChunk 获取一个值,该值指示XmlReader是否实现 ReadValueChunk 方法。 CanResolveEntity 获取一个值,该值指示此读取器是否可以分析和解析实体。 Depth 当在派生类中被重写时,获取 XML 文档中当前节点的深度。 EOF 当在派生类中被重写时,获取一个值,该值指示此读取器是否定位在流的结尾。 HasAttributes 获取一个值,该值指示当前节点是否有任何属性。 HasValue 当在派生类中被重写时,获取一个值,该值指示当前节点是否可以具有 Value。 IsDefault 当在派生类中被重写时,获取一个值,该值指示当前节点是否是从 DTD 或架构中定义的默认值生成的属性。 IsEmptyElement 当在派生类中被重写时,获取一个值,该值指示当前节点是否为空元素(例如<MyElement/>)。 Item 已重载。 当在派生类中被重写时,获取此属性的值。 LocalName 当在派生类中被重写时,获取当前节点的本地名称。 Name 当在派生类中被重写时,获取当前节点的限定名。 NamespaceURI 当在派生类中被重写时,获取读取器定位在其上的节点的命名空间 URI(采用 W3C 命名空间规范中定义的形式)。 NameTable 当在派生类中被重写时,获取与该实现关联的 XmlNameTable。 NodeType 当在派生类中被重写时,获取当前节点的类型。 Prefix 当在派生类中被重写时,获取与当前节点关联的命名空间前缀。 QuoteChar 当在派生类中被重写时,获取用于括住属性节点值的引号字符。 ReadState 当在派生类中被重写时,获取读取器的状态。 SchemaInfo 获取作为架构验证结果分配给当前节点的架构信息。 Settings 获取用于创建此XmlReader实例的 XmlReaderSettings 对象。 Value 当在派生类中被重写时,获取当前节点的文本值。 ValueType 获取当前节点的公共语言运行库 (CLR) 类型。 XmlLang 当在派生类中被重写时,获取当前的xml:lang范围。 XmlSpace 当在派生类中被重写时,获取当前的xml:space范围。 2. XmlReader类的方法 名称 说明 Close 当在派生类中被重写时,将 ReadState 更改为Closed。 Create 已重载。 创建一个新的 XmlReader 实例。 Equals 已重载。 确定两个 Object 实例是否相等。 (从 Object 继承。) GetAttribute 已重载。 当在派生类中被重写时,获取属性的值。 GetHashCode 用作特定类型的哈希函数。GetHashCode 适合在哈希算法和数据结构(如哈希表)中使用。 (从 Object 继承。) GetType 获取当前实例的 Type。 (从 Object 继承。) IsName 获取一个值,该值指示字符串参数是否是有效的 XML 名称。 IsNameToken 获取一个值,该值指示该字符串参数是否是有效的 XML 名称标记。 IsStartElement 已重载。 测试当前内容节点是否是开始标记。 LookupNamespace 当在派生类中被重写时,在当前元素的范围内解析命名空间前缀。 MoveToAttribute 已重载。 当在派生类中被重写时,移动到指定的属性。 MoveToContent 检查当前节点是否是内容(非空白文本、CDATA、Element、EndElement、EntityReference或EndEntity)节点。如果此节点不是内容节点,则读取器向前跳至下一个内容节点或文件结尾。它跳过以下类型的节点:ProcessingInstruction、DocumentType、Comment、Whitespace或SignificantWhitespace。 MoveToElement 当在派生类中被重写时,移动到包含当前属性节点的元素。 MoveToFirstAttribute 当在派生类中被重写时,移动到第一个属性。 MoveToNextAttribute 当在派生类中被重写时,移动到下一个属性。 Read 当在派生类中被重写时,从流中读取下一个节点。 ReadAttributeValue 当在派生类中被重写时,将属性值解析为一个或多个Text、EntityReference或EndEntity节点。 ReadContentAs 将内容作为指定类型的对象读取。 ReadContentAsBase64 读取内容并返回 Base64 解码的二进制字节。 ReadContentAsBinHex 读取内容并返回BinHex解码的二进制字节。 ReadContentAsBoolean 将当前位置的文本内容作为Boolean读取。 ReadContentAsDateTime 将当前位置的文本内容作为 DateTime 对象读取。 ReadContentAsDecimal 将当前位置的文本内容作为 Decimal 对象读取。 ReadContentAsDouble 将当前位置的文本内容作为双精度浮点数读取。 ReadContentAsFloat 将当前位置的文本内容作为单精度浮点数读取。 ReadContentAsInt 将当前位置的文本内容作为 32 位有符号整数读取。 ReadContentAsLong 将当前位置的文本内容作为 64 位有符号整数读取。 ReadContentAsObject 将当前位置的文本内容作为Object读取。 ReadContentAsString 将当前位置的文本内容作为 String 对象读取。 ReadElementContentAs 已重载。 读取当前元素,并将内容作为指定类型的对象返回。 ReadElementContentAsBase64 读取元素并对Base64内容进行解码。 ReadElementContentAsBinHex 读取元素并对BinHex内容进行解码。 ReadElementContentAsBoolean 已重载。 将当前元素值作为 Boolean 对象读取。 ReadElementContentAsDateTime 已重载。 读取当前元素并将内容作为DateTime对象返回。 ReadElementContentAsDecimal 已重载。 将当前元素值作为Decimal对象读取。 ReadElementContentAsDouble 已重载。 读取当前元素并将内容作为双精度浮点数返回。 ReadElementContentAsFloat 已重载。 将当前元素值作为单精度浮点数读取。 ReadElementContentAsInt 已重载。 读取当前元素并将内容作为 32 位有符号整数返回。 ReadElementContentAsLong 已重载。 读取当前元素并将内容作为 64 位有符号整数返回。 ReadElementContentAsObject 已重载。 读取当前元素并将内容作为Object返回。 ReadElementContentAsString 已重载。 读取当前元素并将内容作为String对象返回。 ReadElementString 已重载。 这是一个用于读取简单纯文本元素的 Helper 方法。 ReadEndElement 检查当前内容节点是否为结束标记并将读取器推进到下一个节点。 ReadInnerXml 当在派生类中被重写时,将所有内容(包括标记)当做字符串读取。 ReadOuterXml 当在派生类中被重写时,读取表示该节点和所有它的子级的内容(包括标记)。 ReadStartElement 已重载。 检查当前节点是否为元素并将读取器推进到下一个节点。 ReadString 当在派生类中被重写时,将元素或文本节点的内容当做字符串读取。 ReadSubtree 返回新的XmlReader实例,此实例可用于读取当前节点及其所有子节点。 ReadToDescendant 已重载。 让XmlReader前进到下一个匹配的子代元素。 ReadToFollowing 已重载。 一直读取,直到找到命名元素。 ReadToNextSibling 已重载。 让XmlReader前进到下一个匹配的同级元素。 ReadValueChunk 读取嵌入在 XML 文档中的大量文本流。 ReferenceEquals 确定指定的Object实例是否是相同的实例。 (从 Object 继承。) ResolveEntity 当在派生类中被重写时,解析EntityReference节点的实体引用。 Skip 跳过当前节点的子级。 ToString 返回表示当前Object的String。 (从Object继承。) 3. XmlNodeType枚举成员 成员名称 说明 Attribute 属性(例如,id='123')。Attribute节点可以具有以下子节点类型:Text和EntityReference。Attribute节点不以任何其他节点类型子节点的形式出现。不将其视为Element的子节点。 CDATA CDATA 节(例如,<![CDATA[my escaped text]]>)。CDATA 节用于转义否则将被识别为标记的文本块。CDATA节点不能有任何子节点。它可以以DocumentFragment、EntityReference和Element节点子级的形式出现。 Comment 注释(例如,<!-- my comment -->)。Comment节点不能有任何子节点。它可以以Document、DocumentFragment、Element和EntityReference节点子级的形式出现。 Document 作为文档树的根的文档对象提供对整个 XML 文档的访问。Document节点可以具有以下子节点类型:XmlDeclaration、Element(最多一个)、ProcessingInstruction、Comment和DocumentType。它不能以任何节点类型子级的形式出现。 DocumentFragment 文档片段。DocumentFragment节点将节点或子树与文档关联起来,而实际上并不包含在该文档中。DocumentFragment节点可以具有以下子节点类型:Element、ProcessingInstruction、Comment、Text、CDATA和EntityReference。它不能以任何节点类型子级的形式出现。 DocumentType 由以下标记指示的文档类型声明(例如,<!DOCTYPE...>)。DocumentType节点可以具有以下子节点类型:Notation和Entity。它可以以Document节点子级的形式出现。 Element 元素(例如,<item>)。Element节点可以具有以下子节点类型:Element、Text、Comment、ProcessingInstruction、CDATA和EntityReference。它可以是Document、DocumentFragment、EntityReference和Element节点的子级。 EndElement 末尾元素标记(例如,</item>)。 当XmlReader到达元素的末尾时,返回EndElement节点。 EndEntity 由于调用ResolveEntity而使XmlReader到达实体替换的末尾时返回。 Entity 实体声明(例如,<!ENTITY...>)。Entity节点可以具有表示已展开实体的子节点(例如Text和EntityReference节点)。它可以以DocumentType节点子级的形式出现。 EntityReference 实体引用(例如,&num;)。EntityReference节点可以具有以下子节点类型:Element、ProcessingInstruction、Comment、Text、CDATA和EntityReference。它可以以Attribute、DocumentFragment、Element和EntityReference节点子级的形式出现。 None 如果未调用Read方法,则由XmlReader返回。 Notation 文档类型声明中的表示法(例如,<!NOTATION...>)。Notation节点不能具有任何子节点。它可以以DocumentType节点子级的形式出现。 ProcessingInstruction 处理指令(例如,<?pi test?>)。ProcessingInstruction节点不能具有任何子节点。它可以以Document、DocumentFragment、Element和EntityReference节点子级的形式出现。 SignificantWhitespace 混合内容模型中标记间的空白或xml:space="preserve"范围内的空白。 Text 节点的文本内容。Text节点不能具有任何子节点。它可以以Attribute、DocumentFragment、Element和EntityReference节点的子节点的形式出现。 Whitespace 标记间的空白。 XmlDeclaration XML 声明(例如,<?xml version='1.0'?>)。XmlDeclaration节点必须是文档中的第一个节点。它不能具有子级。它是Document节点的子级。它可以具有提供版本和编码信息的属性。 本文转自敏捷的水博客园博客,原文链接 http://www.cnblogs.com/cnblogsfans/archive/2008/03/15/1107217.html如需转载请自行联系原作者 王德水

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

Android应用程序安装过程源代码分析(4

Step 12.PackageManagerService.scanPackageLI 这个函数定义在frameworks/base/services/java/com/android/server/PackageManagerService.java文件中: [java] view plain copy classPackageManagerServiceextendsIPackageManager.Stub{ ...... //KeysareString(packagename),valuesarePackage.Thisalsoserves //asthelockfortheglobalstate.Methodsthatmustbecalledwith //thislockheldhavetheprefix"LP". finalHashMap<String,PackageParser.Package>mPackages= newHashMap<String,PackageParser.Package>(); ...... //Allavailableactivities,foryourresolvingpleasure. finalActivityIntentResolvermActivities= newActivityIntentResolver(); //Allavailablereceivers,foryourresolvingpleasure. finalActivityIntentResolvermReceivers= newActivityIntentResolver(); //Allavailableservices,foryourresolvingpleasure. finalServiceIntentResolvermServices=newServiceIntentResolver(); //KeysareString(providerclassname),valuesareProvider. finalHashMap<ComponentName,PackageParser.Provider>mProvidersByComponent= newHashMap<ComponentName,PackageParser.Provider>(); ...... privatePackageParser.PackagescanPackageLI(PackageParser.Packagepkg, intparseFlags,intscanMode,longcurrentTime){ ...... synchronized(mPackages){ ...... //AddthenewsettingtomPackages mPackages.put(pkg.applicationInfo.packageName,pkg); ...... intN=pkg.providers.size(); inti; for(i=0;i<N;i++){ PackageParser.Providerp=pkg.providers.get(i); p.info.processName=fixProcessName(pkg.applicationInfo.processName, p.info.processName,pkg.applicationInfo.uid); mProvidersByComponent.put(newComponentName(p.info.packageName, p.info.name),p); ...... } N=pkg.services.size(); for(i=0;i<N;i++){ PackageParser.Services=pkg.services.get(i); s.info.processName=fixProcessName(pkg.applicationInfo.processName, s.info.processName,pkg.applicationInfo.uid); mServices.addService(s); ...... } N=pkg.receivers.size(); r=null; for(i=0;i<N;i++){ PackageParser.Activitya=pkg.receivers.get(i); a.info.processName=fixProcessName(pkg.applicationInfo.processName, a.info.processName,pkg.applicationInfo.uid); mReceivers.addActivity(a,"receiver"); ...... } N=pkg.activities.size(); for(i=0;i<N;i++){ PackageParser.Activitya=pkg.activities.get(i); a.info.processName=fixProcessName(pkg.applicationInfo.processName, a.info.processName,pkg.applicationInfo.uid); mActivities.addActivity(a,"activity"); ...... } ...... } ...... returnpkg; } ...... } 这个函数主要就是把前面解析应用程序得到的package、provider、service、receiver和activity等信息保存在PackageManagerService服务中了。 这样,在Android系统启动的时候安装应用程序的过程就介绍完了,但是,这些应用程序只是相当于在PackageManagerService服务注册好了,如果我们想要在Android桌面上看到这些应用程序,还需要有一个Home应用程序,负责从PackageManagerService服务中把这些安装好的应用程序取出来,并以友好的方式在桌面上展现出来,例如以快捷图标的形式。在Android系统中,负责把系统中已经安装的应用程序在桌面中展现出来的Home应用程序就是Launcher了,在下一篇文章中,我们将介绍Launcher是如何启动的以及它是如何从PackageManagerService服务中把系统中已经安装好的应用程序展现出来的,敬请期待。 本文转自 Luoshengyang 51CTO博客,原文链接:http://blog.51cto.com/shyluo/966524,如需转载请自行联系原作者

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

Android应用程序启动过程源代码分析(4

Step 28. ActivityStack.realStartActivityLocked 这个函数定义在frameworks/base/services/java/com/android/server/am/ActivityStack.java文件中: publicclassActivityStack{ ...... finalbooleanrealStartActivityLocked(ActivityRecordr, ProcessRecordapp,booleanandResume,booleancheckConfig) throwsRemoteException{ ...... r.app=app; ...... intidx=app.activities.indexOf(r); if(idx<0){ app.activities.add(r); } ...... try{ ...... List<ResultInfo>results=null; List<Intent>newIntents=null; if(andResume){ results=r.results; newIntents=r.newIntents; } ...... app.thread.scheduleLaunchActivity(newIntent(r.intent),r, System.identityHashCode(r), r.info,r.icicle,results,newIntents,!andResume, mService.isNextTransitionForward()); ...... }catch(RemoteExceptione){ ...... } ...... returntrue; } ...... } 这里最终通过app.thread进入到ApplicationThreadProxy的scheduleLaunchActivity函数中,注意,这里的第二个参数r,是一个ActivityRecord类型的Binder对象,用来作来这个Activity的token值。 Step 29.ApplicationThreadProxy.scheduleLaunchActivity 这个函数定义在frameworks/base/core/java/android/app/ApplicationThreadNative.java文件中: classApplicationThreadProxyimplementsIApplicationThread{ ...... publicfinalvoidscheduleLaunchActivity(Intentintent,IBindertoken,intident, ActivityInfoinfo,Bundlestate,List<ResultInfo>pendingResults, List<Intent>pendingNewIntents,booleannotResumed,booleanisForward) throwsRemoteException{ Parceldata=Parcel.obtain(); data.writeInterfaceToken(IApplicationThread.descriptor); intent.writeToParcel(data,0); data.writeStrongBinder(token); data.writeInt(ident); info.writeToParcel(data,0); data.writeBundle(state); data.writeTypedList(pendingResults); data.writeTypedList(pendingNewIntents); data.writeInt(notResumed?1:0); data.writeInt(isForward?1:0); mRemote.transact(SCHEDULE_LAUNCH_ACTIVITY_TRANSACTION,data,null, IBinder.FLAG_ONEWAY); data.recycle(); } ...... } 这个函数最终通过Binder驱动程序进入到ApplicationThread的scheduleLaunchActivity函数中。 Step 30.ApplicationThread.scheduleLaunchActivity 这个函数定义在frameworks/base/core/java/android/app/ActivityThread.java文件中: publicfinalclassActivityThread{ ...... privatefinalclassApplicationThreadextendsApplicationThreadNative{ ...... //weusetokentoidentifythisactivitywithouthavingtosendthe //activityitselfbacktotheactivitymanager.(mattersmorewithipc) publicfinalvoidscheduleLaunchActivity(Intentintent,IBindertoken,intident, ActivityInfoinfo,Bundlestate,List<ResultInfo>pendingResults, List<Intent>pendingNewIntents,booleannotResumed,booleanisForward){ ActivityClientRecordr=newActivityClientRecord(); r.token=token; r.ident=ident; r.intent=intent; r.activityInfo=info; r.state=state; r.pendingResults=pendingResults; r.pendingIntents=pendingNewIntents; r.startsNotResumed=notResumed; r.isForward=isForward; queueOrSendMessage(H.LAUNCH_ACTIVITY,r); } ...... } ...... } 函数首先创建一个ActivityClientRecord实例,并且初始化它的成员变量,然后调用ActivityThread类的queueOrSendMessage函数进一步处理。 Step 31.ActivityThread.queueOrSendMessage 这个函数定义在frameworks/base/core/java/android/app/ActivityThread.java文件中: publicfinalclassActivityThread{ ...... privatefinalclassApplicationThreadextendsApplicationThreadNative{ ...... //ifthethreadhasn'tstartedyet,wedon'thavethehandler,sojust //savethemessagesuntilwe'reready. privatefinalvoidqueueOrSendMessage(intwhat,Objectobj){ queueOrSendMessage(what,obj,0,0); } ...... privatefinalvoidqueueOrSendMessage(intwhat,Objectobj,intarg1,intarg2){ synchronized(this){ ...... Messagemsg=Message.obtain(); msg.what=what; msg.obj=obj; msg.arg1=arg1; msg.arg2=arg2; mH.sendMessage(msg); } } ...... } ...... } 函数把消息内容放在msg中,然后通过mH把消息分发出去,这里的成员变量mH我们在前面已经见过,消息分发出去后,最后会调用H类的handleMessage函数。 Step 32. H.handleMessage 这个函数定义在frameworks/base/core/java/android/app/ActivityThread.java文件中: publicfinalclassActivityThread{ ...... privatefinalclassHextendsHandler{ ...... publicvoidhandleMessage(Messagemsg){ ...... switch(msg.what){ caseLAUNCH_ACTIVITY:{ ActivityClientRecordr=(ActivityClientRecord)msg.obj; r.packageInfo=getPackageInfoNoCheck( r.activityInfo.applicationInfo); handleLaunchActivity(r,null); }break; ...... } ...... } ...... } 这里最后调用ActivityThread类的handleLaunchActivity函数进一步处理。 Step 33.ActivityThread.handleLaunchActivity 这个函数定义在frameworks/base/core/java/android/app/ActivityThread.java文件中: publicfinalclassActivityThread{ ...... privatefinalvoidhandleLaunchActivity(ActivityClientRecordr,IntentcustomIntent){ ...... Activitya=performLaunchActivity(r,customIntent); if(a!=null){ r.createdConfig=newConfiguration(mConfiguration); BundleoldState=r.state; handleResumeActivity(r.token,false,r.isForward); ...... }else{ ...... } } ...... } 这里首先调用performLaunchActivity函数来加载这个Activity类,即shy.luo.activity.MainActivity,然后调用它的onCreate函数,最后回到handleLaunchActivity函数时,再调用handleResumeActivity函数来使这个Activity进入Resumed状态,即会调用这个Activity的onResume函数,这是遵循Activity的生命周期的。 Step 34.ActivityThread.performLaunchActivity 这个函数定义在frameworks/base/core/java/android/app/ActivityThread.java文件中: publicfinalclassActivityThread{ ...... privatefinalActivityperformLaunchActivity(ActivityClientRecordr,IntentcustomIntent){ ActivityInfoaInfo=r.activityInfo; if(r.packageInfo==null){ r.packageInfo=getPackageInfo(aInfo.applicationInfo, Context.CONTEXT_INCLUDE_CODE); } ComponentNamecomponent=r.intent.getComponent(); if(component==null){ component=r.intent.resolveActivity( mInitialApplication.getPackageManager()); r.intent.setComponent(component); } if(r.activityInfo.targetActivity!=null){ component=newComponentName(r.activityInfo.packageName, r.activityInfo.targetActivity); } Activityactivity=null; try{ java.lang.ClassLoadercl=r.packageInfo.getClassLoader(); activity=mInstrumentation.newActivity( cl,component.getClassName(),r.intent); r.intent.setExtrasClassLoader(cl); if(r.state!=null){ r.state.setClassLoader(cl); } }catch(Exceptione){ ...... } try{ Applicationapp=r.packageInfo.makeApplication(false,mInstrumentation); ...... if(activity!=null){ ContextImplappContext=newContextImpl(); appContext.init(r.packageInfo,r.token,this); appContext.setOuterContext(activity); CharSequencetitle=r.activityInfo.loadLabel(appContext.getPackageManager()); Configurationconfig=newConfiguration(mConfiguration); ...... activity.attach(appContext,this,getInstrumentation(),r.token, r.ident,app,r.intent,r.activityInfo,title,r.parent, r.embeddedID,r.lastNonConfigurationInstance, r.lastNonConfigurationChildInstances,config); if(customIntent!=null){ activity.mIntent=customIntent; } r.lastNonConfigurationInstance=null; r.lastNonConfigurationChildInstances=null; activity.mStartedActivity=false; inttheme=r.activityInfo.getThemeResource(); if(theme!=0){ activity.setTheme(theme); } activity.mCalled=false; mInstrumentation.callActivityOnCreate(activity,r.state); ...... r.activity=activity; r.stopped=true; if(!r.activity.mFinished){ activity.performStart(); r.stopped=false; } if(!r.activity.mFinished){ if(r.state!=null){ mInstrumentation.callActivityOnRestoreInstanceState(activity,r.state); } } if(!r.activity.mFinished){ activity.mCalled=false; mInstrumentation.callActivityOnPostCreate(activity,r.state); if(!activity.mCalled){ thrownewSuperNotCalledException( "Activity"+r.intent.getComponent().toShortString()+ "didnotcallthroughtosuper.onPostCreate()"); } } } r.paused=true; mActivities.put(r.token,r); }catch(SuperNotCalledExceptione){ ...... }catch(Exceptione){ ...... } returnactivity; } ...... } 函数前面是收集要启动的Activity的相关信息,主要package和component信息: ActivityInfoaInfo=r.activityInfo; if(r.packageInfo==null){ r.packageInfo=getPackageInfo(aInfo.applicationInfo, Context.CONTEXT_INCLUDE_CODE); } ComponentNamecomponent=r.intent.getComponent(); if(component==null){ component=r.intent.resolveActivity( mInitialApplication.getPackageManager()); r.intent.setComponent(component); } if(r.activityInfo.targetActivity!=null){ component=newComponentName(r.activityInfo.packageName, r.activityInfo.targetActivity); } 然后通过ClassLoader将shy.luo.activity.MainActivity类加载进来: Activityactivity=null; try{ java.lang.ClassLoadercl=r.packageInfo.getClassLoader(); activity=mInstrumentation.newActivity( cl,component.getClassName(),r.intent); r.intent.setExtrasClassLoader(cl); if(r.state!=null){ r.state.setClassLoader(cl); } }catch(Exceptione){ ...... } 接下来是创建Application对象,这是根据AndroidManifest.xml配置文件中的Application标签的信息来创建的: Applicationapp=r.packageInfo.makeApplication(false,mInstrumentation); 后面的代码主要创建Activity的上下文信息,并通过attach方法将这些上下文信息设置到MainActivity中去: activity.attach(appContext,this,getInstrumentation(),r.token, r.ident,app,r.intent,r.activityInfo,title,r.parent, r.embeddedID,r.lastNonConfigurationInstance, r.lastNonConfigurationChildInstances,config); 最后还要调用MainActivity的onCreate函数: mInstrumentation.callActivityOnCreate(activity,r.state); 这里不是直接调用MainActivity的onCreate函数,而是通过mInstrumentation的callActivityOnCreate函数来间接调用,前面我们说过,mInstrumentation在这里的作用是监控Activity与系统的交互操作,相当于是系统运行日志。 本文转自 Luoshengyang 51CTO博客,原文链接:http://blog.51cto.com/shyluo/965992,如需转载请自行联系原作者

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

Android的4种文件类型Java,class,dex,apk

Java 文件-----应用程序源文件 Android本身相当一部分都是用java编写而成(基本上架构图里头蓝色的部份都是用Java开发的),android的 应用必须使用java来开发 Class文件------Java编译后的目标文件 不像J2se,java编译成class就可以直接运行,android平台上class文件不能直接在android上运行。 由于Google 使用了自己的Dalvik来运行应用, 所以这里的class也肯定不能在AndroidDalvik的java环境中运行,android 的class文件实际上只是编译过程中的中间目标文件,需要链接成dex文件后才能在dalvik上运行 Dex文件-----Android平台上的可执行文件 Android虚拟机Dalvik支持的字节码文件格式Google在新发布的Android平台上使用了自己的Dalvik虚拟机 来定义, 这种虚拟机执行的并非Java字节码, 而是另一种字节码:dex格式的字节码。在编译Java代码之后, 通过Android平台上的工具可以将Java字节码转换成Dex字节码。虽然Google称Dalvik是为了移动设备定 做的,但是业界很多人认为这是为了规避向sun申请Javalicense。这个DalvikVM针对手机程式/CPU做过最 佳化,可以同时执行许多VM而不会占用太多Resource。 Apk文件-------Android上的安装文件 Apk是Android安装包的扩展名,一个Android安装包包含了与某个Android应用程序相关的所有文件。apk 文件将AndroidManifest.xml文件、应用程序代码(.dex文件)、资源文件和其他文件打成一个压缩包。一个工 程只能打进一个.apk文件 本文转自 一点点征服 博客园博客,原文链接:http://www.cnblogs.com/ldq2016/p/6228792.html ,如需转载请自行联系原作者

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

ios开发学习--列表(Table)效果源码分享--系列教程4

Keyboard Avoiding 介绍: 让弹出的键盘永远遮挡不住输入框。输入框在弹出输入键盘的时候往上移动,从而不会被弹出的输入键盘遮挡住。也就是说,当弹出的键盘挡住界面某些内容时,页面会整体往上移动,从而显露出被遮挡的内容。http://ios.itmdc.com/thread-3190-1-1.htmlLazy Table Images 介绍: 异步下载和显示在列表中的图像。当列表有很多行的时候,每一行都有一幅图的时候,异步下载和显示这些图像能够让程序流畅运行,用户不需要等待全部图像下载完毕才能进行操作。http://ios.itmdc.com/thread-3191-1-1.htmlAccordion file navigation 介绍: 实现文件树形结构浏览效果。多用于pdf文档阅读器。http://ios.itmdc.com/thread-3192-1-1.htmlRetractable Section Controller 介绍: 利用UITableView来实现下拉列表(可扩展列表)的效果。下拉列表即支持列表每一行的展开与收起功能。点击列表某一行,会下拉显示更多行,再点击一次,即收起下面的所有行。http://ios.itmdc.com/thread-3193-1-1.htmlDrop Down ComboBox 介绍: 利用UITableView来实现下拉菜单(可扩展列表)的效果。点击列表某一行,会下拉显示更多行。http://ios.itmdc.com/thread-3194-1-1.htmlMovable TableView 介绍: 实现单元格可移动的列表。用户可以移动列表中任意单元格,从而改变单元格的顺序。用户移动过程中不需要让列表处于可编辑模式(edit mode)。仅支持IOS5.0。http://ios.itmdc.com/thread-3195-1-1.htmlSliding TableViewCell 介绍: 实现的效果是,用户用手指从左到右划过列表中的任意一行,此行会有“撕开”的效果,显示其他信息,用户手指反方向划过,则复原。http://ios.itmdc.com/thread-3196-1-1.htmlSliding Table 介绍: 用户用手指从左到右划过列表中的任意一行,此行会有“撕开”的效果,显示其他信息,用户手指反方向划过,则复原。http://ios.itmdc.com/thread-3198-1-1.htmlHorizontal TableView 介绍: 实现水平方向的列表效果。即列表是左右滚动,而不是上下滚动。http://ios.itmdc.com/thread-3200-1-1.htmlInput TableViewCell 介绍: 实现几种可以输入内容的table cell,比如输入文字、数字、日期(通过弹出UIPicker来输入)等等。表单还会根据弹出的键盘动态调整位置,从而不会让弹出的键盘遮盖住表单,也就是说,当弹出的键盘挡住界面某些内容时,页面会整体往上移动,从而显露出被遮挡的内容。http://ios.itmdc.com/thread-3203-1-1.htmlQuadrant TableViewCell 介绍: 自定义UITableViewCell。在列表单元里面实现2*2的方格,每个方格有不同的内容。类似于twitter里面的个人数据统计。http://ios.itmdc.com/thread-3205-1-1.htmlPath TableViewController 介绍: 实现Path应用的时间滚动条效果:即在列表中,移动滚动条的同时,旁边出现信息标签,用于显示移动到哪个列表单元。http://ios.itmdc.com/thread-3206-1-1.htmlInAppSettingsKit 介绍: 自定义UITableViewCell。实现各种样式的表格输入界面。在列表单元中加入各式各样的控件,比如Switch,Slider, TextField等等,用于应用内的各种设置效果。也可以自定义segment header。http://ios.itmdc.com/thread-3208-1-1.html 本文转自qianqianlianmeng博客园博客,原文链接:http://www.cnblogs.com/aimeng/archive/2012/12/18/2822813.html ,如需转载请自行联系原作者

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

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

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册