炒鸡全面 android 总结

24 篇文章 0 订阅
22 篇文章 0 订阅
进程通信

默认情况下,同一个应用所有组件在相同的进程线程中运行,即如果应用已经启动,则后续组件启动也在已有进程中

进程

默认情况下所有组件在相同的进程中运行。但是可以在清单文件中进行配置,即添加属性android:process=“”(不同于android:sharedUserId =“”,此是应用进程)android系统根据需要会在内存较低的情况下销毁进程

进程生命周期

进程的5个重要等级

  1. 前台进程如果进程满足下面任意条件则为前台进程

    1. 进程包含用户正在交互的Activity
    2. 绑定到service,并且service绑定到用户正在交互的activity
    3. 绑定到一个正在执行生命周期方法的service
    4. 含有广播的接受器正在执行onReceive()方法
  2. 可见进程 没有任何前台组件但仍然影响用户所见屏幕内容。

    1. 托管不在前台但仍对用户可见的activity,activity启动一个dialog,activity处于onpause状态
    2. 托管了service,此service绑定到了前台Activity
  3. 服务进程 进程正在运行以startService启动的服务,且不属于上面的2个进程类别。

  4. 后台进程 包含目前对用户不可见的Activity进程这些进程对用户没有直接影响,系统可以直接终止它们。

  5. 空进程 不含有任何活动组件的应用进程。

线程

应用主线程亦是线程主线程包括事件分发,主线程也是应用与UI组件交互的线程。不能在UI进程中执行耗时操作,否则会无响应。
android UI 不是线程安全,因此不能通过工作线程更新UI。Android单线程模式必须遵循2条规则:

  1. 不要阻塞UI线程
  2. 不要在UI线程外访问UI控件
工作线程

UI主线程以外的线程。

  1. activity.runOnUiThread(runnable)
  2. view.post(Runnable)
  3. view.postdelayed(Runnable, long)
  4. 使用AsyncTask
进程间通信

android利用远程调用(RPC)提供了进程间通信(IPC).进程间通信必须使用service,且调用bindService.

activity 启动模式

4种:standard,singletop,singletask,singleinstance.
2种设置,mainifest XML文件;IntentFlag。flag有三种:clear_top , new_task, single_top
alwaysRetainTaskState:保存task的全部activity状态,即使时间很长
clearTaskonLaunch:activity已经在底部,回到此activity时会清除本activity上面的activity
理解activity启动模式的关键点是:结合任务栈。

  • standard,标准模式,每次在任务栈中创建activity
  • singletop,如果当前栈顶已有此activity,则将消息传递此实例
  • singletask,如果当前栈中有这个实例且不在顶部,则弹出此实例上面的activity,再将消息传递此实例,调用onNewIntent()方法。如果此实例已经存在后台(back)栈中,则此栈会压入到前台栈。
  • singleinstance只有一个实例在任务栈中。如果此实例不存在,则新建栈放入此实例。如果实例已经存在,则将消息传递此实例,调用onNewIntent()方法
service 级别

服务有2种形式:

  • startService 启动的服务不受调用端影响,即使调用端结束了,服务器也可以在后台运行
  • bindservice(),绑定服务提供一个客户端-服务器连接接口,全部取消绑定服务才会被销毁

服务即可以是绑定的,也可以是启动的

服务还是进程

如果不需要与用户交互,那么应该创建服务
如果用户与应用交互时需要额外工作,那么需创建进程。推荐使用android的异步线程(Aynctask,HandlerThread).创建服务是须继承Service父类。应该重写回调方法:

  • onStartCommand() 当组件通过startService请求服务时,此方法被调用。执行任务后续结束被服务,stopSelf(),stopService()
  • onBind() 当组件调用bindService(),此方法被调用。此方法必须返回一个IBinder对象提供客户端与服务进行通信。返回null则此服务不被外界绑定。
  • onCreate()首次创建服务时调用此方法。如果服务已经存在,则此方法不会调用。
  • onDestory(),当服务不再使用,销毁时调用此方法,在方法应该要释放线程、接收器等资源。
  • 如果组件通过startService启动服务,那么必须服务自己调用stopself,或外部调用stopService来停止它,否则它一直运行。
  • 如果组件通过bindService创建服务,则服务只会在绑定时运行。当所有绑定全部取消,那么它会被销毁。
  • 如果内存低,系统会停止服务。如果服务绑定到焦点Activity,那么服务不会被终止。如果服务被设置为前台服务,那么它永远不会被系统终止。如果服务是被startService启动的,在内存可用时会再次启动服务。
  • 推荐使用显示启动&绑定服务,即直接设置包名。不要设置Intent过滤器
