Android面试知识点:Android

一、Android基础

1、四大组件的生命周期及简单使用方法

  • activity生命周期
    OnCreate(),OnStart(),OnResume(),OnPause(),OnStop(),OnDestory()
  • service生命周期
    service生命周期方法如下:
    在这里插入图片描述
    service生命周期调用如下:
    在这里插入图片描述
  • broadcast生命周期
  1. 动态注册方式的BroadcastReceiver:生命周期仅限于当前注册的activity,离开activity一定要解除注册,否则就会抛出非常熟悉的错误,但是这个错误不会导致app崩溃。
  2. 静态注册的BroadcastReceiver:生命周期不仅局限于activity,对比动态注册,进行了测试,发现activity关闭与否,不受影响,即使app退出了还是会收到广播。
  • ContentProvider生命周期

2、Activity的四种启动模式对比

  • standard
    standard模式是默认的启动模式,不用为配置android:launchMode属性即可,当然也可以指定值为standard。每次跳转系统都会在task中生成一个新的FirstActivity实例,并且放于栈结构的顶部,当我们按下后退键时,才能看到原来的FirstActivity实例

  • singleTop
    singleTop启动模式体现为2种,就是Activity处于栈顶和不处于栈顶。如果发现有对应的Activity实例正位于栈顶,则重复利用,不再生成新的实例。如果不是位于栈顶,就重新生成一个实例。

  • singleTask
    singleTask模式,如果发现所在Activity栈中有对应的Activity实例,则使此Activity实例之上的其他Activity实例统统出栈,使此Activity实例成为栈顶对象,显示到幕前。

  • singleInstance
    singleInstance所标识的Activity,当被启动时,系统会首先判断系统其他栈中是否已经存在此Activity实例,有则直接使用,并且其所在的Activity栈理论上只有它一个Activity元素。所以启动它的Activity与它并不在一个task中,所以才需要特别注意Back的问题。一般表示为:task1 A -> task2 B。

singleInstance表示该Activity在系统范围内“实例唯一”。由此我们发现,singInstance和singleTask主要区别在与系统范围内的“实例唯一”还是当前Activity栈“实例唯一”。

android:activity启动模式见解

3、fragment的使用

  • fragment的生命周期
    OnAttach();OnCreate();OnCreateView();OnActivityCreated();OnStart();OnResume();OnPause();OnStop();OnDestoryView();OnDestory();OnDetach();

可以看到Fragment比Activity多了几个额外的生命周期回调方法:

onAttach(Activity) 当Fragment与Activity发生关联时调用。
onCreateView(LayoutInflater, ViewGroup,Bundle) 创建该Fragment的视图
onActivityCreated(Bundle) 当Activity的onCreate方法返回时调用
onDestoryView() 与onCreateView想对应,当该Fragment的视图被移除时调用
onDetach() 与onAttach相对应,当Fragment与Activity关联被取消时调用

注意:除了onCreateView,其他的所有方法如果你重写了,必须调用父类对于该方法的实现

  • fragment使用
  1. 静态使用:这是使用Fragment最简单的一种方式,把Fragment当成普通的控件,直接写在Activity的布局文件中。
  2. 动态使用:使用FragmentManager对Fragment进行了动态的加载。

基本是操作Fragment的所有的方式了,在一个事务开启到提交可以进行多个的添加、移除、替换等操作。
a、比如:我在FragmentA中的EditText填了一些数据,当切换到FragmentB时,如果希望会到A还能看到数据,则适合你的就是hide和show;也就是说,希望保留用户操作的面板,你可以使用hide和show,当然了不要使劲在那new实例,进行下非null判断。
b、再比如:我不希望保留用户操作,你可以使用remove(),然后add();或者使用replace(),这个和remove,add是相同的效果。
c、remove和detach有一点细微的区别,在不考虑回退栈的情况下,remove会销毁整个Fragment实例,而detach则只是销毁其视图结构,实例并不会被销毁。那么二者怎么取舍使用呢?如果你的当前Activity一直存在,那么在不希望保留用户操作的时候,你可以优先使用detach。

6、ContentProvider、ContentResolver、ContentObserver 之间的关系

ContentProvider是Android的四大组件之一,可见它在Android中的作用非同小可。它主要的作用是:实现各个应用程序之间的(跨应用)数据共享,比如联系人应用中就使用了ContentProvider,你在自己的应用中可以读取和修改联系人的数据,不过需要获得相应的权限。其实它也只是一个中间人,真正的数据源是文件或者SQLite等。
一个应用实现ContentProvider来提供内容给别的应用来操作, 通过ContentResolver来操作别的应用数据,当然在自己的应用中也可以。
ContentObserver(内容观察者),目的是观察(捕捉)特定Uri引起的数据库的变化,继而做一些相应的处理,它类似于数据库技术中的触发器(Trigger),当ContentObserver所观察的Uri发生变化时,便会触发它。

7、广播的分类及广播使用的方式和场景

  • 使用场景
    广播作为Android组件间的通信方式,可以使用的场景如下:
  1. 同一app内部的同一组件内的消息通信(单个或多个线程之间);
  2. 同一app内部的不同组件之间的消息通信(单个进程);
  3. 同一app具有多个进程的不同组件之间的消息通信;
  4. 不同app之间的组件之间消息通信;
  5. Android系统在特定情况下与App之间的消息通信。

第一种情形:同一app内部的同一组件内的消息通信(单个或多个线程之间),实际应用中肯定是不会用到广播机制的(虽然可以用),无论是使用扩展变量作用域、基于接口的回调还是Handler-post/Handler-Message等方式,都可以直接处理此类问题,若适用广播机制,显然有些“杀鸡牛刀”的感觉,会显太“重”;
第二种情形:同一app内部的不同组件之间的消息通信(单个进程),对于此类需求,在有些教复杂的情况下单纯的依靠基于接口的回调等方式不好处理,此时可以直接使用EventBus等,相对而言,EventBus由于是针对统一进程,用于处理此类需求非常适合,且轻松解耦。可以参见文件《Android各组件/控件间通信利器之EventBus》。
第三、四、五情形:由于涉及不同进程间的消息通信,此时根据实际业务使用广播机制会显得非常适宜。下面主要针对Android广播中的具体知识点进行总结。

  • BroadcastReceiver注册类型
  1. 静态注册:直接在AndroidManifest.xml文件中进行注册。
  2. 动态注册:无须在AndroidManifest中注册组件。直接在代码中通过调用Context的registerReceiver函数,可以在程序中动态注册BroadcastReceiv
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值