前言

写在前面:首先是不一次性放出来的原因:资料来之不易,希望大家好好珍惜,每天花一段时间细细的消化这些题目,其次希望大家在阅读题目的时候最好跟着书或者代码一起阅读、一起敲,做到熟稔于心,信手拈来,这样面试的时候才能展现你最自信的一面。

1、RecyclerView和ListView的区别(这个是必问的)

答案:

RecyclerView可以完成ListView,GridView的效果,还可以完成瀑布流的效果。同时还可以设置列表的滚动方向(垂直或者水平); RecyclerView中view的复用不需要开发者自己写代码,系统已经帮封装完成了。 RecyclerView可以进行局部刷新。 RecyclerView提供了API来实现item的动画效果。

在性能上: 如果需要频繁的刷新数据,需要添加动画,则RecyclerView有较大的优势。 如果只是作为列表展示,则两者区别并不是很大。

2、Android 四大组件是什么?

答案:

Activity【活动】:用于表现功能。
Service【服务】:后台运行服务,不提供界面呈现。 BroadcastReceiver【广播接收器】:用来接收广播。 Content Provider【内容提供商】:支持在多个应用中存储和读取数据,相当于数据库。

3、两个Activity 之间跳转时必然会执行的是哪几个方法?

答案:

首先定义两个Activity,分别为A和B。

当我们在A中激活B时,A调用onPause()方法,此时B出现在屏幕时,B调用onCreate()、onStart()、onResume()。

这个时候B【B不是一个透明的窗体或对话框的形式】已经覆盖了A的窗体,A会调用onStop()方法。

4、介绍下实现一个自定义View的基本流程

答案:

①.自定义View的属性 编写attr.xml文件 ②.在layout布局文件中引用,同时引用命名空间 ③.在View的构造方法中获得我们自定义的属性 ,在自定义控件中进行读取(构造方法拿到attr.xml文件值) ④.重写onMesure ⑥.重写onDraw。

5、Android 四个组件的生命周期?

答案:

Activity生命周期图及Fragment生命周期图


Service的生命周期:首先Service有两种启动方式,而在这两种启动方式下,它的生命周期不同。

通过startService()方法启动的服务

初始化结束后系统会调用 void onStart(Intent intent) 方法,用于处理传递给startService()的Intent对象。如音乐服务会打开Intent 来探明将要播放哪首音乐,并开始播放。注意:多次调用startService()方法会多次触发onStart()方法。

通过bindService ()方法启动的服务

初始化结束后系统会调用 IBinder onBind(Intent intent) 方法,用来绑定传递给bindService 的Intent

6、Activity的四种启动模式对比?

答案:

Standard:标准的启动模式,如果需要启动一个activity就会创建该activity的实例。也是activity的默认启动模式。 SingeTop:如果启动的activity已经位于栈顶,那么就不会重新创建一个新的activity实例。而是复用位于栈顶的activity实例对象。如果不位于栈顶仍旧会重新创建activity的实例对象。 SingleTask:设置了singleTask启动模式的activity在启动时,如果位于activity栈中,就会复用该activity,这样的话,在该实例之上的所有activity都依次进行出栈操作,即执行对应的onDestroy()方法,直到当前要启动的activity位于栈顶。一般应用在网页的图集,一键退出当前的应用程序。 singleInstance:如果使用singleInstance启动模式的activity在启动的时候会复用已经存在的activity实例。不管这个activity的实例是位于哪一个应用当中,都会共享已经启动的activity的实例对象。使用了singlestance的启动模式的activity会单独的开启一个共享栈,这个栈中只存在当前的activity实例对象。

7、Activity在有Dialog时按Home键的生命周期?

答案:

当我们的Activity上弹出Dialog对话框时,程序的生命周期依然是onCreate() —> onStart() —> onResume(),在弹出Dialog的时候并没有onPause()和onStop()方法。而在此时我们按下Home键,才会继续执行onPause()和onStop()方法。这说明对话框并没有使Activity进入后台,而是在点击了Home键后Activity才进入后台工作。

原因就是,其实Dialog是Activity的一个组件,此时Activity并不是不可见,而是被Dialog组件覆盖了其他的组件,此时我们无法对其他组件进行操作而已。

8、Android Handler消息机制?

答案:

作用:

跨线程通信。当子线程中进行耗时操作后需要更新UI时,通过Handler将有关UI的操作切换到主线程中执行。

