Android面试-基础知识

Android四大组件分别为activity、service、content provider、broadcast receiver。
Android六大布局:LinearLayout、TableLayout、FrameLayout、RelativeLayout、GridLayout、AbsoluteLayout。
Android五大存储:SharedPreferences方式、文件存储方式、SQLite数据库方式、内容提供器(Content provider)方式、 网络存储方式、(文件)

>>>Activity:{
    生命周期、启动模式、通信

===生命周期:[ 
1、 acticity的4种状态:running(栈顶活动状态)/ paused(失去焦点)/ stopped(不可见状态)/ killed(已被系统回收)
2、生命周期分析: Activity启动 ->onCreate():创建 ->onStart():可见 ->onResume():获取焦点
    点击Home键回到主界面(Activity不可见) ->onPause():失焦 ->onStop():不可见
    再次回到原Activity时: ->onRestart() ->onStart() ->onResume()
    退出当前Activity时: ->onPause() ->onStop() ->onDestroy()
3、进程优先级:前台 / 可见 / 服务 / 后台:Home键 / 空:如缓存进程
]

===任务栈(task):[ 后进先出,Actiivty的集合 ]

===启动模式:[ 
1、standard:默认,重复创建
2、singletop:栈顶复用模式
3、singletask:栈内复用模式
4、singleinstance:复用任务栈实例模式
]

===scheme跳转协议:[ android中的scheme是一种页面内跳转协议,是一种非常好的实现机制,通过定义自己的scheme协议,可以非常方便跳转app中的各个页面;通过scheme协议,服务器可以定制化告诉App跳转哪个页面,可以通过通知栏消息定制化跳转页面,可以通过H5页面跳转页面等。
1、服务端下发url,跳转到指定的页面
2、从H5页面跳转到相应的app页面
3、App根据Url,跳转到另一个App的指定页面(大型公司做推广用)
 ]

}


>>>fragment:{
    Fragment为什么被称为第五大组件?、Fragment的生命周期、Fragment之间的通信、Fragment管理器:FragmentManager

===Fragment为什么被称为第五大组件:[ 
---FragmentPagerAdapter:适用于页面较少的情况
---FragmentStatePagerAdapter:适用于页面较多得情况,真正释放页面内存,更节省内存。  
(源码destryItem:)
    通常结合ViewPage使用,相比Activity更节省内存;同时UI的切换舒适;
---Fragment添加到Activity的两种方式:1、静态加载,添加Fragment到Activity的布局文件当中    2、动态在activity中添加fragment :
//步骤一:添加一个FragmentTransacion的实例
FragmentManager  fragmentManager  = getFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();

//步骤二:用add()方法加上Fragment的对象rightFragment
RightFragment rightFragment = new RightFragment();
transaction.add(R.id.right_container, rightFragment , "rightFragment" );
transaction.addToBackStack("rightFragment");

//步骤三:调用commit()方法使得FragmentTransaction实例的改变失效
transaction.commit();
》  
 ]

===Fragment的生命周期:[  
Android面试-基础知识_第1张图片
    Activity与Fragment初始化时,生命周期是先走Activity后走Fragment, 销毁退出时,是先走Fragment后走Activity生命周期方法。
---onAttach:关联
---onCreat:初次创建
---onCreateView:首次绘制用户界面
---onViewCreated:
---Activity-onCreate:
---onActivityCreated:
---Activity-onStart:可见
---onStart:
---Activity-onResume:
---onResume:Fragment完全初始化完毕
---onPause:
---Activity-onPause:
---onStop:
---Activity-onStop:
---onDestoryView:
---onDestory:
---onDetach:Fragment对象销毁
---Activity-onDestory:
]

===Fragment通信:[
1、在Fragment中调用Activity中的方法getActivity
2、在Activity中调用Fragment中的方法     接口回调 <在Fragment中创建一个接口,Activity来实现>
3、在Fragment中调用Fragment中的方法, findFragmentById
]

===Fragment中的replace、add、remove方法:[
    实质是FragmengManager中的方法。
]

}


