android基本知识

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_31433525/article/details/79390400

android知识图谱

知识图谱

性能优化

Android APP性能优化的四个方面最全总结
布局优化:
减少布局层级,不要再主线程做耗时操作。使用ViewStub,提高显示速度。布局复用,删除控件中无用属性。
避免过度绘制:
移除XML中非必须的背景,移除Window默认的背景、按需显示占位背景图片。使用canvas.clipRect()来帮助系统识别那些可见的区域,只有在这个区域内才会被绘制。
启动优化:
可以采用分布加载、异步加载、延期加载策略来提高应用启动速度。数据初始化分析,加载数据可以考虑用线程初始化等策略。
合理的刷新机制:
尽量减少刷新次数,尽量避免后台有高的CPU线程运行,缩小刷新区域。
避免内存泄漏:
资源性对象未关闭。比如Cursor、File文件等,往往都用了一些缓冲,在不使用时,应该及时关闭它们。注册对象未注销。比如事件注册后未注销,会导致观察者列表中维持着对象的引用。类的静态变量持有大数据对象。非静态内部类的静态实例。Handler临时性内存泄漏。如果Handler是非静态的,容易导致Activity或Service不会被回收。容器中的对象没清理造成的内存泄漏。WebView存在着内存泄漏的问题,在应用中只要使用一次WebView,内存就不会被释放掉。
优化内存空间:
根据业务需求合理使用不同的引用类型,强引用、软引用、弱引用、虚引用四种引用类型。减少不必要的内存开销,注意自动装箱,增加内存复用,比如有效利用系统自带的资源、视图复用、对象池、Bitmap对象的复用。使用最优的数据类型。比如针对数据类容器结构,可以使用ArrayMap数据结构,避免使用枚举类型,使用缓存Lrucache等等。图片内存优化。可以设置位图规格,根据采样因子做压缩,用一些图片缓存方式对图片进行管理等等。
稳定性优化:
提高代码质量。比如开发期间的代码审核,看些代码设计逻辑,业务合理性等。Crash监控,上传。
耗电优化:
Battery Historian分析优化,计算优化,避开浮点运算等。避免WaleLock使用不当,使用Job Scheduler。
安装包大小优化:
代码混淆,使用ProGuard代码混淆器工具,它包括压缩、优化、混淆等功能。资源优化。比如使用Android Lint删除冗余资源,资源文件最少化等。图片优化。比如利用AAPT工具对PNG格式的图片做压缩处理,降低图片色彩位数等。避免重复功能的库,使用WebP图片格式等。插件化。比如功能模块放在服务器上,按需下载,可以减少安装包大小。

activity和fragment和service的生命周期

activity的生命周期: onCreate()->onStart()->onResume()->onPause()->onStop()->onDestory()
onStop()=>onRestart()->onStart()->…
onStop()->onCreate()->…应用被killed
onCreate:第一次打开应用程序,Activity被创建。
onStart:当Activity变成用户可见时调用的方法。
onRestart:重新用户可见时调用的方法,在onStart()方法调用之后调用。
onResume:当界面获得焦点时调用的方法
onPause:当界面失去焦点时调用的方法
onStop():当Activity变成用户不可见时调用的方法。
onDestroy:Activity销毁时调用的方法
fragement的生命周期: onAttach()->onCreate()->onCreateView()->onActivityCreated()->onStart()->onResume()->onPause()->onStop()->onDestoryView()->onDestory()->onDetach()
onAttach:当Activity与Fragment发生关联时调用
onCreateView:创建该Fragment的视图
onActivityCreate:当Activity的onCreate();方法返回时调用
onDestoryView:与onCreateView相对应,当改Fragment被移除时调用
onDetach:与onAttach()相对应,当Fragment与Activity的关联被取消时调用

//启动应用程序进入MainActivity
Fragment  onAttach
Fragment  onCreate
Fragment  onCreateView
Activity  onCreate
Activity  onStart
Fragment  onActivityCreated
Fragment  onStart
Activity  onResume
Fragment  onResume

//点击按钮进入另外一个Activity
Activity  onPause
Fragment  onPause
Activity  onStop
Fragment  onStop

//按手机上的返回键
Activity  onRestart
Activity  onStart
Fragment  onStart
Activity  onResume
Fragment  onResume

//按手机上的Home键
Activity  onPause
Fragment  onPause
Activity  onStop
Fragment  onStop