四要素: Message(消息):需要被传递的消息,其中包含了消息ID,消息处理对象以及处理的数据等,由MessageQueue统一列队,最终由Handler处理。 MessageQueue(消息队列):用来存放Handler发送过来的消息,内部通过单链表的数据结构来维护消息列表,等待Looper的抽取。 Handler(处理者):负责Message的发送及处理。通过 Handler.sendMessage() 向消息池发送各种消息事件;通过 Handler.handleMessage() 处理相应的消息事件。 Looper(消息泵):通过Looper.loop()不断地从MessageQueue中抽取Message,按分发机制将消息分发给目标处理者。

Handler.sendMessage()发送消息时,会通过MessageQueue.enqueueMessage()向MessageQueue中添加一条消息; 通过Looper.loop()开启循环后,不断轮询调用MessageQueue.next(); 调用目标Handler.dispatchMessage()去传递消息,目标Handler收到消息后调用Handler.handlerMessage()处理消息。

9、内存泄漏和内存溢出是什么?一般怎么处理内存泄漏?

答案:

(1)内存溢出(OOM)和内存泄露(对象无法被回收)的区别。 (2)引起内存泄露的原因 (3)内存泄露检测工具 ------>LeakCanary

内存溢出 out of memory:是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。内存溢出通俗的讲就是内存不够用。

内存泄露 memory leak:是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光

内存泄露原因以及解决: 一、Handler 引起的内存泄漏。 解决:将Handler声明为静态内部类,就不会持有外部类SecondActivity的引用,其生命周期就和外部类无关, 如果Handler里面需要context的话,可以通过弱引用方式引用外部类 二、单例模式引起的内存泄漏。 解决:Context是ApplicationContext,由于ApplicationContext的生命周期是和app一致的,不会导致内存泄漏 三、非静态内部类创建静态实例引起的内存泄漏。 解决:把内部类修改为静态的就可以避免内存泄漏了 四、非静态匿名内部类引起的内存泄漏。 解决:将匿名内部类设置为静态的。 五、注册/反注册未成对使用引起的内存泄漏。 注册广播接受器、EventBus等,记得解绑。 六、资源对象没有关闭引起的内存泄漏。 在这些资源不使用的时候,记得调用相应的类似close()、destroy()、recycler()、release()等方法释放。 七、集合对象没有及时清理引起的内存泄漏。 通常会把一些对象装入到集合中,当不使用的时候一定要记得及时清理集合,让相关对象不再被引用。

10、ANR是什么?怎样避免和解决ANR

答案:

Application Not Responding,即应用无响应

出现的原因有三种: a)KeyDispatchTimeout(5 seconds)主要类型按键或触摸事件在特定时间内无响应 b)BroadcastTimeout(10 seconds)BoradcastReceiver在特定的时间内无法处理 c)ServiceTimeout(20 seconds)小概率类型Service在特定的时间内无法处理完成

避免ANR最核心的一点就是在主线程减少耗时操作。通常需要从那个以下几个方案下手: a)使用子线程处理耗时IO操作 b)降低子线程优先级,使用Thread或者HandlerThread时,调用Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND)设置优先级,否则仍然会降低程序响应,因为默认Thread的优先级和主线程相同 c)使用Handler处理子线程结果,而不是使用Thread.wait()或者Thread.sleep()来阻塞主线程 d)Activity的onCreate和onResume回调中尽量避免耗时的代码 e)BroadcastReceiver中onReceiver代码也要尽量减少耗时操作,建议使用intentService处理。intentService是一个异步的,会自动停止的服务,很好解决了传统的Service中处理完耗时操作忘记停止并销毁Service的问题。

11、Android Touch事件传递机制

答案:

在我们点击屏幕时,会有下列事件发生: Activity调用dispathTouchEvent()方法,把事件传递给Window; Window再将事件交给DecorView(DecorView是View的根布局); DecorView再传递给ViewGroup;

Activity ——> Window ——> DecorView ——> ViewGroup——> View

事件分发的主要有三个关键方法 dispatchTouchEvent() 分发 onInterceptTouchEvent() 拦截 ,只有ViewGroup独有此方法 onTouchEvent() 处理触摸事件

Activity首先调用dispathTouchEvent()进行分发,接着调用super向下传递