>>>Service:{
    service的应用场景,以及和Thread区别、开启service的两种方式以及区别。

===service基础:[ 
1、Service是什么?    --作为四大组件之一,可以在后台处理一些复杂的逻辑;用它去执行一个长时间的任务;service保活,程序退出,service仍然在后台执行。
        Service(服务)是一个一种可以在后台执行长时间运行操作而没有用户界面的应用组件。<可以由其他组件启动, 是运行在主线程中,不能做长时间的耗时操作。>  
2、service和Thread的区别
    定义:A、Thread线程,用它来执行一些异步的任务,它是独立运行的,Service是Android机制,是运行在它所依赖的主线程中,没那么独立。service可能和Activity不在同一个线程中,可能要通过IPC进程间通信来进行。
              B、可控性,如Activity被销毁,Thread完全没法控制。
    实际开发:Thread用于创建工作线程,后台线程,做一些耗时操作。    Service是运行在主线程中,不可以做耗时操作,如果一定要在Service中做耗时操作,一定要开启单独的线程。
    应用场景:不阻塞UI线程,开启子线程。    Service长时间在后台运行,不需要和用户交互。
 ]

===service的启动方式:[
1、startservice:启动后不受控件生命周期控制,通过Intent。
---onBind:绑定服务时才会调用。
---onCreate():首次创建服务时,系统将调用此方法来执行一次性设置程序(在调用 onStartCommand() 或 onBind() 之前)。如果服务已在运行,则不会调用此方法。该方法只被调用一次。
---onStartCommand:每次通过startService() 方法启动Service时都会被回调。返回一个int类型的值,当返回start_stick
---onDestroy():服务销毁时的回调

    ---定义一个类继承Service
    ---在Manifest.xml文件中配置该Service
    ---使用Context的startService(Intent)方法启动该Service.
    ---不再使用时,调用stopService(Intent)方法停止该服务。

2、bindService:生命周期依附于它所绑定的组件。
    ---创建BindService服务端,继承自Service并在类中,创建一个实现IBinder接口的实例对象并提供公共方法给客户端调用。

    ---从onBind() 回调方法返回此Binder 实例。
    ---在客户端中,从onServiceConnected() 回调方法接收 Binder,并使用提供公共方法调用绑定服务。
--->服务端
private LocalBinder binder = new LocalBinder();
/**
创建Binder对象,返回给客户端即Activity使用,提供数据交换的接口
*/
public class LocalBinder extends Binder{'
    //声明一个方法,getService。 (提供给客户端调用)
    BindService getService(){
        //返回当前对象LocalService,这样就可在客户端调用Service的公共方法了
        return BindService.this;
    }
}
/**
把Binder类返回给客户端
*/
public IBinder onBind( Intent intent ){
    return binder;
}

--->客户端
conn = new ServiceConnection(){
    /*
    与服务端交互接口方法 绑定服务的时候被调用,在这个方法获取绑定Service传递过来的IBinder对象。
    通过这个IBinder对象,实现宿主和Service的交互。
    */
    public void onServiceConnected( ComponentName name, IBinder service ){
        BindService.LocalBinder binder = (BindService.LocalBinder) service;
        mService = binder.getService();
    }
    /*
    当取消绑定的时候被回调,但正常情况下是不被调用的,它的调用时机是当Service服务被意外销毁时,
    例如内存的资源不足时这个方法才被自动调用。
    */
    public void onServiceDisconnected( ComponentName name ){ mService = null; }
}
--->绑定和取消绑定操作
    bindService( intent,conn,Service.BIND_AUTO_CREATE );
    unbindService( conn );
]

}