//从应用进程进来
Activity  onRestart
Activity  onStart
Fragment  onStart
Activity  onResume
Fragment  onResume

//按手机上的Home键
Activity  onPause
Fragment  onPause
Activity  onStop
Fragment  onStop
Activity  onDestroy
Fragment  onDestroyView
Fragment  onDestroy
Fragment  onDetach

//如果将第二个Activity的风格指定为对话框形式
Activity  onPause
Fragment  onPause
Activity  onResume
Fragment  onResume

service的生命周期:

  • startService启动service

onCreate()->onStartCommand()(可多次调用)->onDestory()
如果服务已经开启,则系统不会再调用onCreate方法只会调用onStartCommand方法

  • bindService()启动Service

onCreate()->onBind()(只一次,不可多次绑定)->onUnBind()->onDestory()
但销毁activity它就结束,如果按home把它放到后台,那他就不退出。

minSdkVersion,compileSdkVersion,targetSdkVersion

compileSdkVersion : 告诉 Gradle 用哪个 Android SDK 版本编译你的应用。使用任何新添加的 API 就需要使用对应等级的 Android SDK。 修改 compileSdkVersion 不会改变运行时的行为,推荐使用最新的 SDK 进行编译。
minSdkVersion: 应用可以运行的最低要求。某些库有自己的minSdkVersion,需要设置得比他们的minSdkVersion高,如果一定要比他们底,可以在AndroidManifest.xml中添加 < uses-sdk tools:overrideLibrary=”xxx.xxx.aaa, xxx.xxx.bbb”/>,(xxx.xxx.aaa是第三方库的包名)这样做是为了项目中的AndroidManifest.xml和第三方库的AndroidManifest.xml合并时可以忽略最低版本限制。
targetSdkVersion: targetSdkVersion 是 Android 提供向前兼容的主要依据,在应用的 targetSdkVersion 没有更新之前系统不会应用最新的行为变化。当系统版本大于targetSdkVersion时,应用使用targetSdkVersion版本及以下表现形式。当系统版本小于等于targetSdkVersion时,使用自己编写过的代码形式,系统默认开发者已经处理了。

线程池Executors 和ThreadPoolExecutor

ThreadPoolExecutor :可以指定创建 ThreadPoolExecutor 实例时活跃的线程数,并且可以限制线程池的大小,还可以创建自己的 RejectedExecutionHandler 实现来处理不适合放在工作队列里的任务。
Executors:提供了创建常用配置线程池的方法。如
FixedThreadPool 线程数量固定且可重用,核心线程数和最大线程数是一样的,除非线程池关闭,否则线程不会被回收
SingleThreadExecutor 最大线程数跟核心线程数都是1,所有任务都是在同一个线程中按顺序来执行
CachedThreadPool 核心线程数为0,最大线程数任意大,有超时策略
ScheduledThreadPool 核心线程是调用者自己设定的,最大线程数是无限大,有超时策略
注:
阿里android开发规范中强制不允许使用Executors创建线程池,FixedThreadPool 和 SingleThreadPool : 允 许 的 请 求 队 列 长 度 为
Integer.MAX_VALUE,可能会堆积大量的请求,从而导致 OOM;CachedThreadPool 和 ScheduledThreadPool : 允 许 的 创 建 线 程 数 量 为
Integer.MAX_VALUE,可能会创建大量的线程,从而导致 OOM。

android消息机制:

就是handler,MessageQueue、Looper的工作机制,在子线程中不能更新UI,子线程用handler发消息给主线程更新UI,handler主要工作是消息的发送接收和处理,
handler发消息给MessageQueue,Looper不断从MessageQueue中轮询,收到消息给handler处理。
handler消息机制

activity与fragment之间传值:

activity往fragment传值:

//发送
Fragment01 fragment = new Fragment01(); 
Bundle bundle = new Bundle();
bundle.putString("str","这是Activity传来的值");
fragment.setArguments(bundle);
fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.fm01id,fragment01);
fragmentTransaction.commit();
//接收
String str = (String)getArguments().get(“str”);

fragment往activity传值:定义回调

//发送
public class Fragmen1 extends Fragment{  
    CallBackValue callBackValue;  
    /** 
     * fragment与activity产生关联是  回调这个方法  
     */  
    @Override  
    public void onAttach(Activity activity) {  
        // TODO Auto-generated method stub  
        super.onAttach(activity);  
        //当前fragment从activity重写了回调接口  得到接口的实例化对象  
        callBackValue =(CallBackValue) getActivity();  
    }  
   //使用此方法传值
    callBackValue.SendMessageValue(strValue);  

