standard和singleTop模式。这两种比较简单。创建Activity放入当前的任务栈中,若当前是singleInstace,则放入设置的任务栈中。其中如果Activity在栈顶,则调用onNewIntent。
singletask:栈内复用模式。不是在当前任务栈中查找是否存在,实际过程如下:
查找该Activity所需的任务栈是否存在(由taskAffinity控制,或者默认为包名)。
在任务栈当中查找该Activity是否存在。这里面存在任务栈的切换,也就是当开启的singtask类型的Activity不属于当前任务栈时,则会切换到其任务栈。
singleInstance:单实例模式。包含了singleTask的所有特性,另外加上:设置为该模式的Activity,只能单独存在于一个任务栈中。当有两个singleInstace的Activity设置成同样的任务栈时,会出现两个同名的任务栈,分别用来存放同名的Activity。注:在任何跳转的时候,首先调用本Activity的onPause,然后跳转。如果被跳转的activity由于启动方式而没创建新的实例,则会先调用onNewIntent,然后按照正常的生命周期调用。如1:A→B,A:onPause;B:onCreate,onStart,onResume。2:A(singleTop)→A,A:onPause;A:onSaveInstanceState;A:onResume。
Android 服务两种启动方式的区别 - 简书 https://www.jianshu.com/p/2fb6eb14fdec
Android 两种注册、发送广播的区别 - 简书 https://www.jianshu.com/p/ea5e233d9f43
//new出上边定义好的BroadcastReceiver
MyBroadCastReceiver yBroadCastReceiver = new MyBroadCastReceiver();
//实例化过滤器并设置要过滤的广播
IntentFilter intentFilter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
//注册广播
myContext.registerReceiver(smsBroadCastReceiver,intentFilter,
"android.permission.RECEIVE_SMS", null);
<receiver android:name=".MyBroadCastReceiver">
<intent-filter android:priority="20">
<actionandroid:name="android.provider.Telephony.SMS_RECEIVED"/>
intent-filter>
receiver>
还要在同级的位置配置可能使用到的权限
<uses-permission android:name="android.permission.RECEIVE_SMS">
uses-permission>
1.测量:onMeasure()决定View的大小,;
2.布局:onLayout()决定View在ViewGroup中的位置;
3.绘制:onDraw()决定绘制这个View,分为6个步骤:(1)绘制视图的背景(2)保存画布的图层(3)绘制View的内容(4)绘制View子视图,如果没有就不用(5)还原图层(6)绘制滚动条。
自定义View的步骤:
自定义View的属性;
在View的构造方法中获得自定义的属性;
重写onMeasure(); –> 并不是必须的,大部分的时候还需要覆写
重写onDraw();
出现问题,肯定看错误日志,如果是本地调试出来的错误,可以直接看logcat,定位到报错代码的类,如果是一些简单的错误如:空指针异常,数组越界,io异常等等的话 一般是能够定位到报错的哪一行,根据逻辑进行调整就可以了;第一种情况很好解决问题,比较难搞的问题都是不会报出是哪一个类或者哪一行出现错误,而是直接报错,这时候就得根据报错的具体情况具体分析了,比如报出内存溢出的问题,一般都是在哪个地方去不停的去创建新的对象了,这时候就需要分析哪些地方做了重复的创建了。一般这个时候需要借助 debug调试或者打印log的方式进行错误排查。目前来说想到的就这两点,在现实中还有很多方式,比如单元测试进行部分逻辑的处理也是避免出现问题的方法
屏幕适配就是使某一元素Android不同的尺寸、不同的分辨率上显示相同的效果
根据这个图,总结一下 :编写布局的时候,最好使用相对布局,它可以设置固定位置,灵活性强,查询显示的布局判断是否是单面板还是双面板,利用限定符进入单布局或者双布局,设置宽高属性最好使用wrap_content,match_parent,权重weight来设置,使用.9.png特殊处理过图片格式,可以自动拉伸,图片资源放到xxhdpi文件中,因为这个文件分辨率是1080X1920,符合大部分的手机设备,属性 大小使用dp和sp,谷歌出 了一个屏幕适配百分比框架,可根据情况依赖进行使用。
注重说明以下:对代码进行混淆,就是为了防止被反编译,泄露代码机密,AS自身集成了Java中的ProGuard作为压缩,修改bulid.gradle中的minifyEnabled为true开启混淆,之后在moudle目录下照到proguard-rules.pro文件,现在混淆规则已经基本完善,从网上复制进去就可以了,混淆并不是把你的代码弄成乱码,而是把重要的代码避免被混淆
当他们结合使用的时候,所需要的适配器并不是PagerAdapter,而是另外官方提供的FragmentPagerAdapter和FragmentStateAdapter,可以实现滑动效果,并且点击切换的时候也有,说明一下,一个是适用于显示fragment数量较少,另一个是显示fragment数量较多的时候使用。
对于性能优化这方面,不管在任何时刻,都是比较常问的问题,先来说一下Listview:
1.在适配器getView()方法中尽量少写逻辑处理
2.不要再Viewholder类以外方法中创建对象,避免触发GC机制
3.在加载图片的时候,需要显示网络上加载的图片,那么要监听ListView滑动的时候,停止加载图片,滑动停止后再加载图片
4.将ListView的scrollingCache和animateCache设置为false,scrollingCache耗内存,默认开始,所以需要关闭掉,还有animateCache,会消耗大量的内存,会频繁调用GC,可以手动关闭掉
5.使用ViewHolder类
6.convertView的复用机制
7.使用分页加载功能,为了防止数据过多,出现OOM的异常
再来看一下GridView:
不说了,基本上是相同的,除了自带的属性
1.Android 中的控件都是直接或者间接继承View的,Viewgroup也是继承View的,ViewGroup中可以包含View,也可以包含ViewGroup,我们平时接触的譬如说LinearLayout啊、RelativeLayout就是ViewGroup的子类。
2.Android中触摸事件的传递是先传递到ViewGroup,再传递View中,用Button举个列子来说明下大致流程
3.当点击Button的时候,会调用这个控件所在布局的dispatchTouchEvent(),然后在这个布局中dispatchTouchEvent()方法中找到被点击控件的dispatchTouchEvent()方法。
4.在调用被点击控件的dispatchTouchEvent()方法之前会有一次触摸事件的拦截判断,如果触摸事件被拦截了,就不会再去执行被点击控件的dispatchTouchEvent函数了,也就不会再执行onClick点击事件了。而是执行ViewGroup控件中的dispatchTouchEvent()的onTouch触摸事件然后返回。
5.如果触摸事件没被拦截的话又是怎么做呢,就会ViewGroup中dispatchTouchEvent()方法中被点击控件的dispatchTouchEvent()方法,就不会执行ViewGroup中的onTouch方法了。
6.以上只是阐述了touch事件在ViewGroup中和View中的事件分发过程,但是具体得在一个View中的touch事件分发机制又是怎么样的呢,我们继续往下看
7.android里面当触摸到任何一个控件的时候就一定会调用这个控件的dispatchTouchEvent方法。dispatchTouchEvent方法中的源码首先会调用onTouch方法,不过这个方法要执行的话也需要有两个前提条件,一个是这个控件注册了触摸监听、第二个是这个控件的状态要是enabled的。
8.执行完onTouch方法之后,会有一个返回值,如果返回这为true的话代表这个点击事件不继续往下传递了,为false的话就表示点击事件继续往下传递,就会执行onTouchEvent方法,onClick方法就是在onTouchEvent中被调用的。
9.这样的话一个控件的触摸事件在ViewGroup以及View中的分发过程就完成了。
推荐博客:https://blog.csdn.net/m0_37711172/article/details/79975225
推荐博客:https://blog.csdn.net/m0_37711172/article/details/79924640
1.帧动画,AniimalDrawber,通过顺序的播放排列好的图片来实现
2.补件动画,可以使视图组件移动、放大、缩小以及产生透明度的变化,补件动画只能用在View上,只能实现移动、缩放、旋转和淡入淡出这四种动画操作
3.只是改变了View的显示效果而已,而不会真正去改变View的属性
3.属性动画,全新的动画模式,功能很强大,弥补了之前补件动画的位置不变的缺陷,完全可以取代补件动画,更改的时控件的属性
就是一句话,如果代码逻辑写在View中,就是MVC,没有就是MVP,MVP模式逻辑都写再P中,而MVC中逻辑写在V中,比如当你点击Buttton的时候,button点击监听的时候,业务逻辑如果写再里面那就是MVC模式
1.MVP模式,View不直接和Model交互,而是通过与Presenter交互来与Model间接交互,Presenter与View的交互是通过接口来进行的更加有利于单元测试,通过VIew与Presenter是一对一的,但复杂的View可能绑定多个Presenter来处理逻辑
2.MVC模式,View可以与Model直接交互,Controoller是基于行为的,并且可以被多个View共享,可以负责决定哪个View
1,支持http,https请求
2,支持文件下载
3,支持get,post请求
4,基于http的文件上传
1,封装麻烦
2,callback是在子线程里面,不能刷新ui,需要手动处理