Android开发网上的一些重要知识点_第1页
Android开发网上的一些重要知识点_第2页
Android开发网上的一些重要知识点_第3页
Android开发网上的一些重要知识点_第4页
Android开发网上的一些重要知识点_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Android开发网上的一些重要学问点android单实例运行方法我们都知道Android平台没有任务治理器而内部App维护者一个Activityhistorystack来实现窗口显示和销毁,对于常规从快捷方式运行来看都是 startActivity可能会使用FLAG_ACTIVITY_NEW_TASK标记来翻开一个窗口,比方Launcher,所以考虑单任务的实现方法比较简洁,首先 Android123订正下大家一种错误的方法就是直接在androidmanifest.xml 的 application 节 点 中 加 入android:launchMode=“singleInstance“这句其实这样将不会起到任何作用,Apps内部维护的历史栈作用于Activity,我们必须在activity 节点中加入android:launchMode=“singleInstance“Activity。pxdip设备独立像素pxdipAndroid的设备区分率众多,wvgahvgaqvga,对于兼容性来说使用dippx=(int)(dip*density+0.5f)//这里android开发网提示大家很多网友猎取density(密度)的方法1.0HVGAwvgaWindowsManager中猎取,WVGA为1.5dip,sip的学问AndroidImageView大小layout.xmlImageView以后的大小显示,其实Android平台在设计UI控件时考虑到这个问题,为了适应不同的DrawablexmlImageViewandroid:scaleType=“fitXY“这UIImageView所在的层,可以使用一个内嵌的方法限制显示。Android手机当前是否联网?假设拟开发一个网络应用的程序,首先考虑是否接入网络,在Android手机中推断是否联网可以通过ConnectivityManager类的isAvailable方法推断首先猎取网络通讯类的实 例 ConnectivityManagercwjManager=(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);使用cwjManager.getActiveNetworkInfo.isAvailable;来返回是TrueAndroidWiFiGPRSHSDPAConnectivityManagergetActiveNetworkInfo方法推断<uses-permissionandroid:name=“android.permission.ACCESS_NETWORK_STATE“></uses-permission>这个权限,androidMarketBrowser程序都使用以免铺张手机上的电力资源。Drawable、Bitmap、CanvasPaint的关系Android平台,对于Drawable、Bitmap、CanvasPaint它们之间的概念不是很清楚,其实它们除了DrawableSunJ2ME中就已经消灭了,Android平台中,Bitmap、Canvas相关的都有所变化。首先让我们理解下 Android平台中的显示类是View,但是还供给了底层图形类android.graphics,今日所说的这些均为graphics底层图形接口。Bitmap-称作位图,一般位图的文件格式后缀为 bmp,固然编码器也有很多如RGB565、RGB888。作为一种逐像素的显示对象执行效率高,但是缺点也很明显存储效率低。我们理解为一种存储对象比较好。Drawable-作为Android平下通用的图形对象GIF、PNG、JPGBMP,固然还供给一些高级的可视化对象,比方渐变、图形等。Canvas-Bitmap、GLPathMatrixCanvas类还供给了裁剪、选取等操作。Paint-我们可以把它看做一个画图工具,比方画笔、画刷。他治理了每个画图工具的字体、颜色、样式。假设涉及一些Android玩耍开发、显示特效可以通过这些底层图形类来高效实现自己的应用。ActivityonCreate重复执行ActivityLANDSCAPE切换到PORTRAIT,ActivityonCreateandroidmanifest.xml中的activit元素加入这个属性android:configChanges=“orientation|keyboardHidden“即可,比方<activity android:name=“.android123“android:configChanges=“orientation|keyboardHidden“android:label=“@string/app_name“>同时在Activity的Java文件中重载onConfigurationChanged(ConfigurationnewConfig)这个方法,这样就不会在布局切换或窗口切换时重载onCreate等方法。代码如下:@OverridepublicvoidonConfigurationChanged(ConfigurationnewConfig){super.onConfigurationChanged(newConfig);if (this.getResources.getConfiguration.orientation ==Configuration.ORIENTATION_LANDSCAPE){//land}else if (this.getResources.getConfiguration.orientation ==Configuration.ORIENTATION_PORTRAIT){//port}}AndroidImageButton问题AndroidImageButton有个疑问,当显示Drawable图片时就不会再看到ImageButton的layoutTextView,对齐方式ImageButton支持文字右侧显示。Android代码优化技术1.Java内存掌握对于字符串操作而言假设需要连加这样的操作建议使用StringBuilder,经过调试不难发StringStringBuilder,然后dB开发网JavaGC不需要手动释放那么安排的时候就要格外的留神,频繁的GC操作仍旧是很影响性能的,在调试时我们可以通过logcat查看内存释放状况。2.循环使用寻常在访问一个属性的时候效率远比一个固定变量低,假设你的循环估量次数常常大于5,假设xxx.GetLength方法的值一般大于5,推举这样写,比方for(inti=0;i<xxx.GetLength;i++)这里xxx.GetLength为明显,改进的方法应当为intj=xxx.GetLengthfor(inti=0;i<j;i++)3.图片的优化Android平台中2BitmapFactoryJ2MEMIDPAndroid中虽然机AndroidG1G1手机参数以及评测,但是当资源多时这样的运行效率还是令人满足的,至少Dalvik优化的还不是很够。AndroidNIO非堵塞包(一)AndroidJavaNIO(NewI/O)技术进展处理,NIOJDK1.4开头引入的,NIONNoblocking即非I/OSocketaccpet、read这些方法而言都是堵塞的。O主要使用了l和ra的r类似k的模式,是一种基于大事驱动的,整个处理方法使用了轮训的状态机,假设你过去开发过SymbianNIO的好AndroidSocket连接而言使用NIOUI线程,音乐线程,网络线程,治理的难度可想而知,同时I/O这种低速设备将影响玩耍的体验。NIOI/OBIO(BlockingI/O)来说有了很大的提高,处理并发不用太多的线程,省去了创立销毁的时间,假设线程过多调度是问题CPU一般的解决方案中可能使用线程池来治理调度但这种方法治标不治本。使用NIO可以使并发NIOJDK7AIO还存在一些区分,AIO作为一种更的固然JavaWinsockIOCPI/O完成端口Android123NIO在Android中有哪些用处。NIOJava比方ByteBuffer类,Channel,SocketChannel,ServerSocketChannel,Selector和SelectionKeyAndroid开发网将在明天具体讲解。网友可以在Android SDK 文档中看下java.nio和java.nio.channels“://android123.cn/androidkaifa/695.html“://android123.cn/androidkaifa/695.html了解下这种技术,看看在马上要做的工程中是否用得到AndroidThemeStyles内部定义解析AndroidManifest.xmlActivitytheme方法来实现无标题的方法,在使用xml让你的Activity无标题方法一文中讲到的,很多网友不明白为什么这样做,其实在Android123以前的文章中屡次提到了styles样式定义方法,今日Android开发网再次把一些网友回忆了解下android样式的内部定义。在一个工程的res/values/theme.xml中我们可以便利的定义自己的风格主题,比方下面的cwjTheme中我们使用了基于android内部的白色调的背景Theme.Light,设置windowsNoTitletrueandroidlistViewcwjListView,xml样式代码如下:<?xmlversion=“1.0“encoding=“utf-8“?><resources><stylename=“cwjTheme“parent=“android:Theme.Light“><itemname=“android:windowNoTitle“>true</item><itemname=“android:windowBackground“>@android:color/transparent</item><itemname=“android:listViewStyle“>@style/cwjListView</item></style>有关ListView控件我们自定义的风格就是修改下系统listview这个控件的每行分隔符样res/drawablelist_selector图片,这样cwjListView的代码可以这样写<stylename=“cwjListView“parent=“@android:style/Widget.ListView“><itemname=“android:listSelector“>@drawable/list_selector</item></style></resources>stylecwjListView的字体颜色就参加textAppearance属 性 , 比 如 <itemname=“textAppearance“>@android:style/TextAppearance</item>等等。AndroidJSON解析例如代码GoogleAndroidJSONjsonxmlAndroidorg.json包可以很便利的实现手Android123Android开发者需要有关通讯、正则表达式、JSON解析、appWidget开发的一些学问。publicclassWordWidgetextendsAppWidgetProvider {//appWidget@Overridepublic void onUpdate(Context context, AppWidgetManagerappWidgetManager,int[]appWidgetIds){context.startService(newIntent(context,UpdateService.class));//避开ANRWidget中开了个效劳}publicstaticclassUpdateServiceextendsService{@OverridepublicvoidonStart(Intentintent,intstartId){//BuildthewidgetupdatefortodayRemoteViewsupdateViews=buildUpdate(this);ComponentName thisWidget = new ComponentName(this,WordWidget.class);AppWidgetManager manager =AppWidgetManager.getInstance(this);manager.updateAppWidget(thisWidget,updateViews);}publicRemoteViewsbuildUpdate(Contextcontext){//PickoutmonthnamesfromresourcesResourcesres=context.getResources;String[] monthNames =res.getStringArray(R.array.month_names);Timetoday=newTime;today.setToNow;StringName=res.getString(R.string.template_wotd_title,monthNames[today.month],today.monthDay);RemoteViewsupdateViews=null;StringContent=““;try{SimpleWikiHelper.prepareUserAgent(context);false);