    //定义一个回调接口  
    public interface CallBackValue{  
        public void SendMessageValue(String strValue);  
    }  
}  

//activity种接收  就是这个参数的值  
    @Override  
    public void SendMessageValue(String strValue) {  
        // TODO Auto-generated method stub  
        tv1.setText(strValue);  
    }  

直接获取值:
fragment通过getActivity()获取activity对象,就能拿到activity中的值
activity通过getFragmentManager().finFragmentByid()或者getFragmentManager().finFragmentByTag()获取fragment实例,从中就能拿到里面的值。
所有传值都可以使用数据存储,sharedpreferences、文件存储、网络存储、ContentProvider等。

AsyncTask(异步)和Thread(同步)

AsyncTask可以在线程中处理UI,而Thread要用Handler.
简单的操作Ui,AsyncTask更好一些。如果不操作UI或者后台线程比较复杂,Thread更好一些。
AsyncTask一旦线程开启即dobackground方法执行后无法给线程发送消息,只能通过预先设置好的标记来控制逻辑,不够灵活。
AsyncTask运行中可以随时调用cancel(boolean)方法取消任务,如果成功调用isCancel()会返回true,并不会执行onPostExecute(),但任务执行了cancel后还是会继续执行,只是回调方法是onPostExecute还是onCancelled。
Thread 可以与Loop 和 Handler 共用建立消息处理队列。AsyncTask 可以作为线程池并行处理多任务。

activity的启动模式:

standard 标准模式,都会创建Activity实例,并放入任务栈
singletop 栈顶复用模式,只要不在栈顶,都会创建新的实例,适合接收通知启动的内容显示页面。位于栈顶重用该实例,调用onNewIntent方法
singleTask 栈内复用模式,栈中已经有该Activity的实例,就重用该实例,重用时,会让该实例回到栈顶,因此在它上面的实例将会被移出栈,不存在该实例,将会创建新的实例放入栈中,适合作为程序入口点。可以指定activity加载的目标栈,AndroidManifest中taskAffinity属性
singleInstance 单例模式,在一个新栈中创建该Activity的实例,并让多个应用共享该栈中的该Activity实例,适合需要与程序分离开的页面,如闹铃提醒

Service和Thread的区别:

service是系统组件由系统进程托管,是轻量级的ipc通信,可以在任何地方控制
thread由本应用程序托管,Thread 的运行是独立于 Activity ,如果thread没有执行完,即使activity finish掉,Thread也会一直运行。没法在不同的activity对thread进行控制。

如何安全退出已调用多个Activity的Application:

1、抛异常强制退出,需要解决不弹出Force Close窗口
2、记录打开的activity,退出时关闭
3、发送特点广播
4、递归退出

SurfaceView & View 的区别:

view的更新必须在UI thread中进行
surfaceview会单独有一个线程做ui的更新,支持open GL绘制。

Android数字签名:

1、所有的应用程序都必须有数字证书,Android系统不会安装一个没有数字证书的应用程序
2、Android程序包使用的数字证书可以是自签名的,不需要一个权威的数字证书机构签名认证
3、如果要正式发布一个Android ,必须使用一个合适的私钥生成的数字证书来给程序签名,而不能使用adt插件或者ant工具生成的调试证书来发布
4、数字证书都是有有效期的,Android只是在应用程序安装的时候才会检查证书的有效期。如果程序已经安装在系统中,即使证书过期也不会影响程序的正常功能

Android UI中的View如何刷新:

不使用多线程和双缓冲,显式调用View对象中的invalidate()
使用多线程不使用双缓冲,handler发送消息在主线程中调用View对象中的invalidate()
使用多线程和双缓冲,SurfaceView实现双缓冲,实现它的Callback接口

线程间通信有哪几种方式:

共享变量(内存)
管道
handle机制runOnUiThread(Runnable),view.post(Runnable)
参考

强引用(strongReference),软应用(softReference),弱引用(weekReference),虚引用(phantomReference)

