1.广播接受者 BroadcastReceiver
有俩种注册方式
1.传统注册方式,可以在清单文件中注册,也可以通过代码动态注册,广播分为有序广播,和无序广播
2.通过LocalBroadcastManager发送广播,
发送的广播只会在当前APP中传播,不会泄露给其它APP,确保了数据传输的安全。
其它APP的广播无法发送到本APP中,不用担心安全漏洞被其它APP所利用。
比系统全局广播更加高效。
它们俩个的区别
LocalBroadcastManager和BroadcastReceiver 的根本区别,BroadcastReceiver 的通信是走 Binder 机制,所以可以跨进程通信,LocalBroadcastManager 核心实现实际还是 Handler,因为是 Handler 实现的应用内的通信,这就可以理解上述所说的三个优点,本APP通信、不受非本APP广播影响、效率高,并且无法跨进程通信。
IntentService
使用了IntentService最起码有两个好处,一方面不需要自己去new Thread了;另一方面不需要考虑在什么时候关闭该Service了。IntentService是一个基于Service的一个类,用来处理异步的请求。你可以通过startService(Intent)来提交请求,该Service会在需要的时候创建,当完成所有的任务以后自己关闭,且请求是在工作线程处理的。
主要就是继承IntentService
然后复写onHandleIntent方法,根据传入的intent来选择具体的操作
@Override
protected void onHandleIntent(Intent intent)
{
if (intent != null)
{
final String action = intent.getAction();
if (ACTION_UPLOAD_IMG.equals(action))
{
final String path = intent.getStringExtra(EXTRA_IMG_PATH);
handleUploadImg(path);
}
}
}
在子线程中创建 Handler and 创建子线程Handler
new Thread(new Runnable() { //在子线程new Handler
@Override
public void run() {
Looper.prepare();
mHandler = new Handler(Looper.myLooper());
Looper.loop();
}
}).start();
HandlerThread handlerThread = new HandlerThread("HandlerThread"); // 创建子线程handler
handlerThread.start();
Handler mHandler = new Handler(handlerThread.getLooper()){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Log.d("HandlerThreadActivity.class","uiThread2------"+Thread.currentThread());//子线程
}
};
Log.d("HandlerThreadActivity.class","uiThread1------"+Thread.currentThread());//主线程
mHandler.sendEmptyMessage(1);
Handler机制的角色和职责
1 MessageQueue 消息队列存储消息的容器,可以向其中添加、取出消息。遵循先进先出的原则。
2 Handler
负责将消息发向消息容器即MessageQueue中。
3 Looper 轮训器
通过调用自身的loop方法,不断的从消息队列当中取出消息并发送给target(即handler)处理消息。当消息队列当中没有轮训消息时,它就处于堵塞状态。
Android 中 handler机制工作原理
handler 机制想要起作用有三个步骤1.创建Looper2.创建Handler 3.调用Looper的loop方法,
Android中 遵循这三点 默认这个应用程序都是通过ActivityThread类启动, 这个类中负责创建所有Activity,并回调每个Activity生命周期方法,在这个类中会默认创建一个main线程(主线程)
创建Looper和调用loop方法的工作android sdk 已经做好,所以平时使用的时候只用创建handler发送消息就可以了
ActivityTherad类 main入口中会 调用 Looper.prepareMainLooper(); 然后在里边有个 prepare(false)在这里边会去用TheradLocal.set方法(new Looper)
ThreadLocal在我们的线程当中用于去保存一些变量信息,默认情况下,创建一个与线程相关的一个对象,是通过threadLocal存储的它有set和get方法 set是把变量设置到TheradLocal当中,get是获取出来因为当前线程是主
线程所以默认ThreadLocal是没有储存然后就会去newLooper
Looper对象初始化的时候就会去创建MessageQuene,
在这当中去创建looper的时候会默认创建MessageQuene,所以android自动创建了主线程Looper和MessageQuene();
handle和MessageQuene联系在一起是因为初始化handler的时候有个Looper.myLooper();在这个方法中会返回一个ThreadLocal.get();默认情况下android已经创建了主线程Looper对象并存储在ThreadLocal中,所以此处返回的
就是主线程的Looper对象,所以当在Activity中创建handler的时候,它就和消息队列关联起来了
总结在主线程中我们不用去创建Looper是因为 已经创建好了
重定向
就是俩次请求request 第一次客户段请求 A ,然后服务端响应,并response(响应)回来,告诉我应该去B,
重定向可以访问自己web应用以外的资源。在重定向的过程中,传输的信息会被丢失