>>> Broadcast Receiver:{
    广播、实现广播-receiver、广播实现机制、LocalBroadcastManager详解

===广播:[ 
1、广播定义:在Android中,Broadcast是一种广泛运用的在应用程序之间传输信息的机制,Android中我们要发送广播内容是一个Intent,这个Intent中可以携带我们要传送的数据,类似于观察者模式。实例:更新UI,广播接收Service。
2、广播的场景:
    A、同一个app具有多个进程的不同组件之间的消息通信
    B、不同app之间的组件之间消息通信
3、广播的种类:
    A、Normal Broadcast<普通广播>:Context.sendBroadcast
    B、System Broadcast<系统广播>:Context.sendOrderedBroadcast
    C、Local Broadcast<本地广播>:只在自身App内传播
]

===实现广播-receiver:[
1、静态注册:注册完成就一直运行
2、动态注册:跟随activity的生命周期
]

===内部实现机制:[ <观察者模式、Binder机制、AMS>
1、自定义广播接收者BroadcastReceiver,并复写onRecvice() 方法;
2、通过Binder机制向AMS (Actvity Manager Service) 进行注册;
3、广播发送者通过Binder机制向AMS发送广播;
4、AMS查找符合相应条件( IntentFilter/Permission等 ) 的BroadcastReceiver,将广播发送到BroadcastReceiver(一般情况下是Activity) 相应的消息循环队列中;
5、消息循环执行拿到此广播,回调BroadcastReceiver中的onReceive()方法。
]

===LocalBroadcastManager详解:[
1、使用它发送的广播将只在自身App内传播,因此你不必担心泄漏隐私数据
2、其它App无法对你的App发送该广播,因为你的App根本就不可能接收到非自身应用发送的该广播,因此你不必担心有安全漏洞可以利用
3、比系统的全局广播更加高效
A、LocalBroadcastManager高效的原因主要是因为它内部是通过Handler实现的,它的sendBroadcast()方法含义并非和我们平时所用的一样,它的sendBroadcast()方法其实是通过handler发送一个Message实现的
B、既然是它内部是通过Handler来实现广播的发送的,那么相比与系统广播通过Binder实现那肯定是更高效了,同时使用Handler来实现,别的应用无法向我们的应用发送该广播,而我们应用内发送的广播也不会离开我们的应用。
C、LocalBroadcastManager内部协作主要是靠这两个Map集合:mReceivers和mActions,当然还有一个List集合mPendingBroadcasts,这个主要就是存储待接收的广播对象。
]

}

>>> webview安全漏洞:{
    webview常见的一些坑、关于webview的内存泄漏问题

===webview常见的一些坑:[
1、Android API level 16以及之前的版本存在远程代码执行安全漏洞,该漏洞源于程序没有正确限制使用WebView.addJavascriptInterface方法,远程攻击者可以通过使用Java Reflection<反射>API利用该漏洞执行任意Java对象的方法。
2、webview在布局文件中使用:webview写在其他容器中时,页面离开时要销毁webview。
3、jsbridge:js桥,实现js和native的相互调用。
4、webviewClient.onPageFinished<如果当前加载的网页产生跳转时,该方法会调用无数次>--->WebChromeClient.onProgressChanged<建议用次方法代替>
5、后台耗电:涉及性能优化,加载webview它会自己开启线程。销毁Webview。
6、Webview硬件加速导致渲染问题:更流畅,但会出现白块和和闪烁的问题。解决就是设置暂时关闭硬件加速。
]

===关于webview的内存泄漏问题:[
1、独立进程,简单暴力,不过可能涉及到进程通信。可以减少主进程容量。
2、动态添加webview,对传入WebView中使用的Context使用弱引用,动态添加WebView意思在布局创建个ViewGroup用来放置WebView,Activity创建时add进来,在Activity停止时remove掉。
]

}

>>> Binder:{
    Linux内核的基础知识、Binder通信机制介绍、Aidl

===Linux内核的基础知识:[
1、进程隔离/虚拟地址空间:  <在Android中进程通信,通过Binder。>
2、系统调用:
3、binder驱动:
]

===Binder通信机制介绍:[
1、为什么使用binder
    A、Android使用的Linux内核拥有着非常多的跨进程通信机制
    B、性能
    C、安全:可以通信双方进行身份校验。
2、binder通信模型
    A、通讯录:binder驱动,内核程序。
    B、电话基站:serviceManager
3、binder通信机制原理
    进程间的通讯数据都在内核当中。
    A、Binder跨进程通信
Android面试-基础知识_第2张图片
    客户端进程只不过是持有了服务端的一个代理,然后通过代理对象协助驱动,完成跨进程通信。
]

===到底什么是binder:[
1、通常意义下,Binder指的是一种通信机制
2、对于Server进程来说,Binder指的是Binder本地对象/对于Client来说,Binder指的是Binder代理对象。
3、对于传输过程而言,Binder是可以进行跨进程传递的对象
]

===Aidl:[
---Stub():静态内部类,抽象的,具体要自己实现,策略模式。
---asInterface:参数IBinder,是一个接口有跨进程传输数据的能力,是驱动底层支持的。如果是通进程使用当前对象,是跨进程的就使用代理对象。
---onTransact方法:会根据aidl函数返回的编号来进行相应的方法调用,
]

}

你可能感兴趣的:(Android面试相关)