android intent 及自定义消息传递
1,android自定义消息。
Looper,MessageQueue,Message,Handler
1, 先看下这几个类的关系,MessageQueue是一个包含了Message的队列。一个Looper中包含有一个MessageQueue, Message中有对Handler(消息的处理者)的引用。
2,一个android的主线程中有且仅有一个Looper,当程序启动时这个looper就开始不断的从MessageQueue里取出消息来进行处理。应该是一个while的循环。
当没有消息时,messageQueue.next()就处于阻塞状态,直到有新的消息取出。
3,新开一个线程是默认是没有Looper的。但是也可以给它加一个Looper,有了Looper这个线程就可以进行消息处理了。
4,在同一个app中,其它线程可以取的主线程的Looper,这样就可以实现子线程和主线程之间的通信。
Looper.loop();方法的源码,当执行这个时就进入了消息循环。
public static final void loop() {
Looper me = myLooper();
MessageQueue queue = me.mQueue;
while (true) {
Message msg = queue.next(); // might block
//if (!me.mRun) {
// break;
//}
if (msg != null) {
if (msg.target == null) {
// No target is a magic identifier for the quit message.
return;
}
if (me.mLogging!= null) me.mLogging.println(
">>>>> Dispatching to " + msg.target + " "
+ msg.callback + ": " + msg.what
);
msg.target.dispatchMessage(msg);
if (me.mLogging!= null) me.mLogging.println(
"<<<<< Finished to " + msg.target + " "
+ msg.callback);
msg.recycle();
}
}
}
Looper me = myLooper();
MessageQueue queue = me.mQueue;
while (true) {
Message msg = queue.next(); // might block
//if (!me.mRun) {
// break;
//}
if (msg != null) {
if (msg.target == null) {
// No target is a magic identifier for the quit message.
return;
}
if (me.mLogging!= null) me.mLogging.println(
">>>>> Dispatching to " + msg.target + " "
+ msg.callback + ": " + msg.what
);
msg.target.dispatchMessage(msg);
if (me.mLogging!= null) me.mLogging.println(
"<<<<< Finished to " + msg.target + " "
+ msg.callback);
msg.recycle();
}
}
}
转载于:https://www.cnblogs.com/talk/archive/2012/04/13/2445282.html