android Launcher学习总结

2023-11-09

一、Launcher功能介绍

        Launcher简称HomeScreen,是android手机加载完毕后第一个启动的应用程序,它负责除应用本身操作外的所有操作,包括有几个桌面、点击应用程序图标启动应用程序、长时间按桌面出现上下文菜单、长按桌面图标出现垃圾箱、长按桌面应用程序后可以移动位置和设置壁纸等,虽然它负责的操作看是很多,但它和普通的应用程序具有一样的权限。

二、Launcer 中一些重要的类及其功能描述

       为了成为系统启动后第一个启动的应用程序,Launcher必须在其AndroidManifest.xml中添加<category  android:name="android.intent.category.HOME" />属性。                                

AddAdapter .java:                        长按桌面后弹出的添加到桌面对话框所对应的适配器。

AllApps2D.java:                            用于存储和现实所有应用程序列表 的视图。                                                                                                                                                    

DeleteZone.java:                         代表长按桌面应用程序所出现的删除按钮。                                                                                                                                                                   

DragController.java:                    用于控制拖动应用程序过程的类。                                                                                                                                                                                 

DragSource:.java                         定义一个可以成为拖动对象的接口。                                                                                                                                                                              

DragTarget.java:                          定义一个可以接受并处理拖动的接口。                                                                                                                                                                           

InstallShortcutReceiver.java:    安装快捷方式的接听器。                                                                                                                                                                                                   

Launcher.java:                             Launcher应用程序从Launcher开始执行。                                                                                                                                                            

LauncherModel.java:                  维护Launcher在内存中的状态,提供与数据库进行交互的API。                                                                                                                              

ShortcutAdapter.java:                 显示添加快件方式对话框                                                                                                                                                                                                  

UnstallShortcutReceiver.java:  卸载快捷方式的接听器。                                                                                                                                                                                                  

Workspace.java:                         所有屏幕的集合,实现主屏幕的拖动效果。                                                                                                                                                                  

CellLayout.java:                          代表桌面上的一屏。

三、Launcher应用程序列表内容读取过程

       Launcher从onCreate函数开始执行,初始化了一些变量,调用mModel.startLoader函数进行读取工作,LauncherModel中定义了一个Loader类,该类负责读取应用程序信息,Loader类创建一个线程LoaderThread来进行数据库的读取操作,LoaderThread中调用loadAndBindWorkspace函数实现了从数据库中读取桌面上应用程序信息,根据快捷方式、组件和文件夹区分开来存储在不同的列表中,bindWorkspace函数用来将已经存储的列表赋给Launcher对象,同时在Workspace中添加并显示这些视图对象。loadAndBindAllApps函数用来读取所有安装的应用程序信息存入列表中,并将当前列表赋给Launcher中的AllAppsView对象。

四、Launcher中桌面的滚动

       在桌面上,如果当前的事件是拖动事件,Workspace使用Scroller根据当前的移动的位置及距离进行桌面的移动效果。

五、Launcher桌面的点击事件

      首先判断当前所点击的位置放置的是什么东西,如果是快捷方式则启动当前快捷方式所代表的应用程序,如果是文件夹则显示当前文件夹中存在的内容,如果是所有应用程序列表按钮,则显示所有的应用程列表,其他情况则不进行处理。

六、Launcher中的长按事件

      如果当前长按的是桌面,则弹出添加到桌面对话框,如果有应用程序快捷方式,则根据当前的应用程序快捷方式创建一个DragView对象,当有移动事件时,移动当前的DragView对象,在拖动开始时删除区域会显示出来(DeleteZone设置为可见),当将图标拖入删除区域时,删除区域及DragView对象的背景颜色会改变,在删除区域中松开手可以实现将当前快捷方式从桌面上删除,图标离开删除区域时删除区域及DragView对象的背景会恢复成原来的样子。 在应用程序列表中,长按某个应用程序,则会关闭掉当前的应用程序列表,以后的拖动事件处理和在桌面上拖动应用程序快捷方式的效果是一样的。如果当前长按的是已打开文件夹的名字,则弹出更改文件夹名字对话框(如下图)。


