简述android的布局类型,android面试题3

*******************************activity相关***********************************

1.简述activity的生命周期

53eef784cc1e?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

onCreate():当 activity 第一次创建时会被调用。它本身的作用是进行Activity的一些初始化工作,比如使用setContentView加载布局,对一些控件和变量进行初始化等。activity不可见,所以动画不应该在这里初始化,因为看不到

onStart():当 activity 对于用户可见前即调用这个方法。activity可见

onResume():在 activity 开始与用户交互前调用该方法。activity可见

onPause():在系统准备开始恢复其它 activity 时会调用该方法。activity可见

onStop():在 activity 对用户不可见时将调用该方法。activity不可见

onRestart():在 activity 被停止后重新启动时会调用该方法。activity可见

onDestroy():在 activity 被销毁前会调用该方法。activity不可见

2.onCreate和onStart之间有什么区别?

1)可见与不可见的区别。前者不可见,后者可见。

2)执行次数的区别。onCreate方法只在Activity创建时执行一次,而onStart方法在Activity的切换以及按Home键返回桌面再切回应用的过程中被多次调用。因此Bundle数据的恢复在onStart中进行比onCreate中执行更合适。

3)onCreate能做的事onStart其实都能做,但是onstart能做的事onCreate却未必适合做。如前文所说的,setContentView和资源初始化在两者都能做,然而想动画的初始化在onStart中做比较好。

3.onStart方法和onResume方法有什么区别?

1)是否在前台。onStart方法中Activity可见但不在前台,不可交互,而在onResume中在前台。

2)职责不同,onStart方法中主要还是进行初始化工作,而onResume方法,根据官方的建议,可以做开启动画和独占设备的操作。

4.onPause方法和onStop方法有什么区别?

1)是否可见。onPause时Activity可见,onStop时Activity不可见,但Activity对象还在内存中。

2)在系统内存不足的时候可能不会执行onStop方法,因此程序状态的保存、独占设备和动画的关闭、以及一些数据的保存最好在onPause中进行,但要注意不能太耗时。

5.onStop方法和onDestroy方法有什么区别?

onStop阶段Activity还没有被销毁,对象还在内存中,此时可以通过切换Activity再次回到该Activity,而onDestroy阶段Acivity被销毁。

6.为什么切换Activity时各方法的执行次序是(A)onPause→(B)onCreate→(B)onStart→(B)onResume→(A)onStop而不是(A)onPause→(A)onStop→(B)onCreate→(B)onStart→(B)onResume

1)一个Activity或多或少会占有系统资源,而在官方的建议中,onPause方法将会释放掉很多系统资源,为切换Activity提供流畅性的保障,而不需要再等多两个阶段,这样做切换更快。

2)按照生命周期图的表示,如果用户在切换Activity的过程中再次切回原Activity,是在onPause方法后直接调用onResume方法的,这样比onPause→onStop→onRestart→onStart→onResume要快得多。

7.与生命周期密切相关的onSaveInstanceState方法和onRestoreInstanceState方法在什么时候执行?

当targetSdkVersion小于3时onSaveInstanceState是在onPause方法中调用的,而大于3时是在onStop方法中调用的。

而onRestoreInstanceState是在onStart之后、onResume之前调用的。

8.简述Activity的四种启动方式

standard:标准模式,在当前的任务栈上创建新的Activity,不论之前有没有创建过该Activity。注意:ApplicationContext无法启动standard模式的Activity。

singleTask:栈内复用模式,分两种情况,第一种情况:如果有任务栈里已经创建了该Acitiviy,直接销毁该Acitivity栈上面的所有Acitivity,无须新创建一个Activity;第二种情况:如果没有任务栈里已经创建该Activity,创建一个新的任务栈并在新栈上创建新Activity。注意:该模式下复用Activity,系统会调用Activity的onNewIntent方法。

singleTop:栈顶复用模式,如果该Activity在任务栈栈顶,即当前活动的Acitivty就是要创建的Activity,那么不会创建新的Activity。注意:该模式下复用Activity,系统会调用Activity的onNewIntent方法。

singleInstance:单实例模式,加强版的singleTask,当每次都直接创建一个新的任务栈,再在该新栈上创建新Activity。注意:singleInstance永远是单栈单Activity

********************************fragment相关**********************************

1、简述fragment的生命周期

53eef784cc1e?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

2、Fragment为什么被称为第五大组件

有自己的生命周期;使用频率高。

3、加载方式

1)依赖于Activity,不能单独存在,需要宿主。

2)静态加载,在xml文件中,当做一个标签使用,这种方式频率比较低;

3)动态加载,利用FragmentManager管理。

4、FragmentPagerAdapter与FragmentStatePagerAdapter区别