强引用(StrongReference),类似Object obj = new Object()这类的引用,只要强引用还存在,GC永远不会回收掉被引用的对象
软引用(SoftReference),系统将要发生内存溢出异常时,将会把这些对象列入回收范围之中进行第二次回收
弱引用(WeakReference),当GC工作时,无论当时内存是否足够,都会回收
虚引用(PhantomReference),为一个对象设置虚引用的唯一目的就是在这个对象被GC回收是收到一个系统通知

ContentProvider是如何实现数据共享的:

通过实现ContentProvider的抽象接口将数据以类似数据库表的形式暴露出去,contentProvider存储和检索数据,通过它让所有应用访问的。

android的系统架构:

4层结构:
linux 内核层 负责硬件的驱动程序、网络、电源、系统安全
运行库 开放源代码的函数库如webkit、mediaframework
应用程序框架层 使用该层封装好的api进行快速开发
应用程序层 java开发人员开发的程序处于该层
5层结构:
Linux Kernel(Linux内核)
Hardware Abstraction Layer(硬件抽象层)
Libraries(系统运行库或者是c/c++ 核心库)
Application Framework(开发框架包 )
Applications(核心应用程序)

listView优化:

1、item布局,层级越少越好
2、复用convertView
3、使用ViewHolder
4、item中图片异步加载
5、快速滑动时,不加载图片
6、item中图片适当压缩
7、数据分页加载

横竖屏切换时候activity的生命周期

1.不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,默认首先销毁当前activity,然后重新加载
onPause()->onSaveInstanceState()-> onStop()->onDestroy()->onCreate()->onStart()->onRestoreInstanceState->onResume()
2、设置Activity的android:configChanges=”orientation|keyboardHidden”时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法

Service和IntentService

Service不是独立的进程,也不是独立的线程,它是依赖于应用程序的主线程的,也就是说,在更多时候不建议在Service中编写耗时的逻辑和操作,否则会引起ANR。
IntentService是继承Service的,那么它包含了Service的全部特性,当然也包含service的生命周期,那么与service不同的是,IntentService在执行onCreate操作的时候,内部开了一个线程,去你执行你的耗时操作。通过Handler looper message的方式实现了一个多线程的操作,同时耗时操作也可以被这个线程管理和执行,同时不会产生ANR的情况。

如何在让Service杀不死

1、设置Service中的onStartCommand返回值为START_STICKY
onStartCommand的4种返回值:
START_STICKY:系统在调用完onStartCommand()方法后,如果当前服务被终止了,系统会使该服务保持在启动状态,不过它不会保留之前传递的Intent对象。但是由于它保持启动状态,随后系统会尝试重新创建service,但之前的Intent对象没有被保存。在这个情况下,如果期间没有任何启动命令被传递到Service,那么参数Intent将为null。因此使用START_STICKY作为返回值,适用于不执行命令的媒体播放器(或类似的服务),它只是无限期的运行着并等待工作的到来.
START_NOT_STICKY:如果系统在onStartCommand()方法返回之后杀死这个服务,那么直到接受到新的Intent对象,这个服务才会被重新创建。这是最安全的选项,用来避免在不需要的时候运行你的服务
START_REDELIVER_INTENT:,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入。并且在在该服务调用stopSelf方法之前,能够一直保留intent对象数据。这适用于那些应该立即恢复正在执行的工作的服务,如下载文件。
START_STICKY_COMPATIBILITY:TART_STICKY的兼容版本,但不保证服务被终止后一定能重启。
2、在Service的onDestroy()中重启Service.
3、捕捉系统进行广播,重启service
4、双进程守护,通过aidi监听对方的进程,一旦被kill,重启对方的进程
Android进程保活招式大全

单例模式造成的内存泄漏

单例造成的内存泄漏

mvc,mvp,mvvm的区别

MVC、MVP、MVVM 三种组合模式分别有什么样的理解
MVC
View:对应于xml布局文件
Model:实体模型
Controllor:对应于Activity业务逻辑,数据处理和UI处理

从上面看起来各个组件的职责视乎还挺耦合MVC的,但是打开Android的一个Activity文件,一看一言难尽, Android中经常会出现数千行的Activity代码,究其原因,Android中纯粹作为View的各个XML视图功能太弱,Activity基本上都是View和Controller的合体,既要负责视图的显示又要加入控制逻辑,承担的功能过多,代码量大也就不足为奇。所有更贴切的目前常规的开发说应该是View-Model 模式,大部分都是通过Activity的协调,连接,和处理逻辑的。
MVP
View: 对应于Activity和xml,负责View的绘制以及与用户交互
Model: 依然是实体模型
Presenter: 负责完成View于Model间的交互和业务逻辑

