android常用的必备基础知识

首先从四大组件说起: 
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()进行进度的更新,也可以将结果发送到主线程中,进行界面的更新了。
 

猜你喜欢

转载自blog.csdn.net/qq_39140779/article/details/84145847
今日推荐