汕头网站网站建设,西安网约车租车公司哪家好,网站空间转移,四川高速公路建设集团网站第一章#xff1a;Activity的生命周期和启动模式 生命周期onPause表示activity正在停止#xff0c;onPaus必须先执行完#xff08;栈顶的activity#xff09;#xff0c;新的activity的onResume才会执行。onStop表示activity即将停止#xff08;透明不会执行#xff09;…第一章Activity的生命周期和启动模式 生命周期 onPause表示activity正在停止onPaus必须先执行完栈顶的activity新的activity的onResume才会执行。onStop表示activity即将停止透明不会执行可以做些稍微重量级的回收工作。onPause和 onStop不能处理太耗时的操作因为onPause必须执行完成以后新的activity才能resumeonstart和onstop是从activity是否可见这个角度来回调的而onresume和onpause是从activity是否位于前台这个角度回调的除了这个区别在实际使用中没有其他区别回收或初始化数据可以看情况提前或者靠后在activity异常终止的时候会调用onsaveinstanceState来保存当前activity的状态正常情况情况下系统是不会调用这个方法的。可以通过onRestoreInstanceState和onCreate方法来判断activity是否被重建了如果被重建就可以取出之前保存的数据并恢复俩者的区别是onRestoreInstanceState一旦被调用其参数bundle一定是有值的不需要额外的判断是否为空。从时序上来说onRestoreInstanceState的调用时机在onstart之后。一些后台工作不适合脱离四大组件而独自运行在后台中程序退出后系统会保留一个空进程方便系统再次启动这样进程很容易被杀死比较好的方法是将后台工作放在service中从而保证进程有一定的优先级这样就不会轻易被系统杀死了画曲线的是经常用的 启动模式 当栈中无任何activity的时候系统就会回收这个任务栈standard标准模式。一个任务栈中可以有多个实例每个实例也可以属于不同的任务栈。在这种模式下谁启动了这个activity那么这个activity就运行在启动它的那个activity所在的栈中比如activity A启动了activity BB是标准模式那么B就进入A所在的栈中singleTop:栈顶复用模式。在这种模式下如果新的activity已经位于任务栈的栈顶那么此activity不会重复创建同时它的onNewIntent方法会被回调通过此方法的参数可以取出当前请求的信息。singleTask模式也会回调这个方法 有俩种方法可以指定activity的启动模式。第一种是通过清单文件指定第二种是通过intent中设置标志位来为activity指定启动模式。俩者是有却别的。首先优先级上第二种比第一种高当俩种同时存在时以第二种方式为准其次上述俩种方式在限定范围上有所不同比如第一种方式无法直接为activity设定FLAG_ACTIVITY_CLEAR_TOP标示而第二种方式无法为activity指定singleInstance模式隐式启动,只有一个intent同时匹配action、category、data才算是完全匹配只有完全匹配才能成功启动目标activity。一个activity中可以有多个intent-filter一个intent只要能匹配任何一组intent-filter即可成功启动对应的activity 第二章IPC机制 IPC含义为进程间通信或跨进程通信是指俩个进程间进行数据交换的过程。IPC不是android中独有的任何一个操作系统都需要有相应的IPC机制。在android中使用多进程只有一种方法那就是给四大组件在清单文件中指定process属性除此之外没有其他方法 多进程有这么问题但是我们不能因为多进程有很多问题就不去正式它。为了解决这个问题系统提供了很多跨进程通信方法虽然不能直接的共享内存但是通过跨进程通信还是可以实现数据交互。实现跨进程通信的方法有很多比如通过intent来传递数据共享文件和SharedPreferences,基于binder的message和AIDL以及Socket等serializable和Parcelable接口可以完成对象的序列化过程当我们需要通过Intent和binder传输数据时就需要使用他们。还有的时候我们需要把对象持久化到存储设备上或者通过网络传输给其他客户端这个时候也需要序列化用serializable序列化只需要这个类实现serializable接口并声明serialVersionUID即可实际上甚至这个serialVersionUID也不是必须的不声明这个serialVersionUID同样可以实现序列化但是这会对反序列化产生影响。当反序列化的时候系统会去检测文件中的serialVersionUID看他是否和当前类的serialVersionUID一致如果一致就说明序列化的类的版本和当前类的版本是相同的这个时候可以成功序列化。如果类结构发生了非常规性改变比如修改了类名、成员变量类型反序列化就会失败因为类结构有了毁灭性的改变根本无法从老版本的数据还原出一个新的类结构对象。注意静态成员变量属于类不属于对象所以不会参与序列化过程其次用transient关键字标记的成员变量不参与序列化过程 AIDL的使用流程首先创建一个服务service和一个aidl接口接着创建一个类继承自aidl接口中的stub类并实现stub中的抽象方法就是定义接口的方法在service的onbinder方法中返回这个类的对象然后在客户端就可以绑定服务端service建立连接后就可以访问远程服务端的方法了如果公司项目庞大了现在有10个不同的业务模块都需要使用aidl来进行进程间通信不需要创建10个、100个服务可以将所有的aidl放在同一个服务里去管理用binder连接池具体看书 第六章android中的drawable Drawable表示的是一种可以在Canvas上进行绘制的抽象概念它的种类有很多最常见的颜色和图片都可以是一个Drawable。优点首先它的使用简单比自定义view的成本要低其次非图片类型的Drawable占用空间较小这对减少apk的大小也很有帮助。Drawable常用来作为view的背景使用一般都是通过XML来定义的也可以用代码来创建具体的Drawable创建比较复杂。Drawable的内部宽高通过getIntrinsicWidth和getIntrinsicHeight这来个方法可以获得。但是并不是所有的Drawable都有宽高比如一张图片所形成的Drawable它的内部宽高就是图片的宽高但是一个颜色所形成的Drawable它就没有内部宽高的概念另外需要注意的是Drawable的内部宽高不等于它的大小一般来说Drawable是没有大小概念的当用作view的背景时Drawable会被拉伸至view的同等大小Drawable的分类子类BitmapDrawable、ShapeDrawable、StateListDrawable、LevelListDrawable、TransitionDrawable、InsetDrawable、ScalDrawable、ClipDrawable等Drawable的使用范围很单一一个是作为imageview中的图像来显示另外一个就是作为view的背景 转载于:https://www.cnblogs.com/sixrain/p/6956240.html