Zatan (android basic knowledge combing notes)

Disclaimer: This article is a blogger original article, shall not be reproduced without the bloggers allowed. https://blog.csdn.net/qq_34501274/article/details/88415030

Note: This article belongs to the type of finishing the article, the article described map and summary of the places used by other bloggers painting

Zatan (app optimization, android mechanism Series)

Zatan (Lrucache mechanism)

Zatan (android basic knowledge combing notes)

Zatan (http / https Socket)

Four components related to knowledge

Activity

 描述:一个Activity通常就是一个单独的屏幕,就是用户看得到的
 生命周期:onCreate、onStart、onResume、onPause、onStop、onDestroy
 
 正常启动一个activity:onCreate -> onStart -> onResume
 切换到后台/锁屏:onPause -> onStop    再打开界面  onRestart ->  onStart->   onResume-> 
 A到B界面:(A)onPause ->  (B)onCreate -> (B)onStart -> (B)onResume -> (A)onStop->
 这时如果按回退键回退到A  onPause(B)->onRestart(A)->onStart(A)->onResume(A)->oStop(B)

Activity four promoters mode:

  • Standard mode (default start-up mode)
每当我们启动一个Activity,系统就会相应的创建一个实例,不管这个实例是否已经存在。
  • multiplexing mode stack singleTop
如果要启动的Activity处于栈的顶部,那么此时系统不会创建新的实例,而是直接打开此页面,同时它
onNewIntent()方法会被执行,可以通过Intent进行传值,而且它的onCreate()onStart()方法不会被调用。
  • The multiplexing mode stack singleTask
栈中存在这个Activity的实例就会复用这个Activity,复用时,它上面的Activity全部出栈,
因为singleTask本身自带clearTop这种功能。并且会回调该实例的onNewIntent()方法
  • SingleInstance mode
该模式具备singleTask模式的所有特性外,与它的区别就是,这种模式下的Activity会单独占用一个Task栈,
具有全局唯一性,即整个系统中就这么一个实例,由于栈内复用的特性,
后续的请求均不会创建新的Activity实例,除非这个特殊的任务栈被销毁了。
以singleInstance模式启动的Activity在整个系统中是单例的,
如果在启动这样的Activiyt时,已经存在了一个实例,那么会把它所在的任务调度到前台,重用这个实例。 

Activity had to switch screens when the life cycle

竖屏启动----切换横屏(没有配置    <!--android:configChanges="orientation|keyboardHidden|screenSize"-->)
onPause---> 
onSaveInstanceState ---> 
onStop---> 
onDestroy---> 
onCreate---> 
onStart---> 
onRestoreInstanceState---> 
onResume---> 

注:关于旋转屏幕无法调用onSaveInstanceState的问题,出现这种问题你复写的肯定以下方法
public void onSaveInstanceState (Bundle outState, PersistableBundle outPersistentState); 
改成以下方法即可
public void onSaveInstanceState (Bundle outState){
	/**
	*可在此方法保存之前状态数据,onRestoreInstanceState中恢复
    */
}


配置 android:configChanges="orientation|keyboardHidden|screenSize"
切换时只走:onConfigurationChanged
Broadcast Receiver
广播使用了设计模式中的观察者模式:基于消息的发布 / 订阅事件模型,因此
因此,Android将广播的发送者 和 接收者 解耦,使得系统方便集成,更易扩展。

注册方式:静态注册、动态注册(优先级较高)

响应时间:onRecevie(10秒之内不能完成的话,会被android判定程序无响应。

General broadcast

     可在同一时刻被所有接收者接收到。
缺点:无法将数据结果传递给下一个。sendBroadcast()发送无序广播

Ordered Broadcast

/**
 * 1.有序广播的接收者按照之前定义的优先级依次接收Broadcast
 * 2.设置优先级①在AndroidManifest的<Intent-filter android:priority=数值> 
 *             ②在代码的IntentFilter对象的 setPriority()取值范围是1~1000
 * 3.sendOrderedBroadcast()发送有序广播
 * 4.同时,优先收到广播的接收者可以停止继续发送Broadcast:调用abortBroadcast();
 * 优先收到广播的接收者可以通过setResultExtras(Bundle)将数据存入Broadcast,然后传送给下一个接收者,
 * 下一个接收者通过Bundle bundle = getResultExtras(true);接收数据
 * */

Broadcast is global, security is not good, it is recommended to use only local broadcast reception within an application to broadcast

核心用法
  使用LocalBroadcastManager来管理广播:
    a.调用LocalBroadcastManager.getInstance(this)来获得实例
    b.调用xx.registerReceiver(BroadcastReceiver receiver,IntentFilter filter)来注册广播;(receiver本地广播接收器)
    c.调用xx.sendBroadcast()发送广播
    d.调用xx.unregisterReceiver()取消注册

注意事项
    a.本地广播无法通过静态注册来接收,相比起系统全局广播更加高效
    b.在广播中启动activity的话,需要为intent加入FLAG_ACTIVITY_NEW_TASK的标记,不然会报错,
      因为需要一个栈来存放新打开的activity。
    c.广播中弹出AlertDialog的话,需要设置对话框的类型为:TYPE_SYSTEM_ALERT不然是无法弹出的。

Broadcast Receiver, local broadcast differences, local broadcast is recommended to look at the source code

service
响应时长:20s
/**
 * bindService启动服务特点:
 *     1.bindService启动的服务和调用者之间是典型的client-server模式。调用者是client,service则是server端。
 *       service只有一个,但绑定到service上面的client可以有一个或很多个。这里所提到的client指的是组件,比如某个Activity。
 *     2.client可以通过IBinder接口获取Service实例,从而实现在client端直接调用Service中的方法以实现灵活交互,
 *       这在通过startService方法启动中是无法实现的。
 *     3.bindService启动服务的生命周期与其绑定的client息息相关。当client销毁时,client会自动与Service解除绑定。
 *       当然,client也可以明确调用Context的unbindService()方法与Service解除绑定。当没有任何client与Service绑定时,Service会自行销毁。
 * */

 private ServiceConnection conn = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder binder) {
        		// 连接成功会调用
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
     
        }
    };