1)FragmentPagerAdapter适合用于页面较少的情况,切换时不回收内存,只是把UI和Activity分离,页面少时对内存影响不明显;

2)FragmentStatePagerAdapter适合用于页面较多的情况,切换时回收内存。

5、Fragment通信

1)在fragment中调用activity中的方法getActivity();

2)在Activity中调用Fragment中的方法,接口回调;

3)在Fragment中调用Fragment中的方法findFragmentById/Tag

4)通过Fragment.setArguments向Fragment传递参数

6、Fragment中的replace,add和remove方法

1)replace是替换掉最上层的fragment;

2)add是添加Fragment实例到最上层;

3)remove是移除Fragment实例。

********************************service相关**********************************

1、什么是Service以及描述下它的生命周期

Service(服务)是一个一种可以在后台执行长时间运行操作而没有用户界面的应用组件。服务可由其他应用组件启动(如Activity),服务一旦被启动将在后台一直运行,即使启动服务的组件(Activity)已销毁也不受影响。 此外,组件可以绑定到服务,以与之进行交互,甚至是执行进程间通信 (IPC)。 例如,服务可以处理网络事务、播放音乐,执行文件 I/O 或与内容提供程序交互,而所有这一切均可在后台进行,Service基本上分为两种形式:

启动状态

当应用组件(如 Activity)通过调用 startService() 启动服务时,服务即处于“启动”状态。一旦启动,服务即可在后台无限期运行,即使启动服务的组件已被销毁也不受影响,除非手动调用才能停止服务, 已启动的服务通常是执行单一操作,而且不会将结果返回给调用方。

绑定状态

当应用组件通过调用 bindService() 绑定到服务时,服务即处于“绑定”状态。绑定服务提供了一个客户端-服务器接口,允许组件与服务进行交互、发送请求、获取结果,甚至是利用进程间通信 (IPC) 跨进程执行这些操作。 仅当与另一个应用组件绑定时,绑定服务才会运行。 多个组件可以同时绑定到该服务,但全部取消绑定后,该服务即会被销毁。

1)onCreate():首次创建服务时,系统将调用此方法来执行一次性设置程序(在调用 onStartCommand() 或onBind() 之前)。如果服务已在运行,则不会调用此方法,该方法只调用一次。

2.1)onStartCommand():当另一个组件(如 Activity)通过调用 startService() 请求启动服务时,系统将调用此方法。一旦执行此方法,服务即会启动并可在后台无限期运行。 如果自己实现此方法,则需要在服务工作完成后,通过调用 stopSelf() 或 stopService() 来停止服务。(在绑定状态下,无需实现此方法。)

2.2)onBind():当另一个组件想通过调用 bindService() 与服务绑定(例如执行 RPC)时,系统将调用此方法。在此方法的实现中,必须返回 一个IBinder 接口的实现类,供客户端用来与服务进行通信。无论是启动状态还是绑定状态,此方法必须重写,但在启动状态的情况下直接返回 null。

3.2)onUnbind():当另一个组件通过调用bindService()与服务绑定时,调用unbind()与服务解绑时调用此方法。

4)onDestroy():当服务不再使用且将被销毁时,系统将调用此方法。

2、Service有哪些启动方法,有什么区别?

1 )通过startService:Service会经历 onCreate 到onStart,然后处于运行状态,stopService的时候调用onDestroy方法。

如果是调用者自己直接退出而没有调用stopService的话,Service会一直在后台运行。

2) 通过bindService:Service会运行onCreate,然后是调用onBind, 这个时候调用者和Service绑定在一起。调用者退出了,Srevice就会调用onUnbind->onDestroyed方法。

所谓绑定在一起就共存亡了。调用者也可以通过调用unbindService方法来停止服务,这时候Srevice就会调用onUnbind->onDestroyed方法。

3、service是否在main thread中执行, service里面是否能执行耗时的操作?

默认情况,如果没有显示的指定service所运行的进程, Service和activity是运行在当前app所在进程的main thread(UI主线程)里面

service里面不能执行耗时的操作(网络请求,拷贝数据库,大文件 )

在子线程中执行 new Thread(){}.start();特殊情况 ,可以在清单文件配置 service 执行所在的进程 ,让service在另外的进程中执行

4、什么是IntentService?有何优点?

普通的service ,默认运行在ui main 主线程,IntentService是带有异步处理的service类,可用异步处理的方法OnHandleIntent() 处理耗时的操作

5、service和thread的区别

Thread:Thread 是程序执行的最小单元,可以用 Thread 来执行一些异步的操作。