七、Launcher中的拖动应用程序图标效果

      Launcher中使用WindowManager进行应用程序快捷方式的拖动。整个Android的窗口机制是基于WindowManager的,这个接口可以添加View到屏幕,也可以从屏幕删除一个View,它面向的一端是屏幕,另一端是View,直接忽略了Activity或者Dialog等东西,WindowManager是全局的。附件是我写的一个例子。                                                                

源代码:

  1. package lzu.WindowManagerTest;  
  2.   
  3. import android.app.Activity;  
  4. import android.graphics.Bitmap;  
  5. import android.graphics.BitmapFactory;  
  6. import android.graphics.PixelFormat;  
  7. import android.os.Bundle;  
  8. import android.view.Gravity;  
  9. import android.view.MotionEvent;  
  10. import android.view.View;  
  11. import android.view.WindowManager;  
  12. import android.widget.ImageView;  
  13.   
  14. public class WindowManagerTest extends Activity {  
  15.     /** Called when the activity is first created. */  
  16.       
  17.     private float mPosX;  
  18.     private float mPosY;  
  19.       
  20.     Bitmap bitmap;  
  21.       
  22.     WindowManager.LayoutParams mWindowParams;  
  23.       
  24.     WindowManager mWindowManager;  
  25.       
  26.     ImageView v;  
  27.       
  28.     @Override  
  29.     public void onCreate(Bundle savedInstanceState) {  
  30.         super.onCreate(savedInstanceState);  
  31.           
  32.         setContentView(R.layout.main);  
  33.          
  34.         bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.button);  
  35.           
  36.         addViewToWindowManage(bitmap, 200200);  
  37.     }  
  38.       
  39.     public boolean onTouchEvent(MotionEvent motion){  
  40.         switch(motion.getAction()){  
  41.         case MotionEvent.ACTION_DOWN:  
  42.             mPosX = motion.getX();  
  43.             mPosY = motion.getY();  
  44.             return true;  
  45.         case MotionEvent.ACTION_MOVE:  
  46.             mPosX = motion.getX();  
  47.             mPosY = motion.getY();  
  48.             updateViewPosition(v, (int)mPosX,(int) mPosY);  
  49.             return true;  
  50.         case MotionEvent.ACTION_UP:  
  51.             removeView(v);  
  52.             return true;  
  53.         }  
  54.           
  55.         return true;  
  56.     }  
  57.      
  58.     void addViewToWindowManage(Bitmap bm, int x, int y) {  
  59.         mWindowParams = new WindowManager.LayoutParams();  
  60.         mWindowParams.gravity = Gravity.LEFT | Gravity.TOP;  
  61.         mWindowParams.x = x;  
  62.         mWindowParams.y = y;  
  63.         mWindowParams.height = WindowManager.LayoutParams.WRAP_CONTENT;  
  64.         mWindowParams.width = WindowManager.LayoutParams.WRAP_CONTENT;  
  65.         mWindowParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE  
  66.                 | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE  
  67.                 | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON  
  68.                 | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;  
  69.         mWindowParams.format = PixelFormat.TRANSLUCENT;  
  70.         mWindowParams.windowAnimations = 0;  
  71.         v = new ImageView(this);  
  72.         v.setImageBitmap(bm);  
  73.         mWindowManager = (WindowManager) this.getSystemService("window");  
  74.         mWindowManager.addView(v, mWindowParams);  
  75.     }  
  76.       
  77.     void updateViewPosition(View v,int x,int y){  
  78.         mWindowParams.alpha = 1.0f;  
  79.         mWindowParams.x = x ;  
  80.         mWindowParams.y = y;  
  81.         mWindowManager.updateViewLayout(v, mWindowParams);  
  82.     }  
  83.       
  84.     void removeView(View v){  
  85.         mWindowManager.removeView(v);;  
  86.     }  
  87. }  