创建启动服务
  • startservie()启动服务,调用服务onstartcommand()方法。在intent中传递数据。
  • 服务的父类:Service ,IntentService----onHandlerIntent
IntentService
  1. 创建默认工作线程,用于传递所有Intent.
  2. 创建工作队列,将Intent传递给方法onHandlerIntent()
  3. 处理完所有消息,自动停止服务
  4. 提供onBind()默认实现,返回null
  5. 提供onstartcommand()默认实现,将Intent发送到工作队列和onHandlerIntent()方法
扩展服务

提供onstartcommand的返回值

  • START_NOT_STICKY,如果系统在onstartcommand()返回后终止服务,除非系统有挂起的Intent要传递,否则系统不会重启服务。
  • START_STICKY如果系统在onstartcommand()返回后终止服务,则会重启服务,并调用onstartcommand()但不会重新传递最后一个Intent,而是会传递一个空Intent。如有挂起的Intent则传入挂起Intent。
  • START_REDELIVER_INTENT 如果系统在onstartcommand()返回后终止服务,则系统会重启服务,并传递最后一个Intent给onstartcommand()。适合继续下载。
  • 前台服务,前台服务必须在通知栏提供通知。startForeground();
    stopForeground();
  • 服务生命周期 - 启动服务 – 绑定服务
广播种类
  1. 系统广播,部分系统广播对第三方应用屏蔽。
  2. 普通广播,app发送广播给其他应用接收。
  3. 本地广播,广播只发送给本app内的广播接收器。LoacalBroadCastManager
  4. 有序广播,通过方法sendorderbroadcast(intent, string permission);
    广播可以设置包名,成显式广播。
    广播设置权限,使申请权限的广播可以接收。
    动态广播
 public abstract Intent registerReceiver(@Nullable BroadcastReceiver receiver,
                                            IntentFilter filter);

&静态广播

view的绘制

Activity显示时,需要绘制它的界面。android 框架将处理绘制进程,Activity提供视图层级的根节点。
绘制是在布局的根节点开始。它需要测量绘制布局树。追踪树并且渲染视图。每一个Viewgroup承担子布局/控件的绘制,每一个view承担自己的绘制。先绘制父布局的,再绘制子view布局。

检测路径
  • 路径检测是在measure(int , int)方法中实现的。是一个自顶向下搜索视图树。在遍历过程中每个view把尺寸规格放到视图树中。每个view存储自己的尺寸,在路径测量结束。第二步是在layout(int,int, int, int)。
  • 当view对象的measure()方法返回后,它的getMeasureWitdh()和getMeasureHeight()的值必须被设置。子控件的尺寸受父控件尺寸的限制。
  • 测量路径使用2个类与尺寸交互。view使用ViewGroup.LayoutParmas类来告诉父容器它们需要被怎样的测量和放置。ViewGroup.LayoutParmas类描述了View的宽高,尺寸有下面的说明:A.具体数字 B.匹配父容器 C.匹配内容大小
事件分发机制

viewgroup 包含多个视图(views)
viewgroup ---------onInterceptTouchEvent(),返回ture表示动作事件被拦截,不会将事件传递给子视图,而是传递到此viewgroup的onTouchEvnet(),onInterceptTouchEvent()可以在子控件之前查看事件,如果onInterceptTouchEvent()返回true,那么子控件将接受到cancle事件,并且从哪个时间点开始事件被传递到父控件的onTouchEvnet(),如果父控件onInterceptTouchEvent()返回false,事件将传递到子控件中。子控件将在onTouchEvnet()方法中处理此事件

view&view group区别

viewGroup继承View。在自定义控件中,viewGroup包含很多子view.在控件绘制时,父容器先确定子view的尺寸。onlayout时先渲染父控件,再渲染子控件

动画类型

位图动画
物理引擎动画,
对象动画
弹簧动画
渐进&淡出动画

activity生命周期

正常流程:oncreate()->onstart()->onresume()->onpause()–>onstop()->ondestory()

onpause()=>onresume()
onstop()
>onCreate()
onstop()>onrestart()>onstart()

动态广播注册&注销必须在对称周期内。否则会广播遗落注销。

生命周期监听接口:LifecycleObserver

listview & recycleview区别

recycleView 更丰富,能够实现更多细节

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值