Service:Service 是android的一种机制,当它运行的时候如果是Local Service,那么对应的 Service 是运行在主进程的 main 线程上的。如果是Remote Service,那么对应的 Service 则是运行在独立进程的 main 线程上。

Thread 的运行是独立的,也就是说当一个 Activity 被 finish 之后,如果没有主动停止 Thread 或者 Thread 里的 run 方法没有执行完毕的话,Thread 也会一直执行。因此这里会出现一个问题:当 Activity 被 finish 之后,不再持有该 Thread 的引用,也就是不能再控制该Thread。另一方面,没有办法在不同的 Activity 中对同一 Thread 进行控制。

6、如何保证服务不被杀死

1)将onStartCommand() 方法的返回值设为 START_STICKY或START_REDELIVER_INTENT

2)在 onDestory() 中发送广播重新启动

3)将服务设为前台服务,确保优先级较高。

7.Android 5.0以上的隐式启动问题

显式启动、隐式启动

1)设置Action和packageName,令其不为空(为空则启动不了)

2)将隐式启动转换为显示启动

************************广播、内容提供者相关**************************

1、注册广播的两种方式

1)静态注册:在AndroidManifest.xml文件中定义

2)动态注册:在程序中使用Context.registerReceiver注册

2、BroadcastReceiver的生命周期

每次广播被接收后会重新创建BroadcastReceiver对象,并在onReceiver方法中执行完就销毁,如果BroadcastReceiver的onReceiver方法中不能在10秒内执行完成,Android会出现ANR异常

3、广播的类型

1)普通广播:完全异步的可以同一时间被所有的接收者接收到。

2)有序广播:接收者按照一定的优先级进行消息的接收。接收者可以通过abortBroadcast()的方式取消广播的传播,也可以通过setResultData和setResultExtras方法将处理的结果存入到Broadcast中,传递给下一个接收者。

4、说说Android为什么要设计ContentProvider这个组件

ContentProvider是应用程序间通用的共享数据的一种方式,如比如通讯录、短信等。

在Linux中,不同的用户或用户组对文件有不同的读写,执行的权限。ContentProvider保证数据的安全性的同时,又能方便的访问数据。

5、ContentProvider是如何实现数据共享的?

1)在Android中,为了把自己程序的数据(一般是数据库)提供给其他应用程序,就通过ContentProvider提供的方法.

2)内容提供者可认为是程序间共享数据的接口,新建一个类继承ContentProvider.

3)按要求重写insert,delete,update,query方法(用于数据库的操作).

4)进行清单文件注册

5)其他程序通过内容解析者ContentResoler的对象进行增删改查

6、为什么要使用ContentProvider?它和sql在实现上有什么区别?

1)ContentProvider 屏蔽了数据存储的细节,内部实现透明化,用户只需关心uri即可(是否匹配)

2)ContentProvider能实现不同app的数据共享,sql 只能是自己程序才能访问

3)Contentprovider还能增删本地的文件,xml等信息

7、说说ContentProvider,ContentResolver,ContentObserver之间的关系?

ContentProvider:内容提供者,定义增删改查(方法)和数据库关联;

ContentResolver:内容解析者,一个app里边用于获取另一个app的数据(进行增删查改的具体数据操作)

ContentObserver:内容观察者,另外的一个app(可以是不同于上述两个app)可以监听数据改变的消息

*******************************UI相关***********************************

1、android的六大布局

线性布局LinearLayout

表格布局TableLayout

相对布局RelativeLayout

层布局FrameLayout

绝对布局AbsoluteLayout

网格布局GridLayout

2、自定义控件的总类

1)组合控件(把系统现有的控件组合在一起,创建一个新的控件)

2)自定义控件( 创造出来一个系统原生没有的控件)

3、view对象渲染的过程

53eef784cc1e?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

onMeasure():决定View的大小

onLayout():决定View在ViewGroup中的位置

onDraw():如何绘制这个View

requestLayout:重新调用一次layout过程

invalidate:重新调用一次draw过程

postInvalidate:在UI线程中重新调用一次draw过程

4、布局常见问题与优化建议

1)把没有用的父布局,通过标签合并来减少UI的层次;

2)使用线性布局LinearLayout排版导致UI层次变深,如果有这类问题,我们就使用相对布局RelativeLayout代替LinearLayout,减少UI的层次;

3)不常用的UI被设置成GONE,比如异常的错误页面,如果有这类问题,我们需要用标签,代替GONE提高UI性能。

5、View中onTouch,onTouchEvent和onClick的执行顺序

onTouch->onTouchEvent->onClick

*******************************通信相关***********************************

*****************************性能优化相关*******************************

*******************************调试相关***********************************

*******************************适配相关***********************************

******************************第三方扩展相关******************************

*******************************其他***********************************

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值