代码包下载地址: http://download.csdn.net/source/3521066

效果截图为:


由于本人表达能力有限,如果出现什么表达不清或者意思不清楚的,请您和我联系,谢谢您~

本文系“暑期大学生博客大赛-2011 Android成长篇“参赛文章

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android Launcher学习总结 的相关文章

  • 类型容器“Android 依赖项”引用不存在的库 android-support-v7-appcompat/bin/android-support-v7-appcompat.jar

    我在尝试在我的项目中使用 Action Bar Compat 支持库时遇到了某种错误 我不知道出了什么问题 因为我已按照此链接中的说明进行操作 gt http developer android com tools support libr
  • StrictMode 策略违规:我的应用程序中存在 android.os.strictmode.LeakedClosableViolation?

    Android 开发新手 第一次在我的应用程序上尝试 StrictMode 我注意到以下内容 并想知道这是否是我的应用程序或库中的问题 我不太清楚 谢谢你 D StrictMode StrictMode policy violation a
  • 如何重试已消耗的 Observable?

    我正在尝试重新执行失败的已定义可观察对象 一起使用 Retrofit2 和 RxJava2 我想在单击按钮时重试特定请求及其订阅和行为 那可能吗 service excecuteLoginService url tokenModel Ret
  • Sqlite数据库生命周期?关闭应用程序后它会被删除吗?

    我正在遵循一个简单的教程 该教程创建一个从 SQLiteOpenHelper 扩展的类 并创建一个包含一个表和 5 行的数据库 好的 但我需要更多地了解 android Sqlite 数据库 例如 如果应用程序关闭或手机关机会发生什么 数据
  • 在 Android Studio 中,为什么我必须在模拟器中单击“运行应用程序”两次才能启动应用程序?

    在 Android Studio 中 当我按播放按钮在 Android 模拟器上安装并运行应用程序时 大约 5 10 秒后 我在屏幕底部收到一条消息 显示 安装成功 但应用程序实际上并未运行在模拟器上 我必须再次按下播放按钮 这是非常令人沮
  • 在 ViewPager Fragments 中使用 Master/Detail 模板(下载链接)

    工作代码 https github com lukeallison ViewPagerMasterDetail https github com lukeallison ViewPagerMasterDetail Android 主 详细流
  • Android 后退按钮无法与 Flutter 选项卡内的导航器配合使用

    我需要在每个选项卡内有一个导航器 因此当我推送新的小部件时 选项卡栏会保留在屏幕上 代码运行得很好 但是 android 后退按钮正在关闭应用程序而不是运行 Navigator pop import package flutter mate
  • CardView 圆角获得意想不到的白色

    When using rounded corner in CardView shows a white border in rounded area which is mostly visible in dark environment F
  • android xamarin 中的 reCaptcha

    我想在 Xamarin android 应用程序中实现验证码 我抓住了这个在 Android 中集成 googles reCaptcha 验证 https www c sharpcorner com article how to integ
  • 当文本输入聚焦在 React Native for Android 的底部工作表上时,视图移出屏幕

    我正在使用图书馆 https github com osdnk react native reanimated bottom sheet https github com osdnk react native reanimated bott
  • 在 java 类和 android 活动之间传输时音频不清晰

    我有一个android活动 它连接到一个java类并以套接字的形式向它发送数据包 该类接收声音数据包并将它们扔到 PC 扬声器 该代码运行良好 但在 PC 扬声器中播放声音时会出现持续的抖动 中断 安卓活动 public class Sen
  • 使用 Android 发送 HTTP Post 请求

    我一直在尝试从 SO 和其他网站上的大量示例中学习 但我无法弄清楚为什么我编写的示例不起作用 我正在构建一个小型概念验证应用程序 它可以识别语音并将其 文本 作为 POST 请求发送到 node js 服务器 我已确认语音识别有效 并且服务
  • 是否有 ADB 命令来检查媒体是否正在播放

    我想使用 ADB 命令检查根植于终端的外部设备中是否正在播放音频 视频 我无法找到任何 ADB 命令 如果有 我尝试过 adb shell dumpsys media player 我想要一个命令来指定视频是否正在运行 您可以使用以下命令查
  • 发布android后更改应用内购买项目的价格

    在 Google Play 上发布后 是否可以更改应用内购买商品的价格 我假设该应用程序也已发布 完整的在线文档位于http developer android com http developer android com也http sup
  • 你的CPU不支持NX

    我刚刚下载了 android studio 但是我遇到了一个问题 当我运行它时 它说你的 cpu 不支持 NX 我应该怎么办 NX 或实际上是 NX 处理器位 是处理器的一项功能 有助于保护您的 PC 免受恶意软件的攻击 当此功能未启用并且
  • 在两个活动之间传输数据[重复]

    这个问题在这里已经有答案了 我正在尝试在两个不同的活动之间发送和接收数据 我在这个网站上看到了一些其他问题 但没有任何问题涉及保留头等舱的状态 例如 如果我想从 A 类发送一个整数 X 到 B 类 然后对整数 X 进行一些操作 然后将其发送
  • Android访问远程SQL数据库

    我可以直接从 Android 程序访问远程 SQL 数据库 在网络服务器上 吗 即简单地打开包含所有必需参数的连接 然后执行 SQL 查询 这是一个私人程序 不对公众开放 仅在指定的手机上可用 因此我不担心第三方获得数据库访问权限 如果是这
  • 增加活动的屏幕亮度

    显然 Android 操作系统中至少有三种不同的技术可以改变屏幕亮度 其中两个在纸杯蛋糕之后不再起作用 而第三个被接受的技术显然有一个错误 我想在单视图活动开始时增加屏幕亮度 然后在活动结束时将亮度恢复为用户设置 没有按钮 没有第二个视图或
  • 一次显示两条Toast消息?

    我希望在一个位置显示一条 Toast 消息 并在另一位置同时显示另一条 Toast 消息 多个 Toast 消息似乎总是按顺序排队和显示 是否可以同时显示两条消息 是否有一种解决方法至少可以提供这种外观并且不涉及扰乱活动布局 Edit 看来
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591