Content=SimpleWikiHelper.getContent(Name,}catch(ApiExceptione){Log.e(“WordWidget“,“Couldn”tcontactAPI“,e);}catch(ParseExceptione){Log.e(“WordWidget“,“Couldn”tparseAPIresponse“,e);}Pattern pattern =Patternpile(SimpleWikiHelper.WORD_OF_DAY_REGEX);//正则表达式处理,SimpleWikiHelper类Matchermatcher=pattern.matcher(Content);if(matcher.find){updateViews=newRemoteViews(context.getPackageName,R.layout.widget_word);StringwordTitle=matcher.group(1);updateViews.setTextViewText(R.id.word_title,wordTitle);updateViews.setTextViewText(R.id.word_type,matcher.group(2));updateViews.setTextViewText(R.id.definition,matcher.group(3).trim);Stringdefine=res.getString(R.string.template_define_url,Uri.encode(wordTitle));IntentdefineIntent=newIntent(Intent.ACTION_VIEW,Uri.parse(define));//Uriurl,action是viewweb扫瞄器PendingIntent pendingIntent =PendingIntent.getActivity(context,0/*norequestCode*/,defineIntent,0/*noflags*/);updateViews.setOnClickPendingIntent(R.id.widget,pendingIntent);//WidgetActivity}else{updateViews=newRemoteViews(context.getPackageName,R.layout.widget_message);CharSequence errorMessage =context.getText(R.string.widget_error);updateViews.setTextViewText(R.id.message,errorMessage);}returnupdateViews;}@OverridepublicIBinderonBind(Intentintent){//Wedon”tneedtobindtothisservicereturnnull;}}}有关网络通讯的实体类,以及一些常量定义如下:publicclassSimpleWikiHelper{privatestaticfinalStringTAG=“SimpleWikiHelper“;publicstaticfinalStringWORD_OF_DAY_REGEX=“(?s)\\{\\{wotd\\|(.+?)\\|(.+?)\\|([^#\\|]+).*?\\}\\}“;privatestaticfinalStringWIKTIONARY_=““:///w/api.php?action=query&prop=revisions&titles=%25s“:///w/api.php?action=query&prop=revisions&titles=%s&“+“rvprop=content&format=json%s“;privatestaticfinalStringWIKTIONARY_EXPAND_TEMPLATES=“&rvexpandtemplates=true“;privatestaticfinalint_STATUS_OK=200;privatestaticbyte[]sBuffer=newbyte[512];privatestaticStringsUserAgent=null;publicstaticclassApiExceptionextendsException{publicApiException(StringdetailMessage,Throwablethrowable){super(detailMessage,throwable);}publicApiException(StringdetailMessage){super(detailMessage);}}publicstaticclassParseExceptionextendsException{publicParseException(StringdetailMessage,Throwablethrowable){super(detailMessage,throwable);}}publicstaticvoidprepareUserAgent(Contextcontext){try{//ReadpackagenameandversionnumberfrommanifestPackageManagermanager=context.getPackageManager;PackageInfo info =manager.getPackageInfo(context.getPackageName,0);sUserAgent =String.format(context.getString(R.string.template_user_agent),info.packageName,info.versionName);}catch(NameNotFoundExceptione){e);}

