这章主要介绍android基础知识:包括4大组件、fragment、webView以及Binder的一些简单介绍。java
activity用户交互的界面,包含4中状态:running/paused/stopped/killer。android
生命周期:web
activity启动会执行onCreate()->onStart()->onResume, 点击home键会执行onPause()->onStop(),注意若是内存吃紧,有可能会被回收。 再次回到原activity会执行onRestart()->onStart()->onResume()。 退出activity会执行onPause()->onStop()->onDestory()。
安全
分为前台/可见/服务/后台/空bash
android中使用栈的方式来管理其中的Activity,后进先出的数据结构服务器
1.Standard 默认模式,每次都会new一个activity实例入栈 2.SingleTop 栈顶复用,调用onNewIntent()函数。 3.SingleTask 任务栈存在启动activity就把它移动到栈顶,当前activity之上的全部activity都被移除栈。 4.SingleInstance 系统会建立一个新的任务栈,而且这个任务栈只有他一个Activity。不过启动会慢一些,每每用于多个应用之间切换。数据结构
android中scheme是一种页面内跳转协议,经过自定义scheme协议,能够很是方便的跳转app中的各个页面。多线程
fragment为什么被称为第5大组件 答:首先fragment不属于四大组件,它有本身的生命周期,同时它能够灵活的加载到activity当中去。 fragment虽然有本身的生命周期,但必须依附于activity存在。并发
通常fragment会配合viewpage使用,FragmentPagerAdapter通常用于页面较少的状况,FragmentStatePagerAdapter用于页面较多的状况。 app
FragmentManager中,replace是替换fragment实例,是把activity最上层的fragment替换成你想替换的fragment,add只是fragment加到activity的上层。
Service(服务)是一个一种能够在后台执行长时间运行操做而没有用户界面的应用组件。
onBind() 当另外一个组件想经过调用 bindService() 与服务绑定(例如执行 RPC)时,系统将调用此方法。在此方法的实现中,必须返回 一个IBinder 接口的实现类,供客户端onServiceConnected中能够获取到该实例通讯。不管是启动状态仍是绑定状态,此方法必须重写,但在启动状态的状况下直接返回 null。
onCreate() 首次建立服务时,系统将调用此方法来执行一次性设置程序(在调用 onStartCommand() 或onBind() 以前)。若是服务已在运行,则不会调用此方法,该方法只调用一次
onStartCommand() 当另外一个组件(如 Activity)经过调用 startService() 请求启动服务时,系统将调用此方法。一旦执行此方法,服务即会启动并可在后台无限期运行。 若是本身实现此方法,则须要在服务工做完成后,经过调用 stopSelf() 或 stopService() 来中止服务。(在绑定状态下,无需实现此方法。)
onDestroy() 当服务再也不使用且将被销毁时,系统将调用此方法。服务应该实现此方法来清理全部资源,如线程、注册的侦听器、接收器等,这是服务接收的最后一个调用。
startService(Intent intent)一旦启动,服务便可在后台无限期运行,即便启动服务的组件已被销毁也不受影响,除非手动调用 stopSelf() 或 stopService() 才能中止服务, 已启动的服务一般是执行单一操做,并且不会将结果返回给调用方。
bindService属于client-server模式。service只有一个,但绑定到service上面的client能够有一个或不少个。这里所提到的client指的是组件,好比某个Activity。 服务的生命周期与其绑定的client息息相关。当client销毁时,client会自动与Service解除绑定。固然,client也能够明确调用Context的unbindService()方法与Service解除绑定。当没有任何client与Service绑定时,Service会自行销毁。通常用于IPC通讯。
广播定义 普遍应用在应用程序之间传递信息的机制,相似观察者模式,经过intent能够传递数据。
加载网页的组件。
ViewParent parent = mWebView.getParent();
if (parent != null) {
((ViewGroup) parent).removeView(mWebView);
}
mWebView.stopLoading();
mWebView.removeAllViews();
mWebView.destroy();
mWebView=null;
super.onDestroy();
复制代码
WebViewClient.onPageFinished-->WebChromeClient.onProgressChanged onPageFinished没法肯定当WebView调用这个方法的时候,网页内容是否真的加载完毕 了。当前正在加载的网页产生跳转的时候这个方法可能会被屡次调用,判断网页是否加载完成最好 用onProgressChanged中的progres==100回调。
后台耗电 WebView加载网页,WebView会本身开启一些线程,若是你没有正确地将WebView销毁的话,会致使电量居高不下。接调用System.exit(0);
后台没法释放js 致使耗电。在Activity.onDestroy()中直接调用System.exit(0),使得应用程序彻底被移出虚拟机,这样就不会有任何问题了。 [参考那些年在WebView上踩过的坑](blog.csdn.net/u012124438/… details/53401663)
Binder是什么? Binder是由四个模块组成,Binder Driver 、Binder Client、Binder Server、 Server Manager。 Binder Client至关于客户端,Binder Server至关于服务器, ServerManager至关于DNS服务器,Binder Driver 至关于一个路由器。 Binder Driver位于内核空间,主要负责Binder通讯的创建,以及其在进程见得传递和Binder引用计数管理/数据包的传输等。Binder Server与 Binder Client之间的跨进程通讯则经过Binder Driver转发。对于 Binder Client只须要知道本身要使用Binder的名字以及该binder实体在 Server Manager中的0号引用便可。ServerManager就是一个标准的BinderServer,而且在Android中约定其在Binder通讯过程当中惟一标识符永远是0。
名称 | 优势 | 缺点 | 适用场景 |
---|---|---|---|
AIDL | 1.功能强大;2.支持实时通讯;3.支持一对多并发通讯;4.支持RPC(远程过程调用) | 1.使用复杂,需建立AIDL文件;2.需处理好线程同步问题 | 低并发的一对多即时通讯,无RPC要求,不须要处理多线程) |
Messenger | 1.使用简单,轻量级;2.支持实时通讯;3.支持一对多串行通讯 | 1.功能简单;2.不支持RPC;3.数据经过message传输;4.不支持高并发场景;5.服务端想要回应客户端,必须经过Message的replyTo把服务端的Messenger传递过去 | 一对多且有RPC需求,想在服务里处理多线程的业务) |
client端: client端要拿到返回值,须要把client的Messenger做为msg.replyTo参数传递过去,service端处理完以后,在调用客户端的Messenger的send(Message msg)方法把返回值传递回client
建立 AIDL 建立要操做的实体类,实现 Parcelable 接口,以便序列化/反序列化 新建 aidl 文件夹,在其中建立接口 aidl 文件以及实体类的映射 aidl 文件 Make project ,生成 Binder 的 Java 文件
服务端 建立 Service,在其中建立上面生成的 Binder 对象实例,实现接口定义的方法 在 onBind() 中返回
客户端 实现 ServiceConnection 接口,在其中拿到 AIDL 类 bindService() 调用 AIDL 类中定义好的操做请求 操做请求