Android基础知识总结

龙脑抑菌剂Android基础知识总结
⽬录
⼀、Activity与Fragment
1. Activity各种情况下的⽣命周期:onCreate,onStart,onResume,onRestart, onPause,onStop,onDestory.
2. Activity与Fragment之间⽣命周期⽐较
3. Activity的四种启动模式对⽐
4. Activity状态保存与恢复:复写onSaveInstanceState和onRestoreInstanceState
5. Fragment状态保存startActivityForResult是哪个类的⽅法,在什么情况下使⽤?总结起来就是:从哪⾥发起调⽤,最终就会⾛到哪
⾥。
1.⽤getActivity⽅法发起调⽤,只有⽗Activity的onActivityResult会调⽤,Fragment中的onActivityResult不会被调⽤;
2.直接发起startActivityForResult调⽤,当前的Fragment的onActivityResult,和⽗Activity的onActivityResult都会调⽤;
3.⽤getParentFragment发起调⽤,则只有⽗Activity和⽗Fragment的onActivityResult会被调⽤,当前的Fragment的onActivityResult不会被调⽤。
这⾥2和3的前提是如果⽗activity中重写了onActivityResult,⽗Activity的onActivityResult中必须添加ActivityResult()。
1. 如何实现Fragment的滑动:ViewPager
2. fragment之间传递数据的⽅式?
1. 通过所在Activity中的set, get ⽅法;
2. 利⽤bundle 和setArguments进⾏参数传递;
3. EventBus;
⼆、Service
1. Service 启动⽅法与⽣命周期:
传动力工作室1.  startService启动类型的服务: onCreate()- >onStartCommand()->Service running--调⽤context.stopService() ->onDestroy() 。
2. bindService 绑定类型的服务: onCreate()->onBind()->Service running--调⽤>onUnbind() -> onDestroy()
2. Service与Activity之间通信的⼏种⽅式:
1. 在startService 时,把数据通过Intent传递过去;
2. bindservice时,实现ServiceConnection;
3. 注册Callback的⽅式;
3.IntentService
⼀个继承⾃Service的抽象类,⾥⾯封装了Handler和HandlerThread,⼦线程运⾏。所有任务结束后能⾃动销毁。
4.service保活
1. onStartCommand 中返回START_STICKY;
2. 在onDestory中启动该服务;
3. 同时开启两个进程和服务;
AIDL
1. 使⽤⽅法;
2. 客户端与服务端挂了怎么办?DeadObjectException,
:注册死亡代理DeathRecipient,当binder死亡后,系统会回调binderDied⽅法 。
:客户端在注册时把客户端的binder传给服务端,并调⽤binder.linkToDeath注册死亡代理(在服务端处理),当客户端挂了时,服务端就知道了。
当binder断开连接后,系统会回调onServiceDisconnected,然后我们可以重连服务。
inout等参数作⽤:
ca3780三、ContentProvider
1. ContentProvider的原理: ,难点主要在获取ContentResolver的获取流程。
2. ContentProvider、ContentResolver、ContentObserver 之间的关系:使⽤ContentResolver来获取ContentProvider提供的数
据,同时注册ContentObserver监听Uri数据的变化
3. ContentProvider 是如何实现数据共享的?
1. getContentResolver:返回的ContentResolver是在ContextImpl 中创建,⼀个ApplicationContentResolver对象;
2. 调⽤增删改查⽅法时,是调⽤acquireProvider(返回⼀个IContentProvider 对象)的增删改查⽅法;
3. 调⽤ContentProvider⽅法---startProcessLocked---ActivityThread.installProvider---
4. ContentProvider的权限管理(解答:读写分离,权限控制-精确到表级,URL控制)
四、BroadcastReceiver
usb转并口1. 请描述⼀下⼴播BroadcastReceiver的理解,⼴播使⽤的⽅式和场景。
2. Receive() 中不可以开启新的线程来进⾏耗时的操作。在Receive()⽅法收到⼴播,开启
⼀个线程,接着它返回也就是执⾏完毕后,系统会认为BroadcastReceiver不在处于活动状态。因此不在需要起托管进程(除⾮其他应⽤程序组件处于活动状态,如Activity,Service)。因此系统可能随时终⽌进程来回收内存,并且这样会终⽌进程中运⾏的线程。
3. BroadcastReceiver,LocalBroadcastReceiver 区别:LocalBroadcastReceiver⽤于内部传递消息,更⾼效安全,只能动态注
册。依托LocalBroadcastManager使⽤。  原理:借助⼀个静态单例类LocalBroadcastManager。静态保证了他⼀旦创建就基本上与application⼀样的⽣命周期。他持有 所有register到他⾥⾯的broadcast的引⽤。因此需要利⽤他发⼴播时,就可以⽴即拿到这个broadcast引⽤ 调⽤ 这个broadcast对象的onReceive⽅法。
4. BroadcastReceiver与EventBus⽐较:⼴播资源消耗⾼、需要Context,能⽤于跨进程。EventBus调⽤灵活,不依赖Context;使⽤
简单,Subscriber 即可。但逻辑性不是很好,适合统⼀进程。
五、⼀些View
六、Context问题
ApplicationContext和ActivityContext的区别:ApplicationContext 不应该⽤于界⾯相关的地⽅,ActivityContext 可能使得对象不能及时被释放,从⽽引发内存泄漏。
进程和 Application 的⽣命周期:
在⼤多数情况下,每个Android应⽤程序都在⾃⼰的Linux进程中运⾏。当需要运⾏某些代码时,将为应⽤程序创建此过程,并且该过程将⼀直运⾏,直到不再需要它为⽌,并且 系统需要回收其内存以供其他应⽤程序使⽤。
七、Handler
Handler实现原理
Handler机制和底层实现:handler通过sendMessage把消息发送到MessageQueue⾥⾯, 参考如下:
boolean enqueueMessage(Message msg, long when) {
//这⾥处理的普通消息必须是包含Handler的,下⾯会提及⼀个同步屏障消息,它其中不包含Handler
if (msg.target == null) {
throw new IllegalArgumentException("Message must have a target.");
}
//存在已经消费过的标记,不在继续添加
if (msg.isInUse()) {
throw new IllegalStateException(msg + " This message is already in use.");
}
synchronized (this) {
if (mQuitting) {
//如果Queue已经退出,则将消息recycler
return false;
}
//标记使⽤状态
msg.markInUse();
//设置延迟时间
msg.when = when;
塑料光纤收发器
//mMessage是⼀个全局变量,代表MessageQueue的头节点
Message p = mMessages;
/
/头节点为空或者等待时间⼩于头节点那么都放在队列的前端
if (p == null || when == 0 || when < p.when) {
//给msg的上⼀个节点赋值,这⾥将头节点设置为下⼀个,当前msg为头节点
< = p;
//给头节点赋值
mMessages = msg;
} else {
Message prev;
for (;;) {
//⽐较时间,将消息按照时间进⾏排列
prev = p;
p = p.next;
if (p == null || when < p.when) {
break;
}
}
//将消息插⼊合适的位置
< = p;
//这⾥也就是⼀个排队的逻辑
< = msg;
}低通滤波器设计
}
return true;
}
原⽂链接:blog.csdn/wcy0312808/article/details/90295965
Looper中有个for循环不断调⽤读取消息(nativePollOnce),底层采⽤的是pipe/epoll机制,⽆消息时会释放CPU从⽽不会导致阻塞。 最终调⽤Message.target.dispatchMessage ,⾥⾯具体实现如下:
public void dispatchMessage(Message msg) {
if (msg.callback != null) {
handleCallback(msg);
} else {
if (mCallback != null) {
if (mCallback.handleMessage(msg)) {
return;
}
}
handleMessage(msg);
}
}
handler.post(...) //第⼀优先级:执⾏post所传递的Runnable参数.run()
new Handler(callback) //第⼆优先级:执⾏构造⽅法传来的callback匿名内部类handleMessage(msg)
handlerMessage(msg)//第三优先级:调⽤Handler的handlerMessage()⽅法
1. Handler、Thread和HandlerThread的差别
2. handler发消息给⼦线程,looper怎么启动?  调⽤Loop.prepare() 与Loop.loop()。
3. 关于Handler,在任何地⽅new Handler 都是什么线程下? - 不传参数时,在什么线程下new,就和什么线程绑定。在⼦线程new时,
要调⽤Loop.prepare();Loop.loop()

本文发布于:2024-09-23 17:21:58,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/4/329208.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:消息   节点   需要
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议