IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> android准备 -> 正文阅读

[移动开发]android准备

1、生命周期

onCreate:在首次创建 Activity 时调用。系统向此方法传递一个 Bundle 对象,其中包含 Activity 的上一状态,不过前提是捕获了该状态,而后会调用onStart方法。(可以在此方法中执行所有正常的静态设置 ,比如:创建视图、将数据绑定到列表等等。)
onStart:在 Activity 即将对用户可见之前调用。而后如果Activity转入了前台就会调用onResume方法。 如果此时直接屏幕熄灭或者用户按下home键则会直接调用onStop方法,当然这种情况比较极端。
onResume:在 Activity 即将开始与用户进行交互之前调用。 此时,Activity 处于 Activity 堆栈的顶层,并具有用户输入焦点。当跳转另一个Activity,或者退出当前Activity后会调用onPause方法。
onPause:在系统即将开始继续另一个 Activity 时调用。 此方法通常用于确认对持久性数据的未保存更改、停止动画以及其他可能消耗 CPU 的内容,诸如此类。 它应该非常迅速地执行所需操作,因为它返回后,下一个 Activity 才能继续执行,所以不能执行耗时操作。而后正常情况下会调用onStop方法。但是有一种极端情况,就是如果这个时候快速让 当前Activity 返回前台,则会调用onResume方法。
onStop:在 Activity 对用户不再可见时调用。如果 Activity 被销毁,或另一个 Activity(一个现有 Activity 或新 Activity)继续执行并将其覆盖,就会调用此方法。而后如果 Activity 恢复与用户的交互,则会调用 onRestart 方法,如果 Activity 被销毁,则会调用onDestroy方法。
onRestart:在Activity被停止后再次启动时调用(即屏幕熄灭后再次回到app,按下home键后再次回到app),而后会调用onStart方法。
onDestroy:在 Activity 被销毁前调用,这是 Activity 收到的最后调用。 当 Activity 结束(对 Activity 调用了 finish 方法),或系统为节省空间而暂时销毁该 Activity 实例时,可能会调用它。 你可以通过 isFinishing 方法区分这两种情形。
2、

接下来看看关于事件分发的三个主要对象:

一个事件产生之后,都是先传给Activity,在传给ViewGroup,最后传给View,对比上面的例子,Activity对应的就是项目经理,viewGroup就是你的老大,而你就相当于view了;

三个重要方法:

这里要注意一点,Activity和View是没有onInterceptTouchEvent()也就是事件拦截这个方法的,仔细想想就可以想明白,Activity是处于分发机制的最顶端,如果一开始就吧事件拦截了,那么会导致整个屏幕都无法响应用户的操作,这就相当于一个项目里所有的事情都由你的项目经理一个人干了,这显然是不理智的;而view处于事件分发的最末端,它不需要拦截,事件分发到View的时候,view能处理就处理,不处理就返回给他的父控件;
————————————————
3、常见的.postDelayed(runnable, time)方法就是常见的延迟处理的方法之一,postDelayed(mRun,time);当想要需要取消的时候,调用removeCallbacks(mRun);即可,就可以取消postDelayed的方法里面的runnable,当然如果里面runnable已经执行了,那就不可能撤回或者中止了。
————————————————
4、

android有序广播和无序广播的区别?

BroadcastReceiver所对应的广播分两类:普通广播和有序广播。?

普通广播通过Context.sendBroadcast()方法来发送。它是完全异步的。?

所有的receivers接收器的执行顺序不确定。 ? ?因此,所有的receivers接收器接收broadcast的顺序不确定。?

这种方式效率更高。但是BroadcastReceiver无法使用setResult系列,getResult系列及abort系列API?

有序广播是通过Context.sendOrderedBroadcast来发送。所有的receiver依次执行。?

BroadcastReceiver可以使用setResult系列函数来结果传给下一个BroadcastReceiver,通过getResult系列函数来取得上个BroadcastReceiver返回的结果,并可以abort系列函数来让系统丢弃该广播让,使用该广播不再传送到别的BroadcastReceiver。?

可以通过在intent-filter中设置android:priority属性来设置receiver的优先级。优先级相同的receiver其执行顺序不确定。?

如果BroadcastReceiver是代码中注册的话,且其intent-filter拥有相同android:priority属性的话,先注册的将先收到广播。?

有序广播,即从优先级别最高的广播接收器开始接收,接收完了如果没有丢弃,就下传给下一个次高优先级别的广播接收器进行处理,依次类推,直到最后。?

5、

有序广播无序广播区别,被拦截后超时机制

  • 普通广播:只要intentFilter的action匹配,则会接收此广播
  • 有序广播:发送出去的广播被广播接收者按照按照Priority属性值大小先后顺序接收,先接受的receiver可以对广播进行修改和截断

这里的超时是指,Android系统(AMS)向一个广播接收器发送无序广播时,