ViewGroup首先调用dispathTouchEvent()进行分发,接着会调用onInterceptTouchEvent()(拦截事件)。若拦截事件返回为true,表示拦截,事件不会向下层的ViewGroup或者View传递;false,表示不拦截,继续分发事件。默认是false,需要提醒一下,View是没有onInterceptTouchEvent()方法的

事件在ViewGroup和ViewGroup、ViewGroup和View之间进行传递,最终到达View;

View调用dispathTouchEvent()方法,然后在OnTouchEvent()进行处理事件;OnTouchEvent() 返回true,表示消耗此事件,不再向下传递;返回false,表示不消耗事件,交回上层处理。

12、前台切换到后台,然后再回到前台,Activity生命周期回调方法。弹出Dialog,生命值周期回调方法?

答案:

首先定义两个Activity,分别为A和B。

完整顺序为:A调用onCreate()方法 —> onStart()方法 —> onResume()方法。当A启动B时,A调用onPause()方法,然后调用新的Activity B,此时调用onCreate()方法 —> onStart()方法 —> onResume()方法将新Activity激活。之后A再调用onStop()方法。当A再次回到前台时,B调用onPause()方法,A调用onRestart()方法 —> onStart()方法 —> onResume()方法,最后调用B的onStop()方法 —> onDestory()方法。

弹出Dialog时,调用onCreate()方法 —> onStart()方法 —> onResume()方法。

13、fragment各种情况下的生命周期?

答案:

由于Fragment的生命周期与Activity的生命周期有着牵扯,所以把两者的图放到一起作为对比理解。

接下来就不同情况下的Fragment生命周期做一简单介绍:

Fragment在Activity中replace 新替换的Activity:onAttach() —> onCreate() —> onCreatView() —> onViewCreated —> onActivityCreated() —> onStart —>onResume()

被替换的Activity:onPause() —> onStop() —> onDestoryView() —> onDestory() —> onDetach()

Fragment在Activity中replace,并addToBackStack 新替换的Fragment(没有在BackStack中):onAttach > onCreate > onCreateView > onViewCreated > onActivityCreated > onStart > onResume

新替换的Fragment(已经在BackStack中):onCreateView > onViewCreated > onActivityCreated > onStart > onResume

被替换的Fragment:onPause > onStop > onDestroyView

Fragment在ViewPager中切换 我们称切换前的的Fragment称为PreviousFragment,简称PF;切换后的Fragment称为NextFragment,简称NF;其他Fragment称为OtherFragment,简称OF。

(在ViewPager中setUserVisibleHint能反映出Fragment是否被切换到后台或前台,所以在这里也当作生命周期)

如果相关的Fragment没有被加载过: NF: setUserVisibleHint(false)【用户不可见】 > onAttach > onCreate > setUserVisibleHint(true)【用户可见】 > onCreateView > onViewCreated > onActivityCreated > onStart > onResume

OF跟NF相邻: setUserVisibleHint(false) > onAttach > onCreate > onCreateView > onViewCreated > onActivityCreated > onStart > onResume

如果相关的Fragment已经被加载过: NF跟PF相邻 :setUserVisibleHint(true)

NF跟PF不相邻:setUserVisibleHint(true) > onCreateView > onViewCreated > onActivityCreated > onStart > onResume

PF跟NF相邻 :setUserVisibleHint(false)

PF跟NF不相邻:setUserVisibleHint(false) > onPause > onStop > onDestroyView

OF跟PF相邻:onPause > onStop > onDestroyView

OF跟NF相邻:onCreateView > onViewCreated > onActivityCreated > onStart > onResume

OF夹在PF和NF中间:不调用任何生命周期方法

NF跟PF相邻 :setUserVisibleHint(true)

NF跟PF不相邻:setUserVisibleHint(true) > onCreateView > onViewCreated > onActivityCreated > onStart > onResume

PF跟NF相邻 :setUserVisibleHint(false)

PF跟NF不相邻:setUserVisibleHint(false) > onPause > onStop > onDestroyView

OF跟PF相邻:onPause > onStop > onDestroyView

OF跟NF相邻:onCreateView > onViewCreated > onActivityCreated > onStart > onResume

OF夹在PF和NF中间:不调用任何生命周期方法

如果重写了FragmentPagerAdapter的DestroyItem方法,并且相关的Fragment已经加载过: 相互切换时只会调用setUserVisibleHint

Fragment进入了运行状态: Fragment在进入运行状态时,以下四个生命周期会随它所属的Activity一起被调用:

onPause() —> onStop() —> onStart() —> onResume()