随机推荐

  • Vue-cli实现登录和重置功能

    Vue cli实现登录和重置功能 1 项目初始化 安装Vue脚手架 npm install g vue cli 通过Vue脚手架创建项目 在cmd命令行中输入 vue ui 使用图形化界面创建项目 配置Vue路由 配置Elment UI组件
  • Android使用Toolbar来添加右上角菜单

    好久没写东西了 最近学到了很多东西但是也非常忙 把一些知识积累一下 先上个效果图 很常见的一个需求 我们来看下怎么实现的 非常简单 activity main xml
  • 解决远程仓库配置密钥后,进行代码提交操作输入密码无效的问题

    问题产生 在开发的过程中 进行代码提交 弹出远程仓库需要录入密码 即使填入正确的密码也无反应 解决思路 公钥与私钥首先要配置正确 但配置完后依然无法生效 原因是git默认没有用已生成的公钥私钥的配置文件 在git的安装目录 Git etc
  • 分块矩阵计算行列式三板斧

    第一板斧 上下三角分块 第二板斧 对角为0零的分块 第三板斧 全分块 小招 A 2 B 2 其他招式 利用特征值计算行列式
  • pull request 时遇到 conflicted 的解决方法

    今天 pull request 的时候遇到了 conflicted 的问题 发现是因为相比于最开始 fork 的内容 原仓库的内容发生了变化 而我 fork 后的仓库没有及时更新 于是 首先点击 fork from 后的刷新标识 同步 fo
  • Unity学习笔记05-场景切换和加载

    Unity场景简介 场景 顾名思义就是我们在游戏中所看到的物品 建筑 人物 背景 声音 特效等 基本上和我们玩游戏时所看到的游戏 场景 是同一个概念 Unity3D中 场景 是一个视图 我们通过 场景 这个视图 来编辑 布置游戏中玩家所能见
  • Java Stream使用多个过滤器(filter)或复杂条件方法用法及简单写法代码

    本文主要介绍Java中 对List列表集合stream等 使用多个过滤器 filter 进行数据筛选 或使用复杂条件过滤数据的方法 以及简单写法代码 原文地址 Java Stream使用多个过滤器 filter 或复杂条件方法用法及简单写法
  • Go 编程学习路线

    安装IED vscode atom subl 插件安装错误总结 入门 go by example the way to go go web 编程 豆瓣 提升书籍 The Go Programming Language 2015 11 pdf
  • Oracle查看用户所在的表空间

    oracle 查看表空间有哪些表 select from dba tables where tablespace name 表空间名 注意表空间名大小写敏感 select table name tablespace name from us
  • linux的进程1:rootfs与linuxrc

    在内核启动的最后阶段启动了三个进程 进程0 进程0其实就是刚才讲过的idle进程 叫空闲进程 也就是死循环 进程1 kernel init函数就是进程1 这个进程被称为init进程 进程2 kthreadd函数就是进程2 这个进程是linu
  • 2023年6月电子学会Python等级考试试卷(四级)答案解析

    青少年软件编程 Python 等级考试试卷 四级 分数 100 题数 38 一 单选题 共25题 共50分 1 下列程序段的运行结果是 def s n if n 0 return 1 else return n s n 1 print s
  • Linux服务器EDAC CE memory read error

    之前在大数据集群中 有一台服务器的CPU占用总是莫名其妙飙高 就算执行简单任务也会耗费很长时间 且reboot不能解决问题 检查了各种可能的问题之后 最终在查看dmesg命令的设备信息时 发现大量如下的日志 1180532 573917 E
  • STL 小结

    看C STL一个月了 小结下这个阶段的学习所得 容器是以class template完成 内存管理师由memory pool完成 算法是由function template完成 仿函数 函数对象 是一种将operation 重载了的clas
  • SpringCloud整合Hystrix熔断器

    文章目录 SpringCloud整合Hystrix熔断器 1 什么是Hystrix 2 服务调用雪崩 3 线程隔离和服务降级 线程隔离原理 服务降级 4 实现Hystrix服务降级 导入springCloud的Hystrix依赖 注解启动类
  • rc=20 > Connect to SAP gateway failed

    这种错误 我是在一台用户的电脑上碰到的 解决方案很简单 把Computer Name换成英文 汗了许久
  • BUUCTF题目N1BOOK部分wp(持续更新)

    第九章 CTF之MISC章 两个部分的flag 附件 stego png 隐写了一个zip文件 zip文件里面是 2 jpg stego png 2 jpg stego png 用 StegSolve Data Extract BGR LS
  • leaflet 添加 wms

  • pytorch5-各种常用激活函数

    import matplotlib pyplot as plt import torch from torch import nn x torch linspace 6 6 10 sigmoid nn Sigmoid sigmoid激活函数
  • logback--基础--04--配置--appender

    logback 基础 04 配置 appender 代码位置 https gitee com DanShenGuiZu learnDemo tree master logback learn 1 根节点 lt configuration g
  • android Launcher学习总结

    一 Launcher功能介绍 Launcher简称HomeScreen 是android手机加载完毕后第一个启动的应用程序 它负责除应用本身操作外的所有操作 包括有几个桌面 点击应用程序图标启动应用程序 长时间按桌面出现上下文菜单 长按桌面