在Android开发中MVP的设计思想用得比较多,利用MVP的设计模型可以把部分的逻辑的代码从Fragment和Activity业务的逻辑移出来,在Presenter中持有View(Activity或者Fragment)的引用,然后在Presenter调用View暴露的接口对视图进行操作,这样有利于把视图操作和业务逻辑分开来。MVP能够让Activity成为真正的View而不是View和Control的合体,Activity只做UI相关的事。但是这个模式还是存在一些不好的地方,比较如说:
1.Activity需要实现各种跟UI相关的接口,同时要在Activity中编写大量的事件,然后在事件处理中调用presenter的业务处理方法,View和Presenter只是互相持有引用并互相做回调,代码不美观。
2.这种模式中,程序的主角是UI,通过UI事件的触发对数据进行处理,更新UI就有考虑线程的问题。而且UI改变后牵扯的逻辑耦合度太高,一旦控件更改(比较TextView 替换 EditText等)牵扯的更新UI的接口就必须得换。复杂的业务同时会导致presenter层太大,代码臃肿的问题。
MVVM
View: 对应于Activity和xml,负责View的绘制以及与用户交互
Model: 实体模型
ViewModel: 负责完成View于Model间的交互,负责业务逻辑

MVVM的目标和思想MVP类似,利用数据绑定(Data Binding)、依赖属性(Dependency Property)、命令(Command)、路由事件(Routed Event)等新特性,打造了一个更加灵活高效的架构
数据驱动
在MVVM中,以前开发模式中必须先处理业务数据,然后根据的数据变化,去获取UI的引用然后更新UI,通过也是通过UI来获取用户输入,而在MVVM中,数据和业务逻辑处于一个独立的View Model中,ViewModel只要关注数据和业务逻辑,不需要和UI或者控件打交道。由数据自动去驱动UI去自动更新UI,UI的改变又同时自动反馈到数据,数据成为主导因素,这样使得在业务逻辑处理只要关心数据,方便而且简单很多。
低耦合度
MVVM模式中,数据是独立于UI的,ViewModel只负责处理和提供数据,UI想怎么处理数据都由UI自己决定,ViewModel 不涉及任何和UI相关的事也不持有UI控件的引用,即使控件改变(TextView 换成 EditText)ViewModel 几乎不需要更改任何代码,专注自己的数据处理就可以了,如果是MVP遇到UI更改,就可能需要改变获取UI的方式,改变更新UI的接口,改变从UI上获取输入的代码,可能还需要更改访问UI对象的属性代码等等。
更新 UI
在MVVM中,我们可以在工作线程中直接修改View Model的数据(只要数据是线程安全的),剩下的数据绑定框架帮你搞定,很多事情都不需要你去关心。团队协作MVVM的分工是非常明显的,由于View和View Model之间是松散耦合的。一个是处理业务和数据,一个是专门的UI处理。完全有两个人分工来做,一个做UI(xml 和 Activity)一个写ViewModel,效率更高。
可复用性
一个View Model复用到多个View中,同样的一份数据,用不同的UI去做展示,对于版本迭代频繁的UI改动,只要更换View层就行,对于如果想在UI上的做AbTest 更是方便的多。
单元测试
View Model里面是数据和业务逻辑,View中关注的是UI,这样的做测试是很方便的,完全没有彼此的依赖,不管是UI的单元测试还是业务逻辑的单元测试,都是低耦合的。

数据持久化的方法

数据持久化就是将内存中的数据模型转化为存储模型。
1、SharedPreferences
2、内部存储(例如通过openFileOutput()打开一个文件输入输出流)
3、SQLite Database
4、网络连接(将数据存储到服务器上)
5、外部存储(SD卡)

android动画

帧动画:也就是我们说的 Frame 动画。 Frame 动画是一系列图片按照一定的顺序展示的过程,和放电影的机制相似,它的原理是在一定的时间段内切换多张有细微差异的图片从而达到动画的效果。由于是一帧一帧加载,所以需要较多的图片。从而增大 APK 的大小,不过 Frame 动画可以实现一些比较难的效果,例如:等待的环形进度。 所涉及到的 Java 对象有: AnimationDrawable 。

