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学习总结 的相关文章

随机推荐

  • 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手机加载完毕后第一个启动的应用程序 它负责除应用本身操作外的所有操作 包括有几个桌面 点击应用程序图标启动应用程序 长时间按桌面出现上下文菜单 长按桌面