您好,欢迎访问三七文档
当前位置:首页 > 办公文档 > 会议纪要 > 从Notepad看Android程式细节
从notepad看Android程式细节-----李贞贞主要内容1.与UI相关的操作与UI相关的操作也就是展现给用户的界面之间的关系。通常而言,在Android系统中,一个activity来实现一个用户界面。2.与UI无关的操作与UI无关的操作就是数据库操作的逻辑。在Android系统中数据库相关内容使用contentprovider来实现数据共享。与UI相关的操作1.activity和task2.activity的生命周期3.进程和生命周期4.自定义控件activity和task一个应用程序,会产生一系列的界面,也就会有一系列的activity。可能有的activity并不属于我们点击进入的这个应用程序,而属于其它应用。比如短信发送。可能在一系列操作以后,需要发送一条短消息出去,我们并不需要自己创建这个activity,只需要将请求信息放在一个intent对象中,并把它传递给startActivity(),这样就可以使用了。对于开发者而言,我们是很清楚一个activity是不是属于自己的应用的,但是对于用户而言,就没有这样的认知了。他会认为点开的每一个界面都属于这个应用。为了满足用户的这一认知,一个应用程序的所有activity,使用task来进行管理。activity和taskActivity3Activity1Activity2TaskActivity4activity和task整个栈中的所有activity作为一个整体单元,进行移动。一个task,可以被转到前台,也可以被发送到后台。比如说,有一个应用程序的,已经有3个activity在它的栈中,这个时候点击拨号键(实际上是一个新的task),当前的task(task1)被转到了后台,新的task(task2)的根activity被显示。一段时间之后,按下back键时,task2中只有一个activity,并且要被销毁,这个task也就销毁了。之前被转到后台的task1,又被调回前台,并且显示栈顶的activity。Activity的生命周期1.活动状态:activity处于屏幕的最前端,是活动的,或者说正在运行。2.暂停状态:用户可以看到,但是失去了焦点,不能进行操作。此时的activity依然是维持着所有的状态和成员信息,在屏幕上还是可以看到它的界面。当系统资源极度缺乏的时候,这个activity有可能会被kill掉。3.停止状态:用户完全看不到,屏幕上已经没有它的窗体。这个时候,activity也会维持所有的状态和成员信息,只不过,系统其它地方需要更多内存资源的时候,会被kill掉。4.销毁状态:按back键,可以正常的进行销毁。在程序中调用finish(),也可以将activity销毁。在暂停或者停止状态,系统需要资源的时候,直接kill掉activity所在进程,这个activity也就被销毁了。activity生命周期的七个方法onCreate:activity第一次被创建时调用,当然,如果一个activity之前已经被销毁,重新创建时也是需要调用的。在这个方法里,进行界面的布局,以及其它一些初始化的工作。onStart:用户可见,但是没有获得焦点,不可操作。onResume:变用户可见,并且获得焦点,此时创建的activity就处在栈的顶端。onPause:用户可见但失去焦点,系统会停止动画等消耗CPU的事情。应该在这里保存当前activity正在操作的一些数据,而且此时程序的优先级降低,有可能会因为系统资源匮乏而被kill掉,所以应该将正在操作的数据保存起来,防止丢失。应该注意的是,在这里做的工作时间一定要短,因为下一个activity不会等这个方法完成此开始。这个是官方文档的规定,应该是一个固定的做法,并不是个人行为能影响的。onstop:变得不可见,可能是被下一个新的activity覆盖,可能是现有的一个activity被调用前台运行,也可能是这个activity正要被销毁。onDestroy:这是activity被干掉前最后一个被调用方法,释放所有剩余资源。onRestart:activity被stop后,需要再次start之前,调用。firstactivity是NotesList,secondactivity是TitleEditor启动firstactivity,建立一个新的task://notepadactivity启动NotesList:onCreateNotesList:onStartNotesList:onResume此时,第一个activity就处于屏幕的最前端,也是新建的task的root。点击edittitle,创建第二个activity,这个activity并没有完全遮挡第一个activity,所以第一个activity是处于暂停状态(蓝色字体):NotesList:onPauseTitleEditor:onCreateTitleEditor:onStartTitleEditor:onResume第二个acitivity在调用了OnResume后,就被压入了栈顶,所以显示给用户并且可以与用户进行交互的是第二个activity。第二个activity处于屏幕最前端,如果点击通话按钮,会跳转到一个新的activity(建立一个新的task,这个activity是栈底的activity),这个時候,notepad所建立的task就会被转到后台,第一个activity和第二个activity也都被遮盖住,它们都进入停止状态:TitleEditor:onPauseNotesList:onStopTitleEditor:onStop从log中可以看到,第二个activity和第一个activity都进入了停止状态。如果这时候其它地方需要资源,这两个activity可能会被kill掉。第二个activity(TitleEditor)的内容在onPause中保存:protectedvoidonPause(){super.onPause();if(mCursor!=null){//WritethetitlebacktothenoteContentValuesvalues=newContentValues();values.put(Notes.TITLE,mText.getText().toString());getContentResolver().update(mUri,values,null,null);}}退出通话界面,通话activity被销毁,notepadtask又由后台转到了前台,显示栈顶的activity,也就是如图的界面:NotesList:onRestartNotesList:onStartTitleEditor:onRestartTitleEditor:onStartTitleEditor:onResume//退出edittitle界面TitleEditor:onPauseNotesList:onResumeTitleEditor:onStopTitleEditor:onDestroy进程和生命周期在activity暂停和停止的时候,如果系统需要更多资源,有可能会kill掉这个activity所在的进程。哪些进程会被优先kill掉,Android系统肯定有一系列复杂的算法来实现。我们要关心的就是那些不想被kill掉的activity要怎样做,被kill之后是否还能恢复?那些可以被kill掉的程序,应该做些什么?带着这些问题,我们看一下activity所处的进程,这些进程的优先级情况如下:进程和生命周期1.前台activity是处于屏幕最前端,用户可见的activity,它是最重要的。这个activity所处的进程几乎不可能被kill掉,除非处在一种比较极度的状态下。2.可见activity是用户可见但是失去焦点的activity。其实它也很重要,除非是为了保持前台activity所在进程正常的运行,才会去kill可见activity所在的进程。3.后台activity是用户不可见。为了回收资源给前台进程或者说是可见进程,这个activity所在的进程就会比较轻易的被kill掉。4.空进程是没有任何activity或者其它组件的进程。Android会在某个极易被系统干掉的Activity前调用onSaveInstanceState(),这个方法会在onPause()前调用。这个方法接受一个Bundle对象的参数,能以name-value键值对的形式记录住这个Activity的状态并存放进Bundle对象里面。当这个Activity再次启动时,Bundle对象会传递给Oncreate()和onRestoreInstanceState()(它是在onstart()之后执行的),这两个方法都可以获取到先前捕捉的状态,以便重新创建Activity。需要注意的是,onSaveInstanceState方法的调用是因为activity变得容易被系统kill掉(比如被其它activity遮盖,处于停止状态),当用户主动去销毁这个activity的时候(按Back键),是不会调用的。自定义控件notepad应用里还用到了一个自定义控件:EditText,主要是为了在文本之间画一条分割线。如图所示。主要工作就是重载onDraw方法,利用从TextView继承下来的getLineCount函数获取文本所占的行数,以及getLineBounds来获取特定行的基准高度值,而且这个函数第二个参数会返回此行的“外包装”值。再利用这些值绘制这一行的线条。publicstaticclassLinedEditTextextendsEditText{privateRectmRect;privatePaintmPaint;//weneedthisconstructorforLayoutInflaterpublicLinedEditText(Contextcontext,AttributeSetattrs){super(context,attrs);mRect=newRect();mPaint=newPaint();mPaint.setStyle(Paint.Style.STROKE);mPaint.setColor(0x800000FF);}@OverrideprotectedvoidonDraw(Canvascanvas){intcount=getLineCount();//获得文本所占的行数Rectr=mRect;Paintpaint=mPaint;for(inti=0;icount;i++){intbaseline=getLineBounds(i,r);//获得基准高度canvas.drawLine(r.left,baseline+1,r.right,baseline+1,paint);//绘制直线}super.onDraw(canvas);}}为了让界面的View使用自定义的EditText类,必须在配置文件中进行设置。viewxmlns:android==com.example.android.notepad.NoteEditor$LinedEditTextandroid:id=@+id/noteandroid:layout_width=match_parentandroid:layout_height=match_parentandroid:background=@android:color/transparentandroid:padding=5dipandroid:scrollbars=verticalandroid:fadingEdge=verticalandroid:gravity=topandroid:textSize=22spandroid:capitalize=sentences/这里class=com.example.an
本文标题:从Notepad看Android程式细节
链接地址:https://www.777doc.com/doc-3085981 .html