并不需要等待该广播接收器返回结果,就会继续向下一个广播接收器发送广播。但是,当Android系统发送有序广播时,将会等待前一个广播接收器返回结果后(除非处理超时), 才会继续发送向下一个广播接收器发送广播。

6、

2.ListView 如何实现分页加载
① 设置 ListView 的滚动监听器:setOnScrollListener(new OnScrollListener{….})

在监听器中有两个方法:滚动状态发生变化的方法(onScrollStateChanged)和 listView 被滚动时调用的方法(onScroll)

② 在滚动状态发生改变的方法中,有三种状态:

手指按下移动的状态: SCROLL_STATE_TOUCH_SCROLL: // 触摸滑动
惯性滚动(滑翔(flgin)状态): SCROLL_STATE_FLING: // 滑翔
静止状态: SCROLL_STATE_IDLE: // 静止
————————————————
7、activityManager.getRunningTasks(1).get(0).topActivity获取前台应用

8、Fragment生命周期
onAttach(Contextcontext):在Fragment和Activity关联上的时候调用,且仅调用一次。在该回调中我们可以将context转化为Activity保存下来,从而避免后期频繁调用getAtivity()获取Activity的局面,避免了在某些情况下getAtivity()为空的异常(Activity和Fragment分离的情况下)。同时也可以在该回调中将传入的Arguments提取并解析,在这里强烈推荐通过setArguments给Fragment传参数,因为在应用被系统回收时Fragment不会保存相关属性。
onCreate:在最初创建Fragment的时候会调用,和Activity的onCreate类似。
View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState):在准备绘制Fragment界面时调用,返回值为Fragment要绘制布局的根视图,当然也可以返回null。注意使用inflater构建View时一定要将attachToRoot指明false,因为Fragment会自动将视图添加到container中,attachToRoot为true会重复添加报错。onCreateView并不是一定会被调用,当添加的是没有界面的Fragment就不会调用,比如调用FragmentTransaction的add(Fragment fragment, String tag)方法。
onActivityCreated :在Activity的onCreated执行完时会调用。
onStart() :Fragment对用户可见的时候调用,前提是Activity已经started。
onResume():Fragment和用户之前可交互时会调用,前提是Activity已经resumed。
onPause():Fragment和用户之前不可交互时会调用。
onStop():Fragment不可见时会调用。
onDestroyView():在移除Fragment相关视图层级时调用。
onDestroy():最终清楚Fragment状态时会调用。
onDetach():Fragment和Activity解除关联时调用。
————————————————
9、

TCP 的执行流程如下:

最开始时客户端和服务端都处于 CLOSED 状态,然后服务端先主动监听某个端口,此时服务器端就变成了 LISTEN(监听)状态;

然后客户端主动发起连接,发送 SYN(同步序列编号),此时客户端就变成了 SYN-SENT 状态;

服务端接收到信息之后返回 SYN 和 ACK 至客户端,此时服务器端就变成了 SYN-REVD 状态;

客户端接收到消息之后,再发送 ACK 至服务器端,此时客户端就变成了 ESTABLISHED(已确认)状态,服务端收到 ACK 之后,也变成了 ESTABLISHED 状态,此时连接工作就执行完了。

为什么 TCP 需要三次握手?

原因一:防止重复连接:三次握手的主要原因是为了防止旧的重复连接引起连接混乱问题

比如在网络状况比较复杂或者网络状况比较差的情况下,发送方可能会连续发送多次建立连接的请求。如果 TCP 握手的次数只有两次,那么接收方只能选择接受请求或者拒绝接受请求,但它并不清楚这次的请求是正常的请求,还是由于网络环境问题而导致的过期请求,如果是过期请求的话就会造成错误的连接。

所以如果 TCP 是三次握手的话,那么客户端在接收到服务器端 SEQ+1 的消息之后,就可以判断当前的连接是否为历史连接,如果判断为历史连接的话就会发送终止报文(RST)给服务器端终止连接;如果判断当前连接不是历史连接的话就会发送指令给服务器端来建立连接。
————————————————
10、

Fragment与Activity之间是如何传值的
一、Activity给fragment传值
1、setArguments(),传入Bundle对象,使用getArguments()获取
2、getFragmentManager.fingFragmentByTag()或findFragmentById获得fragment。在addFragment和replace是可将Tag传入,id为xml布局中占位控件FrameLyout的id。

二、Fragment向Activity传值:
1、通过回调的方式设置,activity实现接口
2、通过getActivity获取到activity。防止activity为空的情况可以在onAttach(Activity context)方法中保存一份Activity的实例,此方法已被标记过时,用onAttach(Context context)代替。

三、Fragment与Frament之间传值:
1、通过接口回调;
2、通过Activity获取到getSupportFragmentManager进而获取到fragment。
————————————————
11、