Log.e(TAG,“Couldn”tfindpackageinformationinPackageManager“,}publicstaticStringgetContent(Stringtitle,booleanexpandTemplates)throwsApiException,ParseException{StringencodedTitle=Uri.encode(title);String expandClause = expandTemplates ?WIKTIONARY_EXPAND_TEMPLATES:““;String content = getUrlContent(String.format(WIKTIONARY_,encodedTitle,expandClause));try{JSONObjectresponse=newJSONObject(content);JSONObjectquery=response.getJSONObject(“query“);JSONObjects=query.getJSONObject(“s“);JSONObject = s.getJSONObject((String)s.keys.next);JSONArrayrevisions=.getJSONArray(“revisions“);JSONObjectrevision=revisions.getJSONObject(0);returnrevision.getString(“*“);}catch(JSONExceptione){thrownewParseException(“ProblemparsingAPIresponse“,e);}}protectedstaticsynchronizedStringgetUrlContent(Stringurl)throwsApiException{if(sUserAgent==null){thrownewApiException(“User-Agentstringmustbeprepared“);}Clientclient=newDefaultClient;Getrequest=newGet(url);request.setHeader(“User-Agent“,sUserAgent);//设置客户端标识try{Responseresponse=client.execute(request);StatusLinestatus=response.getStatusLine;if(status.getStatusCode!=_STATUS_OK){thrownewApiException(“Invalidresponsefromserver:“+status.toString);数据流

}Entityentity=response.getEntity;InputStreaminputStream=entity.getContent;//

