Android面试题

1、 Android应用程序结构

Linux Kernel(Linux内核)
Libraries(系统运行库或者是c/c++核心库)
Application Framework(开发框架包)
Applications (核心应用程序)

2、四大组件是什么?

Activity【活动】:用于表现功能。
Service【服务】:后台运行服务,不提供界面呈现。
BroadcastReceiver【广播接收器】:用来接收广播。
Content Provider【内容提供商】:支持在多个应用中存储和读取数据,相当于数据库。

3、Activity生命周期

在这里插入图片描述

4、Fragment生命周期

在这里插入图片描述

5、 Service的生命周期

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

  初始化结束后系统会调用 void onStart(Intent intent) 方法,用于处理传递给startService()的Intent对象。如音乐服务会打开Intent 来探明将要播放哪首音乐,并开始播放。注意:多次调用startService()方法会多次触发onStart()方法。

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

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

6、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实例对象。

11、10、Activity 怎么和Service 绑定?

这需要实现service中的onBind()函数以返回service实例给activity

1、创建service类和activity类。

2、在service类中定义一个内部类继承自Binder()类:

public class MyBinder extends Binder{  
        public Service1 getService(){  
            return Service1.this;  
        }  
    }  

实例化onBind()方法:

private final IBinder binder = new MyyBinder();
@Override
public IBinder onBind(Intent intent){
        Log.i(LOG,"onBind......");
        return binder;
}

3、在activity中完成绑定

Intent intent = new Intent(Activity1.this,Activity2.class);
bindService(intent,conn,Context.BIND_AUTO_CREATE);

bindService的第二个参数是一个ServiceConnection类型的参数。service和其他组件之间的连接都表示为一个ServiceConnection,要想将service和其他组件进行绑定,就需要实现一个新的ServiceConnection。

public ServiceConnection conn= new ServiceConnection() {  
        @Override  
        public void onServiceDisconnected(ComponentName name) {    
            myservice = null;  
        }  
        @Override  
        public void onServiceConnected(ComponentName name, IBinder service) {   
            myservice = ((Service1.MyBinder)service).getService();  
        }  
    }; 

12、谈谈ContentProvider、ContentResolver、ContentObserver之间的关系?

ContentProvider:

  • 四大组件的内容提供者,主要用于对外提供数据
  • 实现各个应用程序之间的(跨应用)数据共享,比如联系人应用中就使用了ContentProvider,你在自己的应用中可以读取和修改联系人的数据,不过需要获得相应的权限。其实它也只是一个中间人,真正的数据源是文件或者SQLite等
  • 一个应用实现ContentProvider来提供内容给别的应用来操作,通过ContentResolver来操作别的应用数据,当然在自己的应用中也可以
    ContentResolver:
  • 内容解析者,用于获取内容提供者提供的数据
  • ContentResolver.notifyChange(uri)发出消息
    ContentObserver:
  • 内容监听器,可以监听数据的改变状态
  • 目的是观察(捕捉)特定Uri引起的数据库的变化,继而做一些相应的处理,它类似于数据库技术中的触发器(Trigger),当ContentObserver所观察的Uri发生变化时,便会触发它。触发器分为表触发器、行触发器,相应地ContentObsever也分为表ContentObserver、行ContentObserver,当然这是与它所监听的Uri MIME Type有关的
  • ContentResolver.registerContentObserver()监听消息

14、Handler–异步消息处理类

注意:每个线程中只会有一个Looper对象。
异步消息处理流程:
1)在主线程当中创建一个Handler对象;
2)重写handleMessage()方法;
3)当子线程需要进行UI操作时,创建一个Message对象,并通过Handler将消息发送出去;
4)消息添加到MessageQueue的队列中等待被处理;
5)Looper在MessageQueue中取出待处理消息,发回Handler的handleMessage()方法中。

17、事件分发

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值