关于Fragment的onActivityResult方法: 使用Fragment的startActivity方法时,FragmentActivity的onActivityResult方法会回调相应的Fragment的onActivityResult方法,所以在重写FragmentActivity的onActivityResult方法时,注意调用super.onActivityResult。

14、Android异步消息处理机制(这个也会经常问到)

异步消息处理机制主要是用来解决子线程更新UI的问题

主要有四个部分: ①. Message (消息) 在线程之间传递,可在内部携带少量信息,用于不同线程之间交换数据 可以使用what、arg1、arg2字段携带整型数据 obj字段携带Object对象 ②. Handler (处理者) 主要用于发送和处理消息,sendMessage()用来发送消息,最终会回到handleMessage()进行处理 ③. MessageQueue (消息队列) 主要存放所有通过Handler发送的消息,它们会一直存在于队列中等待被处理 每个线程只有一个MessageQueue ④. Looper (循环器) 调用loop()方法后,会不断从MessageQueue 取出待处理的消息,然后传递到handleMessage进行处理。

15、熟悉哪些设计模式?

答案:

按照自己的实际情况回答,当然是越多越好。比如我自己也就熟悉个单例模式。

16、图片加载框架有哪些?他们之间的区别是什么?(这个也是必问的)

答案:

ImageLoader : 优点: ① 支持下载进度监听; ② 可以在 View 滚动中暂停图片加载; ③ 默认实现多种内存缓存算法这几个图片缓存都可以配置缓存算法,不过 ImageLoader 默认实现了较多缓存算法,如 Size 最大先删除、使用最少先删除、最近最少使用、先进先删除、时间最长先删除等; ④ 支持本地缓存文件名规则定义; 缺点: 缺点在于不支持GIF图片加载, 缓存机制没有和http的缓存很好的结合, 完全是自己的一套缓存机制

Picasso: 优点: ① 自带统计监控功能,支持图片缓存使用的监控,包括缓存命中率、已使用内存大小、节省的流量等。 ② 支持优先级处理 ③ 支持延迟到图片尺寸计算完成加载 ④ 支持飞行模式、并发线程数根据网络类型而变,手机切换到飞行模式或网络类型变换时会自动调整线程池最大并发数。 ⑤ “无”本地缓存。Picasso 自己没有实现本地缓存,而由okhttp 去实现,这样的好处是可以通过请求 Response Header 中的 Cache-Control 及 Expired 控制图片的过期时间。 缺点: 于不支持GIF,默认使用ARGB_8888格式缓存图片,缓存体积大。

Glide: 优点: ① 图片缓存->媒体缓存 ,支持 Gif、WebP、缩略图。甚至是 Video。 ② 支持优先级处理 ③ 与 Activity/Fragment 生命周期一致,支持 trimMemory ④ 支持 okhttp、Volley。Glide 默认通过 UrlConnection 获取数据,可以配合 okhttp 或是 Volley 使用。实际 ImageLoader、Picasso 也都支持 okhttp、Volley。 ⑤ 内存友好,内存缓存更小图片,图片默认使用默认 RGB565 而不是 ARGB888 缺点: 清晰度差,但可以设置

Fresco: 优点:① 图片存储在安卓系统的匿名共享内存, 而不是虚拟机的堆内存中,所以不会因为图片加载而导致oom, 同时也减少垃圾回收器频繁调用回收Bitmap导致的界面卡顿,性能更高. ② 渐进式加载JPEG图片, 支持图片从模糊到清晰加载 ③ 图片可以以任意的中心点显示在ImageView, 而不仅仅是图片的中心. ④ JPEG图片改变大小也是在native进行的, 不是在虚拟机的堆内存, 同样减少OOM ⑤ 很好的支持GIF图片的显示 缺点: 框架较大, 影响Apk体积,使用较繁琐。

17、Android 三级缓存?

答案:

网络加载,不优先加载,速度慢,浪费流量 本地缓存,次优先加载,速度快 内存缓存,优先加载,速度最快 首次加载Android App时,肯定要通过网络交互来获取图片,之后我们可以将图片保存至本地SD卡和内存中,之后运行APP时,优先访问内存中的图片缓存,若内存中没有,则加载本地SD卡中图片,最后选择访问网络。

18、Android Handler四大组件?

答案:

Message