补间动画:也就是 Tween 动画,是操作某一个控件让其展现出旋转、渐变、移动、缩放的一种转换过程。是一种视觉上的变化,不是真正位置上的变化。只能运用在 View 对象上,并且功能相对来说较为局限。例如:旋转动画只能够在 x 、 y 轴进行,而不能在 z 轴放心进行旋转。因此,补间动画通常用于执行一些比较简单的动画。 所涉及到的 Java 对象有: AlphaAnimation (渐变动画)、 ScaleAnimation (缩放动画)、 TranslateAnimation (位移动画)、 RotateAnimation (旋转动画)。

属性动画:是 Android 3.0 之后推出的,其机制不再是针对 View 来设计的,也不限于只能实现移动、缩放、旋转和淡入这几种简单的动画操作,同时也不再只是一种视觉上的动画效果。属性动画实际上是一种在一定时间段内不断修改某个对象的某个属性值的机制。 所涉及到的 Java 对象有: ValueAnimator 、 ObjectAnimator

android屏幕密度

px(像素):屏幕上的点。
in(英寸):长度单位。
mm(毫米):长度单位。
pt(磅):1/72英寸。
dp(与密度无关的像素):一种基于屏幕密度的抽象单位。在每英寸160点的显示器上,1dp = 1px。
dip:与dp相同,多用于android/ophone示例中。
sp(与刻度无关的像素):与dp类似,但是可以根据用户的字体大小首选项进行缩放。
分辨率:整个屏是多少点,比如800x480,它是对于软件来说的显示单位,以px为单位的点。
density(密度)值表示每英寸有多少个显示点,与分辨率是两个概念。apk的资源包中,
当屏幕density=240时使用hdpi标签的资源
当屏幕density=160时,使用mdpi标签的资源
当屏幕density=120时,使用ldpi标签的资源。
1pt=1/72in
1px = (density/160)dp
1sp=(density/160)dp

系统可能会弹出ANR对话框的情况

在Android上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程序无响应(ANR:Application Not Responding)对话框。用户可以选择“等待”而让程序继续运行,也可以选择“强制关闭”。
默认情况下,在android中Activity的最长执行时间是5秒,BroadcastReceiver的最长执行时间则是10秒。超出就会提示应用程序无响应(ANR:Application Not Responding)对话框
三种常见类型
1: KeyDispatchTimeout(5 seconds) – 主要类型
按键或触摸事件在特定时间内无响应
2 : BroadcastTimeout(10 seconds)
BroadcastReceiver在特定时间内无法处理完成
3: ServiceTimeout(20 seconds) – 小概率类型
Service在特定的时间内无法处理完成

事件分发

图解 Android 事件分发机制

Intent可以传递的类型

基本数据类型,Parcelable,Serializable ,Bundle

android布局优化

工具:hierarchyViewer,lint
尽量使用复合图片:一个线性布局中如果包含一个 ImageView 和 TextView,那么你可以使用复合图片来替换
去掉不需要的根节点:如果一个 FrameLayout是整个布局的根节点,并且他没有提供背景,留白之类的东西,可以使用 merge标签,merge删除多余的层级。
减少布局中的枝叶:一个布局没有子 View 或者背景,那么他可以被移除掉
减少父母层级:一个布局没有兄弟,并且他不是 ScrollView 或者根 View,并且也没有背景,那么他就可以直接被移除掉,他的孩子可以直接被移到他父母的层级下
避免过深的布局层级:多次嵌套的布局文件不利于性能,通过相对布局或者网格布局,默认的最深布局深度是10

同层级下LinearLayout和RelativeLayout性能比较

优先使用LinearLayout,因为RelativeLayout会让子View调用2次onMeasure,LinearLayout只有在有weight时才调用2次onMeasure

activity,view,window的关系

window是一个容器,存放view,view以树状结构组织起来。activity帮助管理window 参考

BroadcastReceiver的生命周期

BroadcastReceiver的生命周期从对象调用开始到onReceiver方法结束.
广播接收后会重新创建BroadcastReceiver对象,onReceiver执行完后销毁。不能在10秒内执行完会ANR。
BroadcaastReceiver执行耗时操作可以通过Intent启动Service完成,但不能绑定Service。

进程重要性

前台进程,可见进程,服务进程,后台进程,空进程

猜你喜欢

转载自blog.csdn.net/qq_31433525/article/details/79390400
今日推荐