ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Android 常规面试题整理(内含参考答案,终获offer

2021-09-07 15:02:08  阅读:199  来源: 互联网

标签:面试题 offer Fragment Activity onResume onStart activity android 参考答案





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



初始化结束后系统会调用 IBinder onBind(Intent intent) 方法,用来绑定传递给bindService 的Intent 的对象。注意:多次调用bindService()时,如果该服务已启动则不会再触发此方法。




### []( )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实例对象。



### []( )Activity在有Dialog时按Home键的生命周期?



**参考答案**:  

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



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



### []( )两个Activity 之间跳转时必然会执行的是哪几个方法?



**参考答案**:  

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



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



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



### []( )前台切换到后台,然后再回到前台,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()方法。



### []( )fragment各种情况下的生命周期?



**参考答案**:  

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



![](https://www.icode9.com/i/ll/?i=img_convert/2c967aca28fb467b2e6c053a49c03ca5.png)



接下来就不同情况下的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。



### []( )如何实现Fragment的滑动?



**参考答案**:  

将Fragment与viewpager绑定,通过viewpager中的touch事件,会进行move事件的滑动处理。



Fragment布局



<LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”

android:orientation="vertical"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:background="@android:color/holo_red_light">

<TextView

android:layout_width="match_parent"

android:layout_height="match_parent"

android:text="Fragment One" />

</LinearLayout>

<LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”

android:orientation="vertical"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:background="@android:color/holo_red_light">

<TextView

android:layout_width="match_parent"

android:layout_height="match_parent"

android:text="Fragment Two" />

</LinearLayout>



Fragment代码:



public class FragmentOne extends Fragment {

    @Nullable

    @Override

    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {

       return inflater.inflate(R.layout.fragment_one, container, false);

}

}

public class FragmentTwo extends Fragment {

@Nullable

@Override

public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {

return inflater.inflate(R.layout.fragment_Two, container, false);

}

}




viewpager布局:



xmlns:tools=“http://schemas.android.com/tools”

android:layout_width="match_parent"

android:layout_height="match_parent"

tools:context="com.example.spreadtrumshitaoli.fragmentscroll.MainActivity">

<android.support.v4.view.ViewPager

android:id="@+id/view_pager"

android:layout_height="match_parent"

android:layout_width="match_parent"/>

</android.support.constraint.ConstraintLayout>




MainActivity代码:



public class MainActivity extends AppCompatActivity {

private FragmentOne fragmentOne;

private FragmentTwo fragmentTwo;

private ViewPager viewPager;

private ArrayList mFragmentList = new ArrayList ();

private FragmentPagerAdapter fragmentPagerAdapter;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);



init();

}

private void init() {

viewPager = (ViewPager) findViewById(R.id.view_pager);

fragmentOne = new FragmentOne();

fragmentTwo = new FragmentTwo();



mFragmentList.add(fragmentOne);

mFragmentList.add(fragmentTwo);



//将adapter和fragment绑定在一起。

    fragmentPagerAdapter = new FragmentPagerAdapter(getSupportFragmentManager()) {

        @Override

        public Fragment getItem(int i) {

            return mFragmentList != null ? mFragmentList.get(i) : null;

        }

        @Override

    public int getCount() {

        return mFragmentList != null ? mFragmentList.size() : 0;

    }

};

viewPager.setAdapter(fragmentPagerAdapter);

viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

    @Override

    public void onPageScrolled(int i, float v, int i1) {

最后

一线互联网Android面试题含详解(初级到高级专题)

这些题目是今年群友去腾讯、百度、小米、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。并且大多数都整理了答案,熟悉这些知识点会大大增加通过前两轮技术面试的几率

CodeChina开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》

如果设置门槛,很多开发者朋友会因此错过这套高级架构资料,错过提升成为架构师的可能。这就失去了我们的初衷;让更多人都能通过高效高质量的学习,提升自己的技术和格局,升职加薪。

最后送给大家一句话,望共勉,永远不要放弃自己的梦想和追求;

v, int i1) {

最后

一线互联网Android面试题含详解(初级到高级专题)

这些题目是今年群友去腾讯、百度、小米、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。并且大多数都整理了答案,熟悉这些知识点会大大增加通过前两轮技术面试的几率

[外链图片转存中…(img-o9177vRW-1630997487323)]

CodeChina开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》

如果设置门槛,很多开发者朋友会因此错过这套高级架构资料,错过提升成为架构师的可能。这就失去了我们的初衷;让更多人都能通过高效高质量的学习,提升自己的技术和格局,升职加薪。

最后送给大家一句话,望共勉,永远不要放弃自己的梦想和追求;

标签:面试题,offer,Fragment,Activity,onResume,onStart,activity,android,参考答案
来源: https://blog.csdn.net/m0_61072670/article/details/120158049

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有