android面试详解

 

android面试详解_第1张图片

 

android面试详解_第2张图片

前台就是和用户交互的进程

可见进程例如一个activity被一个透明的对话框覆盖,该activity就是可见进程

服务:service进程

后台一个activity按了home按键就是从前台退回到后台

android面试详解_第3张图片

 

标准模式:不管任务栈是否存在相同的activity都会创建一个新的activity存储在任务栈中

android面试详解_第4张图片

Singletop栈顶复用模式创建的activity在栈顶就不用创建该activity

 

站内复用模式:只要任务栈内存在该activity,就不用创建该activity,将该activity置于栈顶,该activity以上的activity都从任务栈中移除销毁掉出去,会回调onnewIntent方法

android面试详解_第5张图片

 

最近由于工作需要,使用Scheme方式自定义URL来跨应用间调用,踩了一些坑,现在记录一下。

1、Scheme方式配置

manifest中配置能接受Scheme方式启动的activity

最近由于工作需要,使用Scheme方式自定义URL来跨应用间调用,踩了一些坑,现在记录一下。

1、Scheme方式配置

manifest中配置能接受Scheme方式启动的activity

如果需要配置能被js调起,一定要配置下面这句

  1. <category android:name="android.intent.category.BROWSABLE">category>  
    1. android:scheme="app"表示配置接受的协议为app,相当于http://www.baidu.com中的http或者https  
      1. android:host="test"表示配置接受的域名为test,相当于http://www.baidu.com中的www.baidu.com  
      2. 2、使用URL调起Activity
        1. Uri uri=Uri.parse("app://test");  
        2. Intent intent=new Intent(Intent.ACTION_VIEW,uri);  
        3. startActivity(intent);  3、使用js调起Activity
          1. window.location = "app://test";    
          2. 通过推送,接受到需要打开的url

 android面试详解_第6张图片

 

android面试详解_第7张图片

 

前者适合页面较少,并没有实现真正的内存回收,后者适合页面较多实现了内存真正的回收

android面试详解_第8张图片

 

fragment调用activity的方法,直接获得getactivity进行调用

activity调用fragement的方法,在fragment中实现接口,在activity中调用接口对象

fragment A调用fragment B的方法,通过getactivity的的findFragment进行调用

android面试详解_第9张图片

 

service和broadcast都是运行在主线程上,如果service要做耗时操作,可以开启线程的方式,列如在service中访问网络都需要开启线程

android面试详解_第10张图片

Service 中的onStartCommand()必须返回一个整数.这个整数描述了在系统杀死它的事件中系统如何继续这个服务onStartCommand()也返回值必须是下面常量之一:

  • START_NOT_STICKY

      如果系统在onStartCommand()返回后杀死了服务,不要重新创建这个service,除非还有挂起的intent需要被传送.这是避免在不必要时运行你的service和当你的应用可以简单重启任何未竟的工作时的最佳选择.

  • START_STICKY

      如果系统在onStartCommand()返回后杀死了这个service,会重新创建这个service并且调用onStartCommand(),但是不再重新发送上次最后一个intent,而是使用一个nullintent调用onStartCommand(),除非有一些挂起的intent,在此情况下,这些挂起的intent被派送.这适合于媒体播放器(or或相似也的服务),它不执行命令,但是无限期的运行并等待一个工作.

  • START_REDELIVER_INTENT

      如果系统在onStartCommand()返回后杀死了service,重新创建这个service并且使用上次最后一个intent调用onStartCommand().任何挂起的intent都顺序地被派送.这适合于活跃地执行一个工作并且应被立即恢复的服务,比如下载一个文件

android面试详解_第11张图片

android面试详解_第12张图片

在service中发送广播通知activity,不让service和activity直接交互

android面试详解_第13张图片

 

同一一个app不同组件的通信

android面试详解_第14张图片

 

android面试详解_第15张图片

android面试详解_第16张图片

动态注册一定要在activity的ondestory中销毁,否则会内存泄露

动态注册的声明周期和activity一样,activity销毁广播就销毁

静态注册即使activity销毁了,也能收到广播

android面试详解_第17张图片

android面试详解_第18张图片

android面试详解_第19张图片

binder比传统的进程的上面更加高效,binder能够进行身份的安全性检查

android面试详解_第20张图片

 android面试详解_第21张图片

android面试详解_第22张图片

android面试详解_第23张图片

在生成handle对象的时候,每一个线程拥有自己的创建了threadLocal对象一个loop对象和一个消息队列,主线程才能更新UI,handler的创建必须在主线程中,looper从消息队列中获得消息,然后由handle来发送,有handle的

hanleMessage方法来处理,处理完成之后返回给Loper继续执行,在取出消息队列

android面试详解_第24张图片

 

解决handle内存泄露的问题

第一讲handle定义成static类型

第二在activity的ondestory中调用handle.removecall方法

第三:采用弱引用的访问在handle内部持有activity的对象

android面试详解_第25张图片

通过上面的三种方式,能百分之90%解决handle的内存泄露

 android面试详解_第26张图片

android面试详解_第27张图片

 

总结:

View绘制分三个步骤,顺序是:onMeasure,onLayout,onDraw。经代码亲测,log输出显示:调用invalidate方法只会执行onDraw方法;调用requestLayout方法只会执行onMeasure方法和onLayout方法,并不会执行onDraw方法。

所以当我们进行View更新时,若仅View的显示内容发生改变且新显示内容不影响View的大小、位置,则只需调用invalidate方法;若View宽高、位置发生改变且显示内容不变,只需调用requestLayout方法;若两者均发生改变,则需调用两者,按照View的绘制流程,推荐先调用requestLayout方法再调用invalidate方法。

 

相关知识点:

1.invalidate和postInvalidate:invalidate方法只能用于UI线程中,在非UI线程中,可直接使用postInvalidate方法,这样就省去使用handler的烦恼。

android面试详解_第28张图片

android面试详解_第29张图片

 

转载于:https://www.cnblogs.com/kebibuluan/p/7205704.html

你可能感兴趣的:(android面试详解)