返回的ByteArrayOutputStreamcontent=newByteArrayOutputStream;intreadBytes=0;while((readBytes=inputStream.read(sBuffer))!=-1){content.write(sBuffer,0,readBytes);//转化为字节数组流}returnnewString(content.toByteArray);//String}catch(IOExceptione){thrownewApiException(“ProblemcommunicatingwithAPI“,e);}}}widgetAndroid平台JSONServerJava的。12.AndroidTimerTask类介绍在Android平台中需要反复按周期执行方法可以使用Java上自带的TimerTask类,TimerTask相对于Thread来说对于资源消耗的更低,除了使用Android自带的AlarmManager使用Timer定时器是一种更好的解决方法。我们需要引入importjava.util.Timer;和importjava.util.TimerTask;privateTimermTimer=newTimer(true);privateTimerTaskmTimerTask;mTimerTask=newTimerTask{publicvoidrun{Log.v(“android123“,“cwj“);}};mTimer.schedule(mTimerTask,5000,1000); //在1秒后每5秒执行一次定时log.v打印输出。假设想取消可以调用下面方法,取消定时器的执行while(!mTimerTask.cancel);mTimer.cancel;最终Android123提示大家,假设处理的东西比较耗时还是开个线程比较好,Timer还HandlerpostDelay等方法更适合处理打算任务。13.AndroidIcon大小在不同区分率下定义AndroidIconI即Ai的应用ni即为48x48HTCMotorolaQVGAldpi,图标为32x32,Android图标大小设计标准如下表所示:Launcher36x36px48x48px72x72pxMenu36x36px48x48px72x72pxStatusBar24x24px3232x32px48x48pxTab24x24px32x32px48x48pxDialog24x24px32x32px48x48pxListView24x24px32x32px48x48pxandroid界面设计的安全色,如下表而对于系统自带默认程序的图标,下面为png的透亮格式,直接鼠标右键另存为即可sdk文档上的关于界面图标的具体说明。14.AndroidShape你会用吗?假设你对Android系统自带的UI控件感觉不够满足,可以尝试下自定义控件,我们就以ButtonAndroid123AndroidButton按钮控件美化方法里面提xmlselectordrawableAndroid开发网shapeButtonAndroidshape、gradient、stroke、corners等。Buttonselector为例说下:<shape><gradientandroid:startColor=“#ff8c00“android:endColor=“#FFFFFF“android:angle=“270“/><strokeandroid:width=“2dp“android:color=“#dcdcdc“/><cornersandroid:radius=“2dp“/><paddingandroid:left=“10dp“android:top=“10dp“android:right=“10dp“android:bottom=“10dp“/></shape>shapegradientstartColor属性为开头的颜色,endColor为渐变完毕的颜色,下面的anglestroke可以理解为边缘,cornersradius属性为半径,最终是相对位置属性padding。Button完整的定义可以为<?xmlversion=“1.0“encoding=“utf-8“?><selectorxmlns:android=““://schemas.android/apk/res/android“://schemas.android/apk/res/android“><itemandroid:state_pressed=“true“><shape><gradientandroid:startColor=“#ff8c00“android:endColor=“#FFFFFF“android:angle=“270“/><strokeandroid:width=“2dp“android:color=“#dcdcdc“/><cornersandroid:radius=“2dp“/><paddingandroid:left=“10dp“android:top=“10dp“android:right=“10dp“android:bottom=“10dp“/></shape></item><itemandroid:state_focused=“true“><shape><gradientandroid:startColor=“#ffc2b7“android:endColor=“#ffc2b7“android:angle=“270“/><strokeandroid:width=“2dp“android:color=“#dcdcdc“/><cornersandroid:radius=“2dp“/><paddingandroid:left=“10dp“android:top=“10dp“android:right=“10dp“android:bottom=“10dp“/></shape></item><item><shape><gradientandroid:startColor=“#ff9d77“android:endColor=“#ff9d77“android:angle=“270“/><strokeandroid:width=“2dp“android:color=“#fad3cf“/><cornersandroid:radius=“2dp“/><paddingandroid:left=“10dp“android:top=“10dp“android:right=“10dp“android:bottom=“10dp“/></shape></item></selector>Android123itemstate_pressed按下或state_focusedstate_xxx属性的item可以看作是常规状态下。Android开发者应当保持以下特质Android123推举手应当遵循SDK文档SDKAPIDemoSamplesGIT开源代码Android开源工程,学习别人的手法写程序。Android数组排序常见方法Android的数组排序方式根本上使用了 Sun原生的JavaAPI实现,常用的有Comparator接口实现compare方法和Comparable接口的compareTo方法,我们对于一个数组列表比方ArrayList可以通过这两个接口进展排序和比较,这里Android123给大家一个例子privatefinalComparatorcwjComparator=newComparator{privatefinalCollator collator=Collator.getInstance;publicfinalintcompare(Objecta,Objectb){CharSequence a=((Item)a).sName;CharSequence b=((Item)b).sID;returncollatorpare(a,b);}};ArrayListmList,则执行排序可以调用方法Collections.sort(mList,cwjComparator);AndroidTextProgressBar进度条上显文字Android系统的进度条控件默认的设计的不是很周全,比方没有包含文字的显示,那么如Android进度条控件上显示文字呢?Google内部的代码来了解下,主要使用的addViewChronometer秒表控件来实现,整个代码如下public class TextProgressBar extends RelativeLayoutOnChronometerTickListener{publicstaticfinalStringTAG=“TextProgressBar“;staticfinalintCHRONOMETER_ID=android.R.id.text1;staticfinalintPROGRESSBAR_ID=android.R.gress;ChronometermChronometer=null;ProgressBarmProgressBar=null;longmDurationBase=-1;intmDuration=-1;booleanmChronometerFollow=false;intmChronometerGravity=Gravity.NO_GRAVITY;

implementspublicTextProgressBar(Contextcontext,AttributeSetattrs,intdefStyle){super(context,attrs,defStyle);}publicTextProgressBar(Contextcontext,AttributeSetattrs){super(context,attrs);}publicTextProgressBar(Contextcontext){super(context);}//Android开发网提示关键局部在这里@OverridepublicvoidaddView(Viewchild,intindex,ViewGroup.LayoutParamsparams){super.addView(child,index,params);intchildId=child.getId;if(childId==CHRONOMETER_ID&&childinstanceofChronometer){mChronometer=(Chronometer)child;mChronometer.setOnChronometerTickListener(this);//CheckifChronometershouldmovewithwithProgressBarmChronometerFollow = (params.width ==ViewGroup.LayoutParams.WRAP_CONTENT);mChronometerGravity = (mChronometer.getGravity &Gravity.HORIZONTAL_GRAVITY_MASK);}elseif(childId==PROGRESSBAR_ID&&childinstanceofProgressBar){mProgressBar=(ProgressBar)child;}}@android.view.RemotableViewMethodpublicvoidsetDurationBase(longdurationBase){mDurationBase=durationBase;if(mProgressBar==null||mChronometer==null){thrownewRuntimeException(“ExpectingchildProgressBarwithid“+“”android.R.gress” and Chronometer id”android.R.id.text1”“);}//UpdatetheProgressBarmaximumrelativetoChronometerbasemDuration=(int)(durationBase-mChronometer.getBase);if(mDuration<=0){mDuration=1;}mProgressBar.setMax(mDuration);}publicvoidonChronometerTick(Chronometerchronometer){if(mProgressBar==null){thrownewRuntimeException(“ExpectingchildProgressBarwithid”android.R.gress”“);}//StopChronometerifwe”repastdurationlongnow=SystemClock.elapsedRealtime;if(now>=mDurationBase){mChronometer.stop;}intremaining=(int)(mDurationBase-now);mProgressBar.setProgress(mDuration-remaining);if(mChronometerFollow){RelativeLayout.LayoutParamsparams;params = (RelativeLayout.LayoutParams)mProgressBar.getLayoutParams;intcontentWidth=mProgressBar.getWidth-(params.leftMargin+params.rightMargin);intleadingEdge=((contentWidth*mProgressBar.getProgress)/mProgressBar.getMax)+params.leftMargin;intadjustLeft=0;inttextWidth=mChronometer.getWidth;if(mChronometerGravity==Gravity.RIGHT){adjustLeft=-textWidth;}elseif(mChronometerGravity==Gravity.CENTER_HORIZONTAL){adjustLeft=-(textWidth/2);}leadingEdge+=adjustLeft;intrightLimit=contentWidth-params.rightMargin-textWidth;if(leadingEdge<params.leftMargin){leadingEdge=params.leftMargin;}elseif(leadingEdge>rightLimit){leadingEdge=rightLimit;}params = (RelativeLayout.LayoutParams)mChronometer.getLayoutParams;params.leftMargin=leadingEdge;mChronometer.requestLayout;}}}Android内存治理-SoftReference的使用Android平台上的内存治理问题,DalvikVM给每个进程都安排了肯定量的可用堆内存,当我们处理一些消耗资源的操作时可能会产生OOM错误(OutOfMemoryError)这样的特别,Android123观看了下国内的类似Market客户端设计,根本上都没有承受很好的内存治理机制和缓存处理。假设细心的网友可能觉察AndroidMarket客户端载入时,每个列表项的图标是异步刷显示的,但当我们快速的往下滚动到肯定数量比方50个,再往回滚动时可能我们看到了局部AppSQLite数据库中缓存的,但是SoftReference的方式治理内存。在Java中内存治理,引用分为四大类,强引用HardReference、弱引用WeakReferenceSoftReferencePhantomReference很明显,HardReferenceOOM也不会导致这一引用的对象被回收,而WeakReference等更适合于一些数量不多,但体积略微浩大的对象,在这AndroidMarket中每个应AppIconSoftReference来解决内存不至于快速回收,同时当内存JavaVMOOM前时,软引用将会强制回收内存,最终的虚引用一般没GC的活动状态,对于测试比较有用同时必需和ReferenceQueue一起使用。对于一组数据,我们可以通过HashMapSoftReference对象降临时系统或数据库来存储缓存,期望给国内做AppStore这样的客户端一些改进建议。Android开发中的利弊Android2.2API参加导致很多工程移植需要考虑使用Java的反射ReflectionJDK中声明好的方法直接调用,JVMJava1.5开头支持,原理上就是依据类名而不实例化对象的状况下,获得对象的方法或属性而直接调用。Android开发时反射能帮助我们多少?AndroidSDKinternal或I开头的AIDL接口均可以通过反射轻松调用。反射对于Android123来说更重要的是考虑到应用的兼容性,我们目前主要兼容从Android1.5到2.2的工程,APILevel从3到8可以便利的扩大,调用前我们预留一个标志APIAPILevel为多少可以调用。对于调试Java的反射是功臣了,在Logcat中我们可以看到出错的地方确定有类似java.lang.reflect.XXXAndroid应用程序。反射的缺点有哪些?由于是动态执行的,效率自然没有预编译时引用现有的库效率高,就像寻常我们Win32hGetProcAddress一样去动态猎取方法的地址。固然效率要依据简单程度而打算,一般略微简单的处理性能损失可能超过20%,对于一些简单的涉及Java自动类型转换推断,执行时间可能是直接引用的上千倍,所以最终我们调试时必需考虑性能问题。由于反射是动态的,所以需要处理很多特别,不然DalvikForceClose的概3try-catch效率就不是很高,Android开发我们必需考虑这些问题。反射由于导致代码臃肿,自然略微简单的几个方法有用反射将会导致代码可读性和维Android开发网猛烈不推举这种方法。ReflectionJava的专利,微软的.Net也同样支持,同时更多的动Ruby等均支持这一特性。AsyncTaskThreadHandler很多网友可能觉察Android平台很多应用使用的都是AsyncTask,而并非Thread和HandlerUIAndroid123给大家说下他们到底有什么区分,我们寻常应当使Android1.5AsyncTaskandroid.os包中,过去在很早1.1和1.0SDKUserTaskJDK1.5开头增的concurrentJ2EEJavaThread更敏捷和强大,但对于轻量级的使用更为占用系统资源。ThreadJava早期为实现多线concurrent中很多特性在同步和线程池类中需要自己去实现很多的东西,对于分布式应用来说更需要自己写调度代码,而为了AndroidUI的刷GoogleHandler和Looper机制,它们均基于消息实现,有事可能消息队列堵塞或其他缘由无法准确的使用。AndroidAsyncTaskThread+Handler的方式,不仅调用上更为简洁,经过实测更牢靠一些,Google在Browser中大量使用了异步任务作为处理耗时的I/O操作,比方下载文件、读写数据库等等,它们在本质上都离不开消息,但是AsyncTaskThreadHandlerAsyncTask缺点也是有的比方一旦线程开启即dobackground方法执行后无法给线程发送消息,仅能通过预先设ThreadHandlerLooper可能更敏捷。AndroidDrawable叠加处理方法BitmapAndroidCanvas一层一层的画就行了,而Drawable中如何处理呢?除了使用BitmapDrawable的getBitmap方法将DrawableBitmapAndroid123LayerDrawable类,LayerDrawable顾名思义就是层图形对象。下面直接用一个简洁的代码表示:Bitmap bm =BitmapFactory.decodeResource(getResources,R.drawable.cwj);Drawable[]array=newDrawable[3];array[0]=newPaintDrawable(Color.BLACK);//黑色array[1]=newPaintDrawable(Color.WHITE);//白色array[2]=newBitmapDrawable(bm);//位图资源LayerDrawableld=newLayerDrawable(array);//Drawable数组ld.setLayerInset(1,1,1,1,1);//第一个参数1代表数组的其次个元素,为白色ld.setLayerInset(2,2,2,2,2);//第一个参数2代表数组的第三个元素,为位图资源mImageView.setImageDrawable(ld);LayerDrawable是关键,AndroidsetLayerInset方法原型publicvoidsetLayerInset(intindex,intl,intt,intrintb)其中第一个参数为层的索引号,后面的四个参数分别为left、top、rightbottom。对于简洁的图片合成我们可以将第一和其次层的PaintDrawable换成BitmapDrawable即可实现简洁的图片合成。onRetainNonConfigurationInstancegetLastNonConfigurationInstance很多网友可能知道Android横竖屏切换时会触发onSaveInstanceState,而复原时会产生onRestoreInstanceState,但是Android的Activity类还有一个方法名为onRetainNonConfigurationInstance和getLastNonConfigurationInstance这两个方法。我们可以通过 onRetainNonConfigurationInstance 代替onSaveInstanceState,比方距离2@OverridepublicObjectonRetainNonConfigurationInstance{//bundleObject来代替returnobj;}onRestoreInstanceStategetLastNonConfigurationInstance方法。我们可以直接在onCreate中使用,比方Objectobj=getLastNonConfigurationInstance; 最终obj的内容就是上次切换时的内容。Android123ActivityonCreate方法都会被触发。AndroidStringformat方法GoogleAndroidMVC架构方式,可以让写公共Android的资源文件values/strings.xml中如何实现格式化字符串呢?这里Android123举个简洁的例子,以及最终可能会用到哪些地方。<?xmlversion=“1.0“encoding=“utf-8“?><resources><stringname=“app_name“>cwj_Demo</string><stringname=“hello“>android开发网</string></resources>们设计一个类似DeletexxxFileJava中动态猎取xxx的名String去拼接或StringBufferappend这样的愚蠢方法,看例子<stringname=“alert“>Delete%1$sFile</string>这里%1$s代表这是一个字符串型的,假设是整数型可以写为%1$d,类似printf这样的格式化字符串函数,固然假设包含了多个需要格式化的内容%2$s或%2$dJava中如何调用呢?看下面的例子:例一:整数型的<stringname=“alert“>Iam%1$dyearsold</string> 定义的是这样的secretstring%1$d不是%1$s,所以默认标准的合并成为intnAge=23;StringsAgeFormat=getResources.getString(R.string.alert);StringsFinalAge=String.format(sAgeFormat,nAge);这样执行完后,就组成了Iam23yearsold,是不是很便利啊.固然了,下面看下String字符串时的状况.例二:字符串型的StringsName=“cwj“StringsCity=“Shanghai“资源定义为 <string name=“alert2“>Myname is %1$s , I amform%2$s</string>Java中只需要StringsInfoFormat=getResources.getString(R.string.alert2);StringsFinalInfo=String.format(sInfoFormat,sName,sCity);MFCCString::FormatMacOSNSLog,但是需要显示类似C#中那样显示的标出参数的数字,比方%1或%n,这里数字代表参数的第nsFinalInfo显示的内容为Mynameiscwj,IamformShanghai。固然了你有什么不懂的地方可以来函至“mailto:android123@163“android123@163Android工程内嵌资源文件的两种方法Androidsdcardsdcardapk中内嵌资源或二进制文件时一般使用下面的两种方法:方法一res/raw名目下存放,比方cwj.dat一个二进制文件,我们可以读取可以直接InputStreamis=context.getResources.openRawResource(R.raw.cwj);方法二assetsassets/cwj.dat这样我们使用下面的代码AssetManageram=context.getAssets;InputStreamis=am.open(cwj.dat);这里Android123提示大家Google的Android系统处理Assert有个bug,在AssertManager中不能处理单个超过1MB的文件,不然会报特别具体数值大家可以测试raw没这个限制可以放个4MBMp3文件没问题。AndroidViewlayout属性全攻略AndroidViewView的属性添加,以AndroidLayoutAndroid123一起再带大家温习一下CwjViewmyView=newCwjView(context);如果用于游戏或整个窗体的界面,我们可能直接在onCreate 中setContentView(myView);固然假设是控件我们可能会需要从Layout的xml中声明,比方<cn.android123.CwjViewandroid:layout_width=“wrap_content“android:layout_height=“wrap_content“/>固然,我们也可以直接从父类声明比方<Viewclass=“cn.android123.CwjView“android:layout_width=“wrap_content“android:layout_height=“wrap_content“/>上面我们仅用了父类Viewandroidlayout_widthlayout_height,我们自定义的控件可能有更多的功能,比方<cn.android123.CwjViewandroid:layout_width=“wrap_content“android:layout_height=“wrap_content“cwj:age=“22“cwj:university=“sjtu“cwj:city=“shanghai“/>我们可以看到上面的三个属性,是我们自定义的。作为标准xml标准,可能还包含了类似xmlns:android“://schemas.android/apk/res/android“=“://schemas.android/apk/res/“://schemas.android/apk/res/android“android“这样的语句,Viewcwjxmlns:cwj“://schemas.android/apk/res/cn.android123.cwjV“=://schemas.android/apk/res/“://schemas.android/apk/res/cn.android123.cwjV“cn.android123.cwjView或xmlns:cwj“://schemas.android/apk/res/android“=://schemas.android/apk/res/“://schemas.android/apk/res/android“android都可以。cwjageuniversitycity的三个属性我们如何定义呢?在res/valuescwj_attr.xmlutf-8是一个好习惯,内容如下<?xmlversion=“1.0“encoding=“utf-8“?><resources><declare-styleablename=“CwjView“><attrname=“age“format=“integer“/><attrname=“city“format=“string“/><attrname=“university“format=“string“/></declare-styleable></resources>formatAndroidinteger比方ProgressBar的进度值,float比方RatingBar的值可能是3.5颗星,boolean比方ToggleButton的是否勾选,stringTextViewtext属性,固然除了我们常见的根底d的属性还有特别的比方rdimension的尺寸类型,比方23dip,15px,18sp的长度单位,还有reference,一般用于引用@+id/cwj@drawable/xxx这样的类型。reference呢?我们就以定义一个颜色为例子,<attrname=“red“format=“color|reference“/>这里我们用了规律或的运算符,定义的红色是颜色类型的,同时可以被引用固然,对于我们自定义的类中,我们需要使用一个名为obtainStyledAttributes的方法来猎取我们的定义。在我们自定义View的构造方法(Contextcontext,AttributeSetattrs)的重载类型中可以用publicCwjView(Contextcontext,AttributeSetattrs){super(context,attrs);TypedArraya=context.obtainStyledAttributes(attrs,R.styleable.cwj_attr);mAge=a.getInteger(R.styleable.CwjView_age,22);mCity=a.getString(R.styleable.CwjView_city,“shanghai“);mUniversity=a.getString(R.styleable.CwjView_university,“sjtu“);a.recycle;//Android123提示大家不要忘了回收资源}这样类的全局成员变量mAge、mCitylayout中的CwjViewAttributeSet类getAttributeResourceValue方法猎取。publicCwjView(Contextcontext,AttributeSetattrs){super(context,attrs);resId = attrs.getAttributeResourceValue(“cn.android123.CwjView“,“age“,100);resId = attrs.getAttributeResourceValue(“cn.android123.CwjView“,“city“,“shanghai“);//resID就可以任意使用了}以上两种方法中,参数的最终一个数值为默认的,假设您有不明白的地方可以来函到“mailto:android123@163“android123@163我们会在第一时间回复。Androidtheme.xml方法在Android中可以通过自定义主题风格方式来实现共性化以及复用,首先我们创立theme.xmlres/values/theme.xml,这里我们可以可以为主题起一个名称,比方 CWJ,这里去除了xml的文件头<?xmlversion=“1.0“encoding=“utf-8“?>这行我们在工程中只需在androidmanifest.xml文件的Activityandroid:theme=“@style/Theme.CWJ“Activity就使用了这xml的关键代码如下:<resources><stylename=“Theme.CWJ“parent=“android:Theme“><itemname=“android:windowBackground“>@drawable/android123</item></style></resources>其中上面的代码中,我们定义设置全局 android:windowBackground即背景值为/res/drawableandroid123viewlayoutxml属性设置,比方我们设置全部字体颜色、大体大小和样式,可以在style节点中参加<itemname=“android:textColor“>#fff</item><itemname=“android:textSize“>14sp</item><itemname=“android:textStyle“>bold</item>固然我们可以将上面的android123的图片改进下,使用一个xml文件替代,比方使用bitmap对象,则/res/drawable/android123.xml的完整代码变为<?xmlversion=“1.0“encoding=“utf-8“?><bitmapxmlns:android=““://schemas.android/apk/res/android“://schemas.android/apk/res/android“android:src=“@drawable/cwj_image“android:tileMode=“repeat“/>bitmapcwj_imageandroid:tileModebitmaptileMode设置为repeatbitmap的为5层效果,而图片仅是一层大小,对于资源利用相对更高。bitmaptileModerepeatclamp、mirror,这SDKAndroid开发网的AndroidViewlayout属性全攻略一文,我们可以联想到bitmap属于android.graphics.Bitmapandroidgitbaseandroid123已经在Android自定义View以及layout属性全攻略说的很清楚,所以我们定位到res\values中找到attr.xml有关bitmap的定义即可,有关bitmap的更多属性如antialias、filterdither都可以找到使用。androidmonkey压力测试实战Android开发者可能由于没有充分测试自己的软件造成很简洁消灭FC(ForceClose)Android固件中自带的monkey工具来做软件的压力测试,monkey工具可以模拟各种按键,触屏,轨迹球、activityAndroid123提示大家说白了monkey就是一个小猴子随机狂玩你的androidAndroidSDKadb调试桥链接设备或模拟器LinuxShelladbshellshelladb命令执adbshellmonkeymonkey工具中的参数说明,如图:apkandroid设备中已经安装,固然模拟器中也可以测试的。执adbshellmonkey-pcn.android123.cwj-v100我们执行这句的中包含了ppackageNamevmonkey生成的具体随机大事名,最终的数字100为我们测试的随机大事数量为100.有关更多的测试方法,请查看上图中的参数,整个测试比较简洁单很有效,不妨试试。ViewAndroidViewView中需要处理以下几种问题:1.掌握大事2.View3.View对于掌握大事今日我们只处理按键大事onKeyDown,以后的文章中将会讲到屏幕触onTouchEventSensor重力感应等方法。viewinvalidate(intl,intt,intr,intb)刷局部,四个参数分别为左、上、右、下。整个view刷invalidate,刷一个矩形区域invalidate(Rectdirty

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论