首先从四大组件说起:
Activity:
生命周期:
activity三种状态:运行(运行在最前端)、停止(不可见,完全被覆盖)、暂停(可见,但前端还有其他activity)
生命周期相关的方法:onCreate-onStart-onResume-onPause-onStop-onDestory-onRestart
切换时如果要保存数据, 可以重写: onSaveInstanceState();
恢复数据时, 重写: onRestoreInstanceState();
启动模式:
1.standard:默认的,每次调用startActivity()启动时都会创建一个新的activity放在栈顶
2.singleTop:启动Activity时,指定Activity不在任务栈栈顶就创建,如在栈顶,则不会创建,会调用onNewInstance(),复用已经存在的实例。
3.singleTask:在任务栈里面只允许一个实例,如果启动activity不存在就创建,如果存在直接跳转到指定Activity所在位置。
4.singleInstance:开启一个新的任务栈来存放这个Activity的实例,此模式开启的Activity是运行在自己单独的任务栈中的。
2.BroadcastReceiver广播接收者
有序广播用过调用abortBroadcast()方法来中断,接收者之间可以传递数据
动态注册广播register,取消unregister
广播接收者打开Activity,需要设置一下Intent.FLAG_ACTIVITY_NEW_TASK
应为广播接收者是没有Activity任务栈的
sendOrderBroadcast()发送有序广播
1)静态注册:在AndroidManifest.xml注册,android不能自动销毁广播接收器,也就是说当应用程序关闭后,还是会接收广播。
2)动态注册:在代码中通过registerReceiver()手工注册.当程序关闭时,该接收器也会随之销毁。当然,也可手工调用unregisterReceiver()进行销毁。
3.Service服务
Service中的生命周期方法(Context调用执行):
1)startService() 如果没创建就先onCreate()再startCommand(), 如果已创建就只执行startCommand();
2)stopService() 执行onDestroy()
3)bindService() 如果没有创建就先onCreate()再onBind()
4)unbindService() 如果服务是在绑定时启动的, 先执行onUnbind()再执行onDestroy(). 如果服务在绑定前已启动, 那么只执行onUnbind();
3、开启服务的2种方式
2种不同开启方式的区别:
1)startService:
开启服务,服务一旦开启,就长期就后台运行,即使调用者退出来,服务还会长期运行;
资源不足时,被杀死,资源足够时,又会复活;
2)bindService:
绑定服务,绑定服务的生命周期会跟调用者关联起来,调用者退出,服务也会跟着销毁;
通过绑定服务,可以间接的调用服务里面的方法(onBind返回IBinder);
4、服务混合调用生命周期
一般的调用顺序:
①、start -> stop 开启 –> 结束
②、bind -> unbind 绑定(服务开启) -> 解绑(服务结束)
混合调用:
①、start –> bind -> stop->unbind->ondestroy 通常不会使用这种模式
开启 –> 绑定 –> 结束(服务停不了)->解除绑定(服务才可停掉)
②、start –> bind -> unbind -> stop 经常使用
开启 –> 绑定 –> 解绑(服务继续运行)-> stop(不用时,再停止服务)
这样保证了服务长期后台运行,又可以调用服务中的方法
4、内容提供者
这个问的非常少,但是一旦问道还是要知道怎么回事的。
ContentProvider:
在数据库中有对应的增删改查的方法,如果要让别的应用程序访问,需要有一个路径uri
通过content:路径对外暴露,uri写法:content://主机名/表名
1)ContentProvider:内容提供者
把一个应用程序的私有数据(如数据库)信息暴露给别的应用程序,让别的应用程序可以访问;
在数据库中有对应的增删改查的方法,如果要让别的应用程序访问,需要有一个路径uri:
通过content:// 路径对外暴露,uri写法:content://主机名/表名
2)ContentResolver:内容解析者
根据内容提供者的路径,对数据进行操作(crud);
3)ContentObserver:内容观察者
可以理解成android系统包装好的回调,数据发送变化时,会执行回调中的方法;
ContentResolver发送通知,ContentObserver监听通知;
当A的数据发生变化的时候,A就会显示的通知一个内容观察者,不指定观察者,就会发消息给一个路径
ContentProvider和sql的实现上的区别:
1,Contentprovider屏蔽了数据存储的细节,内部实现对用户完全透明,用户只需要i、关心操作数据的uri就可以了,ContentProvider可以实现不同app之间的共享
2,Sql也有增删改查的方法,但是sql只能查询本应用下的数据库。而Comtentprovider还可以去增删改查本地文件.xml文件的读取等
异步加载网络数据(AsyncTask)
AsyncTask类,这个类中的任务是运行在后台线程中的,并可以将结果放在UI线程中去处理
它定义了三种泛型,分别是Params、Progress和Result,分别表示请求的参数、任务的进度和获取的结果数据
执行过程:1.onPreExecte():执行在主线程。这步操作是用于准备好任务的,作为任务加载的准备工作。建议在这个方法中弹出一个提示框。
2.doInBackground():执行在子线程中。需要将请求的参数传递进来,发送给服务器,并将获取到的数据返回,数据回传给下一步的onProgressUpdate()中进行进度更新。
3.onProgressUpdate():进度更新
4.onPostExectue():界面更新
实现原理:
1.线程池的创建:默认创建一个线程池ThreadPoolExecutor,并默认创建出5个线程放入到线程池中,最多可放128个线程,且这个线程池是公共的唯一一份。
2.任务的执行:执行run方法,执行完run方法后,会调用scheduleNext()不断的从双端队列中轮询,获取下一个任务并继续放到一个子线程中执行,直到异步任务执行完毕。
3.消息的处理:在AsyncTask中维护了一个InternalHandler的类,这个类是继承Handler的,获取的数据是通过handler进行处理和发送的。其中handleMessage方法中,将消息传递给onProgressUpdate()进行进度的更新,也可以将结果发送到主线程中,进行界面的更新了。