The life cycle of the two methods.
Here Insert Picture Description

ContentProvider
进程间 进行数据交互 & 共享,即跨进程通信

Here Insert Picture Description
Many Android system applications use this method to share data, such as contacts, text messages, etc.

  1. A data package. It provides a unified interface
  2. Cross-way data sharing process

Fragment life cycle

Here Insert Picture Description

  1. Fragment在Activity中replace onPause(旧) -> onAttach -> onCreate -> onCreateView -> onActivityCreated -> onStart -> onResume -> onStop(旧) -> onDestoryView(旧)

Talk about the understanding of the interface callbacks

A.面向对象设计的封装性,模块间要解耦,模块内要内聚
B.协作、解耦
  
    /**
     *  a.(回调)协作:A对象关心B对象的状态变化,B对象提供一个监听B对象状态的接口,让A对象添加这个监听,
     *     B对象的状态就可以通过接口函数告诉A了。另辟独径的给对象解耦。
     *     这样就实现了模块间协作。常见的例子:给Recyclerview设置Item的点击事件
     *
     *  b.(接口)解耦:削弱模块间的协作性(耦合性),使得模块之间高度独立,模块间更多的从事着单向的调用工作。
     *     一个模块需要某种服务就去找另一个模块,这使得程序呈现出层次性,高层通过接口调用底层,底层提供服务。
     *     摈弃模块间你中有我我中有你的暧昧关系。
     *
     */
   a.b合起来就是接口回调:

    

LinearLayout, RelativeLayout, FrameLayout characteristics and contrast, and describes the use of scenarios.

LinearLayout, RelativeLayout, FrameLayout characteristics and contrast, and using the scene description

1.RelativeLayout会让子View调用2次onMeasure,LinearLayout 在有weight时。也会调用子View2次onMeasure
2.RelativeLayout的子View假设高度和RelativeLayout不同,则会引发效率问题,当子View非常复杂时,这个问题会更加严重。
3.在不影响层级深度的情况下,使用LinearLayout和FrameLayout而不是RelativeLayout。
  /**
     * 最后再思考一下文章开头那个矛盾的问题,为什么Google给开发人员默认新建了个RelativeLayout,而自己却在DecorView中用了个LinearLayout
     * 由于DecorView的层级深度是已知并且固定的,上面一个标题栏,以下一个内容栏。採用RelativeLayout并不会减少层级深度,所以此时在根节点上*用LinearLayout是效率最高的。
     * 而之所以给开发人员默认新建了个RelativeLayout是希望开发人员能採用尽量少的View层级来表达布局以实现性能最优,
     * 由于复杂的View嵌套对性能的影响会更大一些。
     */

4.能用两层LinearLayout,尽量用一个RelativeLayout,在时间上此时RelativeLayout耗时更小。
另外LinearLayout慎用layout_weight,也将会添加一倍耗时操作。
	
由于使用LinearLayout的layout_weight,大多数时间是不一样的,这会减少測量的速度。
这仅仅是一个怎样合理使用Layout的案例,必要的时候。你要小心考虑是否用layout weight。总之减少层级结构,才是王道。
让onMeasure做延迟载入,用viewStub等一些技巧。

The sequence of action, and the difference of the two sequences Android

  • effect:

  1.Serializable:为了保存对象的属性到本地文件、数据库、网络流、rmi以方便数据传输,当然这种传输可以是程序内的也可以是两个程序间的
  2.Pacelable:为了在程序内不同组件间以及不同Android程序间(AIDL)高效的传输数据而设计。
               这些数据仅在内存中存在,Parcelable是通过IBinder通信的消息的载体
 
  • effectiveness:

Parcelable的性能比Serializable好,在内存开销方面较小。
在内存间数据传输时推荐使用Parcelable
在需要保存或网络传输数据时选择Serializable

  • program:
  1.Serializable需要提供一个serialVersionUID。
  2.Parcelable则需要实现writeToParcel、describeContents函数以及静态的CREATOR变量,实际上就是将如何打包和解包的工作自己来定义,
    而序列化的这些操作完全由底层实现
  • the difference:
Serializable在序列化时会产生大量临时变量,引起频繁GC。
Serializable本质上使用了反射,序列化过程慢。
Parcelable不能将数据存储在磁盘上,在外界变化时,它不能很好的保证数据的持续性
  • Advanced functionality

 Serializable序列化不保存静态变量,可以使用Transient关键字对部分字段不进行序列化,
 也可以覆盖writeObject、readObject方法以实现序列化过程自定义
 
Data storage Android
  • File Storage
  • SharedPreferences
  • SQLite database storage
  • Content providers who
  • cloud storage

Guess you like

Origin blog.csdn.net/qq_34501274/article/details/88415030