ViewPager对Fragment生命周期的影响
ViewPager+Fragment是比较常见的组合了,一般搭配ViewPager的FragmentPagerAdapter或FragmentStatePagerAdapter使用。不过ViewPager为了防止滑动出现卡顿,有一个缓存机制,默认情况下ViewPager会创建并缓存当前页面左右两边的页面(如Fragment)。此时左右两个Fragment都会执行从onAttach->….->onResume的生命周期,明明Fragment没有显示却已经到onResume了,在某些情况下会出现问题。比如数据的加载时机、判断Fragment是否可见等。
————————————————
?

12、

ANR 是什么?怎样避免和解决 ANR(重要)
在 Android 上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程序无响应(ANR:Application Not Responding)对话框。用户可以选择让程序继续运行,但是,他们在使用你的应用程序时,并不希望每次都要处理这个对话框。因此,在程序里对响应性能的设计很重要,这样,系统不会显示 ANR 给用户。

ANR 一般有三种类型:
1:KeyDispatchTimeout(5 seconds) --主要类型:按键或触摸事件在特定时间内无响应
2:BroadcastTimeout(10 seconds):BroadcastReceiver 在特定时间内无法处理完成
3:ServiceTimeout(20 seconds) --小概率类型:Service 在特定的时间内无法处理完成
超时的原因一般有两种:
(1)当前的事件没有机会得到处理(UI 线程正在处理前一个事件没有及时完成或者 looper 被某种原因阻塞住)

(2)当前的事件正在处理,但没有及时完成UI 线程尽量只做跟 UI 相关的工作,耗时的工作(数据库操作,I/O,连接网络或者其他可能阻碍 UI线程的操作)放入单独的线程处理,尽量用 Handler 来处理 UI thread 和 thread 之间的交互。
————————————————
13、

Fragment的replace、add、remove,add配合show和hide

14、

每个线程里只能有唯一的looper和与之绑定的message queue, looper不断的从message queue里取message,扔给handler的handleMessage处理。

我又问:looper取出来的message怎么知道扔给哪个handler呢?

小张:handler在sendMessage时,message会设置其target属性指向发送的handler对象,所以取出来时就知道扔给哪个handler处理了。

15、UI线程和非UI线程的交互方式

一般应该把像读写文件、请求网络这类的耗时操作放在子线程中去执行,这样可以避免UI线程的响应事件过慢,但是很多情况下在子线程中需要更新界面,比如从网络中获取到图片或者响应字符串后,将结果显示到界面上,但是在子线程中不允许直接更新UI界面,这时就需要在子线程中将结果返回给UI线程,由UI线程来负责更新界面元素,Android提供了几种方式用于处理UI线程和非UI线程之间的交互
————————————————

  • Handler? 线程安全:

    MessageQueue的message入队方法,看到synchronized关键字没有,就是她了:

  • Activity.runOnUiThread(Runnable runnable)
  • View.post(Runnable runnable)
  • View.postDelay(Runnable runnable, long daly)
  • AsyncTask
  • View.post将操作post到主线程的事件队列中,其中的代码都是在主线程中执行的,可以直接使用View对象来调用

Handler是最经常被用于子线程和主线程之间的交互方式,使用方式也很简单,在主线程中新建Handler,在子线程中通过Handler将数据通过Message发送给主线程,主线程负责更新UI界面

16、SimpleDateFormat的线程安全问题

在实际项目中,我们经常需要将日期在String和Date之间做转化,此时需要使用SimpleDateFormat类。使用SimpleDateFormat类的parse方法,可以将满足格式要求的字符串转换成Date对象,使用SimpleDateFormat类的format方法,可以将Date类型的对象转换成一定格式的字符串!
?

SimpleDateFormat转换日期是通过Calendar对象来操作的,在parse方法的最后,会调用CalendarBuilder的establish方法,入参就是SimpleDateFormat维护的Calendar实例,在establish方法中会调用calendar的clear方法,如果此时线程A将calendar清空且没有设置新值,线程B也进入parse方法用到了SimpleDateFormat对象中的calendar对象,此时就会产生线程安全问题!

每一个使用SimpleDateFormat对象进行日期-时间进行format和parse方法的时候就创建一个新的SimpleDateFormat对象,用完就销毁即可!

17、饿汉式:
对象预先加载,线程是安全的,在类创建好的同时对象生成,调用获得对象实例的方法反应速度快,代码简练。(声明对象同时实例化)在饿汉式中在该类的方法getInstance被调用之前,该类的对象已经存在,假设有两个线程(t1,t2)在调用该方法,t1与t2无论怎样调用都不会产生新的对象,因为该对象在方法调用之前就存在了,是伴随类的生成而生成的。
懒汉式:
对象延迟加载,效率高,只有在使用的时候才实例化对象,但若设计不当线程会不安全,代码相对于饿汉式复杂,第一次加载类对象的时候反应不快。

懒汉式 私有实例要加上volatile,防止jvm 重排序 导致空指针

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-08-21 15:35:19  更:2021-08-21 15:37:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年6日历 -2024/6/19 5:12:44-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码