Message是在线程之间传递的消息,它可以在内部携带少量的信息,用于在不同线程之间交换数据。 例:Message的what字段、arg1字段、arg2字段来携带整型数据,obj字段携带一个Object对象。

Handler

处理者,它主要用来发送和处理消息。发送消息一般是使用Handler的sendMessage()方法,消息经过处理后,最终传递到Handler的handlerMessage()方法中。

MessageQueue

消息队列,它主要用来存放所有通过Handler发送的消息,这部分消息会一直存在于消息队列中,等待被处理。注意:每个线程中只会有一个MessageQueue对象。

Looper

是每个线程中MessageQueue的管家,调用Looper的loop()方法后,就会进入到一个无限循环当中,每当发现MessageQueue中存在一条消息,就会将其取出传递到Handler的handleMessage()方法当中。

注意:每个线程中只会有一个Looper对象。

异步消息处理流程:

  1. 在主线程当中创建一个Handler对象;
  2. 重写handleMessage()方法;
  3. 当子线程需要进行UI操作时,创建一个Message对象,并通过Handler将消息发送出去;
  4. 消息添加到MessageQueue的队列中等待被处理;
  5. Looper在MessageQueue中取出待处理消息,发回Handler的handleMessage()方法中。

【由于Handler是在主线程中创建的,因此我们的handleMessage()方法中的代码也会在主线程中执行,避免了异常的产生】。

19、Android 广播的分类?

答案:

有序广播和无序广播两类。

无序广播发送代码:

public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}public void click(View v){//启动界面 startActivity//发送广播 sendBroadcastIntent intent = new Intent();intent.setAction("com.itheima.cctv.action.NEWS");   intent.putExtra("data", "我是一个无须的广播");sendBroadcast(intent);  }}
}

无序广播的监听代码:

public class CctvReceiver extends BroadcastReceiver {private static final String TAG = "CctvReceiver";@Overridepublic void onReceive(Context context, Intent intent) {String data = intent.getStringExtra("data");Log.d(TAG, "data==="+data);}
}<receiver android:name="com.itheima.cctv.CctvReceiver"><intent-filter ><!--这里监听的广播就是上面发送广播设置的                  intent.setAction("com.itheima.cctv.action.NEWS");--><action android:name="com.itheima.cctv.action.NEWS"/></intent-filter>
</receiver>

有序广播发送:

public class ShengReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {Log.d("vivi", "我是省级部门,我收到的指令是:"+getResultData());//getResultData()是用来获取有序广播里面的数值.这里的信息是://主席讲话:每人奖励10斤土豆setResultData("主席讲话:每人奖励7斤土豆");//有序广播的数值,可以被修改,后面的程序在接受到这个广播,就会变成,现在我们改变的值了//有序广播传输是可以终止的.但是最终的接受者就算在终止之后,也是可以接受到数据的//abortBroadcast();}}public class ShiReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {Log.d("vivi", "我是市级部门,我收到的指令是:"+getResultData());//因为上面修改了数据,所以这里获取到的数据是:主席讲话:每人奖励7斤土豆}
}
<!--有序广播的优先级别使用 android:priority=""来指定,最高是1000,最低是-1000-->
<receiver android:name="com.itheima.region.ShengReceiver"><intent-filter android:priority="1000"><action android:name="com.itheima.gov.action.POTATO"/></intent-filter></receiver><receiver android:name="com.itheima.region.ShiReceiver"><intent-filter android:priority="500"><action android:name="com.itheima.gov.action.POTATO"/></intent-filter></receiver>

有序接收:

public class MyReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {Log.d("vivi", "我是恩恩主席的内线,我收到的指令是:"+getResultData());}
}

20、Android fragment之间传递数据的方式?

答案:

  • 方法一:

1、在MainFragment中设置一个setData()方法,在方法中设置更改按钮名称; //MainFragment.java文件中

public void setData(String string) {bt_main.setText(string);}

2、在MenuFragment中的ListView条目点击事件中通过标签获取到MainFragment,并调用对应的setData()方法,将数据设置进去,从而达到数据传递的目的。

lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {MainFragment mainFragment =(MainFragment) getActivity().getSupportFragmentManager().findFragmentByTag("mainFragment");mainFragment.setData(mDatas.get(position));}});

只需上面区区两步即可达到数据传递的目的。 方法二: 采取接口回调的方式进行数据传递。

step1: 在Menuragment中创建一个接口以及接口对应的set方法:

//MenuFragment.java文件中
public interface OnDataTransmissionListener {public void dataTransmission(String data);
}public void setOnDataTransmissionListener(OnDataTransmissionListener mListener) {this.mListener = mListener;
}

step2: 在MenuFragment中的ListView条目点击事件中进行接口进行接口回调

lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
  • 方法二:采取接口回调的方式进行数据传递
if (mListener != null) {mListener.dataTransmission(mDatas.get(position));
});

step3: 在MainActivity中根据menuFragment获取到接口的set方法,在这个方法中进行进行数据传递,具体如下:

//在MainActivity.java中
menuFragment.setOnDataTransmissionListener(new MenuFragment.OnDataTransmissionListener() {@Overridepublic void dataTransmission(String data) {mainFragment.setData(data); //注:对应的mainFragment此时应该要用final进行修饰}
});

通过上面的三步也可以轻松做到Fragment数据之间的传递。 方法三: 使用三方开源框架:EventBus 那么问题来了:EventBus是个啥东西??? 简单来说,EventBus是一款针对Android优化的发布/订阅(publish/subscribe)事件总线。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息。简化了应用程序内各组件间、组件与后台线程间的通信。优点是开销小,代码更优雅,以及将发送者和接收者解耦。比如请求网络,等网络返回时通过Handler或Broadcast通知UI,两个Fragment之间需要通过Listener通信,这些需求都可以通过EventBus实现。 下面我们就用EventBus来实现以下Fragment之间的数据传递:

step1:引入EventBus compile ‘org.greenrobot:eventbus:3.0.0’
step2:注册事件接收者 这里MainFragment是要接收MenuFragment发送来的数据,所以我们在MainFragment中的onCreateView()方法中进行注册: EventBus.getDefault().register(this);
step3:发送事件 注:发送事件之前其实还有一步定义事件类型,这里我们传递的数据只有一个类型,所以这一步取消了。 MenuFragment发送数据给MainFragment,所以我们在MenuFragment中将要传递的数据进行发送事件操作:

lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {EventBus.getDefault().post(mDatas.get(position));
}
});

step4:接收消息并处理 在MainFragment中我们接收来自MenuFragment传递过来的数据,并进行对应的处理(注:EventBus 3.0版本这一步必须要写注解@Subscribe (与2.4版本有所区别)):

@Subscribe
public void onEvent(String data) {bt_main.setText(data);
}

通过上面这一步即可完成数据之间的传递,需要注意的是在销毁的时候我们要注销事件接收。 step5:注销事件接收

//MainFragment.java中
@Override
public void onDestroy() {super.onDestroy();EventBus.getDefault().unregister(this);
}

以上五步完成了Fragment之间的数据传递,看似比上面两个方法要复杂的多,但当我们涉及到复杂的Fragment之间数据传递(例如Fragment中嵌套多层Fragment)时,就会体会到EventBus的爽快之处~~~这里不进行赘述了。

结尾

本次二十题安卓面试题就到此为止了,关注我,后续每日都会准时更新哦,喜欢的朋友不要吝啬你的赞和收藏哦,那我们明天再见!

