在Android应用的线程中有几个Handler几个Lopper几个Message几个MessageQueue
在Android应用的线程中,通常会涉及以下概念:
1. **Handler:** 通常一个线程可以拥有多个Handler,每个Handler与特定的MessageQueue相关联,用于向该线程发送消息。你可以创建多个Handler对象,每个Handler与特定的Looper关联。
2. **Looper:** 每个线程都有一个Looper,它用于维护消息队列(MessageQueue)。通常,一个线程只有一个Looper。Looper的主要作用是不断地从MessageQueue中获取消息并将其分发给相应的Handler。
3. **MessageQueue:** 每个线程都有一个关联的MessageQueue,用于存储消息对象。这个队列按照消息的时间戳进行排序,以确保消息按顺序处理。
4. **Message:** 每个消息对象包含了要执行的操作和相关的数据。消息会被Handler发送到MessageQueue中,并在Looper处理时被分发到相应的Handler来执行操作。
总结一下:
- 通常,一个线程拥有一个Looper和一个MessageQueue。
- 一个线程可以有多个Handler,每个Handler与相同线程的Looper关联。
- Message对象是要在线程中执行的操作的封装。
这种设计使得Android应用可以轻松地进行线程间通信和处理异步任务,同时保持了线程的单一性,避免了多线程竞争和同步问题。
1. SingleTask模式的运用场景
最常见的应用场景就是保持我们应用开启后只有一个Activity的实例,最典型的例子就是应用中展示的主页(Home页)。假设用户在主页跳转到其它页面,执行多次操作后想返回到主页,如果不使用SingleTask模式,在点击返回的过程中会多次看到主页,这明显就是设计不合理了
. SingleTop模式的运用场景
如果你在当前的Activity中又要启动同类型的Activity,此时建议将此类型Activity的启动模式指定为SingleTop,可以减少Activity的创建,节省内存!比如消息聊天页面,当你收到个消息,如果消息页面在栈顶则不用创建否则需要创建下
#include <Windows.h>
// 窗口句柄
HWND g_hWnd = nullptr;
// 横屏和竖屏的标志
bool g_isLandscape = true;
// 窗口过程函数
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_SIZE:
// 检查窗口大小,以确定横屏或竖屏
if (LOWORD(lParam) > HIWORD(lParam))
{
// 竖屏
g_isLandscape = false;
}
else
{
// 横屏
g_isLandscape = true;
}
// 在这里根据 g_isLandscape 来更新界面布局
return 0;
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
// 在这里绘制界面元素
if (g_isLandscape)
{
// 横屏布局
TextOut(hdc, 100, 100, L"Landscape Layout", 16);
}
else
{
// 竖屏布局
TextOut(hdc, 100, 100, L"Portrait Layout", 14);
}
EndPaint(hWnd, &ps);
}
return 0;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
// 程序入口
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
// 注册窗口类
WNDCLASSEX wcex = { sizeof(WNDCLASSEX), CS_HREDRAW | CS_VREDRAW, WndProc, 0, 0, GetModuleHandle(nullptr), nullptr, nullptr, (HBRUSH)(COLOR_WINDOW + 1), nullptr, L"AdaptiveLayoutApp", nullptr };
RegisterClassEx(&wcex);
// 创建窗口
g_hWnd = CreateWindow(L"AdaptiveLayoutApp", L"Adaptive Layout App", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, GetModuleHandle(nullptr), nullptr);
if (!g_hWnd)
{
return FALSE;
}
// 显示窗口
ShowWindow(g_hWnd, nCmdShow);
UpdateWindow(g_hWnd);
// 主消息循环
MSG msg = {};
while (GetMessage(&msg, nullptr, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}