如果一个Servce同时被StartServce还被BindServce的情况下,只调用stopServce没调用unBindServce是无法停止服务的(就算走了onDestory也无法停止)
#Servce和IntentServce的区别
Servce是运行在程序后台的,为了保证应用某些组件仍然可以工作,这时就会引用Servce组件的概念(Servce绝对不是一个独立的进程他也更不是一个独立的线程他是依赖于应用程序的主线程的)
IntentServceintentServce是继承Servce去处理异步请求的一个类
内部有一个工作线程HandlerThread来处理耗时操作任务...
Servce与Thread使用场景与区别
Thread是程序执行的最小单元,它是分配CPU的基本单位
线程的生命周期
新建(new Thread之后 Thread就进入了新建状态,还有可能进入未启动状态)
就绪(线程已经启动了,正在等待CPU分配的时间片,在就绪队列中,排队等候CPU的资源)
运行(线程已经获得了CPU的资源,正在执行任务,这时候正在执行run()方法,此时除非此线程自动放弃CPU的资源,或者有更高优先级的线程进入,否则该线程就会一直运行,直到结束)
死亡(当线程执行完毕,或者被其他线程杀死的时候,线程就进入了一种死亡状态,这时候线程就不可能进入就绪或者等待的状态)
阻...
#Servce
Serve和线程的区别和场景(Servce是Android的四大组件之一,他是运行在主线程当中的,他是系统进程托管的)
如何管理Servce的生命周期(BindServce和StartServce 两种开启方式生命周期不同,但是两者有一样的地方)
Servce和IntentServce的区别(Servce不是独立的线程也不是独立的进程,他是依赖于应用程序的主线程的,所以不建议在Servce中进行耗时操作和复杂逻辑因为这样会造成ANR为解决以上问题,google提供了IntentServce这个类,IntentServce中有一个工作线程去处理那些耗时操作IntentSe...
首先Activity启动需要使用到6个点,分别是
AMS
ActivityStackSupervisor
ActivityStack
ActivityManagerServce
PackageManagerService
ActivityThread
首先laucher点击后,调用startActivitySatefly 之后会调用Activity的startActivity 因为laucher也是一个Activity,之后startActivity内部其实是调用了startActivityForResult request是-1也就是没有回调,所以平时开发的时候,使用startA...
OOM
1.什么事是OOM
2.一些容易混淆的概念
3.如何解决OOM
什么是OOM 在线上项目中异常后台日志中会看到一些OOM的异常,OOM其实就是当我们使用的内存加上申请的内存大于Dailvk虚拟机最大的内存限制,就会出现Out of memory异常,也就是内存溢出,内存不够导致的,大部分OOM问题都跟Bitmap加载相关。
容易混淆的概念 内存溢出/内存泄漏/内存抖动
内存溢出(OOM)
内存抖动(内存抖动是短时间内大量的对象被创建出来,然后瞬间的释放,瞬间产生的对象会严重的占用内存区域,然后频繁的触发GC)
内存泄漏(进程中的对象已经不被其他对象引用到了,但是他们可以直接...
如何避免OOM产生考点
对Java内存管理机制有一定认知
Android内存优化经验
代码编写习惯避免内存消耗
如何避免OOM产生(原因)
OOM如何产生?
如何优化程序减少内存占用
如何产生OOM?
已使用内存+新申请内存>可分配内存
OOM几乎覆盖了所有内存,通常指堆内存
Native Heap在物理内存不够时会抛出OOM
如何解决OOM?
使用合适的数据结构类型{ 以HashMap为例展开优化 原数个数(>1000 -> HashMap else ArrayMap or SparseArray) 增删频繁吗(频繁->HashMap else Ar...
主要内容Android部分
Android五大布局都有哪些
Context是什么,它实现了哪些功能,它的实现类是什么?
Intent都有那些属性
Handler消息机制 5个组成部分
Dalvik虚拟机是什么,有什么用,他与JVM的区别
AsyncTask的使用,他与Handler+Thread的区别
OOM怎么形成的,如何解决
ANR是怎么产生的,如何定位问题
IPC机制,Binder,以及其他两种分别是什么,进行几次数据拷贝
热更新都用过哪些框架,它与其他热更新框架的区别,他是做怎么实现热更新的(APP启动流程上进行Hook替换)
App启动流程详细说明(√)
事件分发的三个方法,以...
HashMap是由数组和链表组成,通过get/put以键值对的形式进行读取和存储,存储时通过HashMap的hash方法将key进行hash计算key的hashcode上16位异或下16位计算,这样计算性能上的开销比较低,而且不容易发生碰撞,得出hash值在通过数组的长度,计算出数组下角标,当我们存入时会发生几种情况,第一种是hashMap中没有存储过该hash值得数据,我们就直接插入,如果数组中存在该hash值得数据,我们将通过equals方法进行内容比对,如果返回true,我们将value覆盖,如果返回false,我们则插入在链表当1.7之前是头插法,1。7之后改为尾插法中,数组每一...
Q:HashMap 的数据结构?A:哈希表结构(链表散列:数组+链表)实现,结合数组和链表的优点。当链表长度超过 8 时,链表转换为红黑树,transient Node<K,V>[] table
Q:HashMap 的工作原理?A:HashMap 底层是 hash 数组和单向链表实现,数组中的每个元素都是链表,由 Node 内部类(实现 Map.Entry<K,V>接口)实现,HashMap 通过 put & get 方法存储和获取。存储对象时,将 K/V 键值传给 put() 方法:①、调用 hash(K) 方法计算 K 的 hash 值,然后结合数组长...
对Thread的理解,也可以理解为什么是Thread?他能做什么?
线程是CPU调度的基本单位,一个进程可以有多个线程
在java中线程有四种实现方式
继承或者创建Thread类 并实现run方法;
实现Ranable接口,实现接口中run方法;
实现Callabe接口,通过FutureTask包装器来创建Thread线程Callable<V> oneCallable = new SomeCallable<V>();
//由Callable<Integer>创建一个FutureTask<Integer>对象:
FutureTa...