Android成长记录

1.广播接受者 BroadcastReceiver

有俩种注册方式

1.传统注册方式,可以在清单文件中注册,也可以通过代码动态注册,广播分为有序广播,和无序广播

2.通过LocalBroadcastManager发送广播,

  1. 发送的广播只会在当前APP中传播,不会泄露给其它APP,确保了数据传输的安全。

  2. 其它APP的广播无法发送到本APP中,不用担心安全漏洞被其它APP所利用。

  3. 比系统全局广播更加高效。

它们俩个的区别

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应用以外的资源。在重定向的过程中,传输的信息会被丢失

请求转发是服务器内部把对一个request/response的处理权,移交给另外一个 
对于客户端而言,它只知道自己最早请求的那个A,而不知道中间的B,甚至C、D。
 传输的信息不会丢失。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值