zoukankan      html  css  js  c++  java
  • android面试详解

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

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

    服务:service进程

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

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

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

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

    最近由于工作需要,使用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

     

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

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

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

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

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

    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都顺序地被派送.这适合于活跃地执行一个工作并且应被立即恢复的服务,比如下载一个文件

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

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

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

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

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

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

     

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

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

    解决handle内存泄露的问题

    第一讲handle定义成static类型

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

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

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

     

    总结:

    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的烦恼。

  • 相关阅读:
    Jersey的异常处理
    REST响应处理
    jersey REST的接口简述
    Firebird 同一字段的多行合并为一行
    Firebird/InterBase内置函数使用说明
    发布FireBird数据库所需要DLL文件
    unidac连接FireBird数据库
    打开与关闭Linux防火墙
    Linux FTP 命令
    Linux 命令修改系统时间
  • 原文地址:https://www.cnblogs.com/kebibuluan/p/7205704.html
Copyright © 2011-2022 走看看