2022年最新版Android安卓面试题+答案精选(每日20题,持续更新中)【一】相关推荐

  1. 2022年最新版Android安卓面试题+答案精选(每日20题,持续更新中)【十】

    前言 好久不见,甚是想念.各位朋友们,我又携带着最受大家欢迎的面试题回来了,可能会有朋友要问了:哎呀,你咋不更了,这不是上次那一份资料用完了嘛,这不,我又厚着脸皮去问我们公司的主管:Boss,给我份面 ...

  2. 史上最全的2022年最新版Android安卓面试题集锦(含答案+源码)

    金三银四,又到了一年一度的黄金跳槽季,想必也许有不少Android程序员开始摩拳擦掌,蠢蠢欲动了.而网络上的面试题大部分已经过时甚至是错误成堆,漏洞百出,今天结合自己这段时间的面试经验和几个Andro ...

  3. 数据挖掘分析相关面试题(亲身经历),持续更新中(最新一次为20210209)

    以下大多数都是博主或者博主同事经历过的面试题哟~关于工作内容的就不写啦,一些基础面试题跟大家分享下 多看看面试题也能够让你快速了解自己的能力和短缺的地方哦~ 本篇博客会持续更新,也希望大家多多提供一些 ...

  4. 安卓开发者中心!那些BAT大厂的Android面试官到底在想些什么?持续更新中

    最近很多人说,Android越来越不好找工作了,学习NDK开发会不会好点,今天就聊聊这个问题.是否应该选择学NDK? 1.哪些场景下要用到NDK开发? 跨平台的库,如FFmpeg, skip,weex ...

  5. 人生最好的php,mysql,linux,redis,docker等相关技术经典面试题,新手收藏学习,持续更新中。。。

    php面试题 1.写出你能想到的所有HTTP返回状态值,并说明用途(比如:返回404表示找不到页面) # 200:服务器请求成功 # 301:永久重定向,旧网页已被新网页永久替代 # 302:表示临时 ...

  6. 前端主流面试官必问超详细面试题(整理完以秃头)持续更新中

    前端优化 我们可以使用以下几种方式做前端优化 CDN: CDN利用最靠近每位用户的服务器,更快.更可靠地将音乐.图片.视频.应用程序及其他文件发送给用户,来提供高性能.可扩展性及低成本的网络内容传递给 ...

  7. 【100道面试题真题讲解】C++面试题讲解+JAVA面试题讲解+Linux面试题讲解+数据结构面试题+计算机网络面试题 讲解视频-持续更新中

    最近找到了一个非常好的公众号:IT笔试面试真题讲解,每天视频分享一道IT公司面试高频题目,完全免费哦,非常适合找工作的学生复习+总结+提炼. 白嫖不敢独吞,分享给大家,也给作者增加一点访问量,鼓励作者 ...

  8. Android Studio 的一些 常用操作和 编译报错 整理(持续更新中...)

    Android Studio 的一些 常用操作和 编译报错 整理(持续更新中...) 目录 Android Studio 的一些 常用操作和 编译报错 整理(持续更新中...) 一.Android s ...

  9. 2020年拼多多校招面试题及答案-最全最新-持续更新中(2)

    大家好我是好好学习天天编程的天天 一个整天在互联网上种菜和砍柴的程序员~ 2020年拼多多校招面试题及答案-最全最新-持续更新中(2) 2020年拼多多校招面试题一面 2020年拼多多校招面试题一面- ...

最新文章

  1. 网络性能测试工具iperf的使用与参数解析
  2. 程序员究竟该如何提高效率
  3. ViewPager 实现页面左右滑动的简单案例1
  4. Java注释@interface的用法【转】
  5. php post授权编写,php模拟post行为代码总结(POST方式不是绝对安全)
  6. linux创建备用管理员,sql server 创建备用管理员和只读用户
  7. 【 2013华为杯编程大赛成都第三组前两题试题及答案】
  8. linux修正磁盘错误,找到了linux分区顺序错乱修复方法
  9. curl -s http://192.168.232.191/openapi/v2 | jq 不显示JSON格式的文档说明
  10. windows下的文件遍历(使用CFindFile)
  11. MVC进阶学习--HtmlHelper控件解析(五)
  12. linux dd命令实用详解
  13. 【设计模式】工厂模式
  14. android x86 win8 双系统,win8.1安卓双系统安装教程:安卓win8.1二合一双系统安装步骤...
  15. CVE-2013-5211漏洞整改方法
  16. Oracle DB 移动数据
  17. 字母使用频率统计c 语言编程,统计字母的使用频率c语言实现.doc
  18. 大数据的理解,大数据是什么,大数据能干什么?
  19. TunesKit Spotify Converter Mac(Spotify音乐转换工具) v1.5.1激活版
  20. ensp启动设备蓝屏_戴尔笔记本蓝屏原因 戴尔笔记本蓝屏解决方法【详解】

热门文章

  1. 服务器ip导致微信域名红,域名报毒报红?
  2. php打印玫瑰花,HTML_HTML5 canvas绘制的玫瑰花效果,有人用html就写了一朵漂亮的玫 - phpStudy...
  3. 中日韩Linux合资公司投资80万 营业执照尚未获批(转)
  4. 认识SCI、EI、SSCI、IEEE、CSSCI、CSCD
  5. vue中数据异步更新($nextTick)的问题
  6. 相空间重构matlab代码
  7. html 更改视频封面,HTML5视频标签 - 如何设置封面背景大小
  8. SpringBoot在线教育项目(项目介绍)
  9. 单片机p2.0引脚c语言,单片机C语言案例教程习题解答
  10. 【精华贴】数字音频接口详解-I2S接口PCM/TDM接口PDM接口