一、Launcher的简单研究

1 什么是Launcher

Android系统启动后加载的第一个程序 。 这个程序是其他应用程序的入口 。

Launcher构成:

HomeScreen : (Workspace + HotSeats)  , Shortcut,LiveFolder , AppWidget , WallPaper .

AllAppList (用GridView)

2 针对Launcher的开发类型

1)开发自己的Launcher

2)在Wordspace做文章

添加Shortcut ;

添加LiveFolder ;

更改背景 ;

添加AppWidget ;

3 分析Launcher.java的onCreate()

 @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//下面一段是界面初始化工作
LauncherApplication app = ((LauncherApplication)getApplication());
mModel = app.setLauncher(this);
mIconCache = app.getIconCache();
//得到拖动组件实例
mDragController = new DragController(this);
//得到Inflater实例
mInflater = getLayoutInflater(); //得到AppWidget管理实例 : AppWidgetManager , AppWidgetHost , AppWidgetHostView三个类的关系
mAppWidgetManager = AppWidgetManager.getInstance(this);
mAppWidgetHost = new LauncherAppWidgetHost(
this, APPWIDGET_HOST_ID);
//Host启动监听,监听LauncherProvider中的数据改变
mAppWidgetHost.startListening(); if (PROFILE_STARTUP) {
android.os.Debug.startMethodTracing(
Environment.getExternalStorageDirectory() + "/launcher");
} loadHotseats();
//检查本地化语言改变
checkForLocaleChange();
//设置桌面尺寸
setWallpaperDimension(); //加载内容显示
setContentView(R.layout.launcher);
//设置动态的每个桌面视图(左右滑动的那个)
setupViews();
//注册内容观察
registerContentObservers();
//锁定应用程序
lockAllApps(); mSavedState = savedInstanceState;
restoreState(mSavedState); if (PROFILE_STARTUP) {
android.os.Debug.stopMethodTracing();
} if (!mRestoring) {
mModel.startLoader(this, true);
} // For handling default keys
mDefaultKeySsb = new SpannableStringBuilder();
Selection.setSelection(mDefaultKeySsb, 0); IntentFilter filter = new IntentFilter(
Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
registerReceiver(mCloseSystemDialogsReceiver, filter);
}

4 HomeScreen可以添加的四大件

Shortcut      应用程序的快捷方式

LiveFolder   文件夹

AppWidget  桌面小部件,图形不规则

WallPaper   壁纸

5 分析机制-SequenceDiagram

 

6 Launcher的界面分析

 

7 AppWidget监听机制

二、Shortcut&LiveFolder

1 什么是Shortcut?

 

2 实现Shortcut步骤

1) 建立activity

2) manifest里面 注册并且加上intent-filter,name为

android.intent.action.CREATE_SHORTCUT

3) acitivity ,建立一个Intent 实例 , 设置Extra_***属性,然后返回。

3 添加Shortcut到桌面

 http://blog.csdn.net/zircon_1973/article/details/7773254

4 什么是LiveFolder

1) 建立activity

2) manifest里面 注册并且加上intent-filter,name为

android.intent.action.CREATE_LIVEFOLDER

3) acitivity ,建立一个Intent 实例 , 设置Extra_***属性 和 Data属性,

然后返回.

5 实现LiveFolder步骤

三、AppWidget

3.1 什么是AppWidget

AppWidget如果有你设计 , 你觉得他和Shortcut&Livefolder有什么区别

1)界面显示复杂,必须要用到VIewGroup(Layout)。

2)事件不再单一。

3)进程间通讯。不断通讯和刷新。

【设计思路】

Serivce&AppWidgetManager    Binder

序列化的复杂界面传输

为了刷新,Broadcast , BroadcastReceiver

3.2 AppWidget主要框架及类介绍

1> AppWidgetHost    ------ 界面相关

2> AppWidgetHostView    ------ 界面相关

3> AppWidgetManager

4> AppWidgetProvider

5> AppWidgetProviderInfo

5.1 Meta-Data介绍

 

5.2 MinWidth,MinHeight

Widget 是按照单元格划分的 , 每个单元格大小是74dp , 每个widget还需要减去两边个1dp , 即你的真实的宽高算法为:(number of cells * 74) - 2

另外,我们默认约定整个workspace :

平板共有 8*7 个单元格

自动补齐机制

【AppWidget对象剖析】

5.3 updatePeriodMillis

更新频率

一般不推荐30分钟以上时间更新一次的频率(没有意义),但也不推荐小于5分钟的更新频率(耗电)

5.4 initialLayout

5.5 configure

设置添加AppWidget时候启动的设置Activity(过度Activity)

5.6 previewImage

设置AppWidget添加后的预览图

6> RemoteViews

RemoteViews的作用

RemoteViews可以用如下的layout

FrameLayout

LinearLayout

RelativeLayout

以及如下的View元素:

AnalogClock

Button

Chronometer

ImageButton

ImageView

ProgressBar

TextView

ViewFlipper

ListView

GridView

StackView

AdapterViewFlipper

3.3 AppWidget两个过程

【Initialize】

【Update】

1)launcher 启动host listening

2)service send broadcast

3)myapp 接收到 , onUpdate

4,)回传了RemoteViews -> Service

5)Service 改变Host ,updateAppWidget

6)Launcher监听到了,呈现

3.4 实验 【详解AppWidget创建及交互机制】

1> AppWidgetHelloworld

【步骤】

1)建立一个AppWidgetProvider子类;

2)Manifest中注册子类,并且注册AppWidgetProviderInfo配置文件;

3)完成AppWidgetProviderInfo配置文件;

4)完成Layout文件;

5)实现AppWidgetProvider onUpdate 来刷新显示 。

2> 给当前AppWidget加入点击事件支持并且更改view状态。

3> 给当前AppWidget加入ConfigrationActivity支持。

4> 我在Widget要去触发我的App里面的事件?  SendMessage

3.5 其实官方提供了一个很好的案例: Wiktionary & StackView Widget.

 

3.6 总结Widget重点难点理解。

Widget实际上是?   看一下Launcher.

Widget界面大小.

meta-data name必须是android.appwidget.provider.

四、如何来设计我们自己的Launcher

1 了解系统启动过程

2 了解系统如何去识别和启动Launcher的

<intent-filter>

<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.action.HOME"/>

<category android:name="android.intent.action.DEFAULT"/>

</intent-filter>

3 设计框架界面

3.1 HomeScreen

Workspace

>Shortcut

>Livefolder

>Wallpaper -------- Graphic & Animation ,OpenGL ES。

>AppWidget ------- 熟悉AppWidget相关的Framework类。

3.2 Hotseats

AllApplist -------- 通过PackageManager加载我们的app。

4 其它

皮肤  纵横屏幕  多国语言  ......

转载 :http://www.cnblogs.com/skywang12345/p/3264991.html

14、AppWidget及Launcher的更多相关文章

  1. 14、AppWidget及Launcher RemoteViews

    一.Launcher的简单研究 1 什么是Launcher Android系统启动后加载的第一个程序 . 这个程序是其他应用程序的入口 . Launcher构成: HomeScreen : (Work ...

  2. The solution for "Eclipse is running in a JRE, but a JDK is required"

    Open the eclipse folder and access the eclipse.ini file:   Before change it ,you will find it don’t ...

  3. 在超算系统上使用sbatch提交MXNet分布式训练任务

    在超算系统上运行MXNet分布式训练任务时,面临着一个IP地址相关的问题.我们在提交MXNet的分布式任务时,需要知道各个GPU节点的IP地址,把这些IP地址放到一个hosts文件中,以供分布式训练使 ...

  4. AppWidget源码分析---updateAppWidget过程分析

    转[原文] 前面一篇文章,分析了AppWidgetProvider和RemoteView的源码,从中我们可以知道它们的实现原理,AppWidgetProvider是一个BroadcastReceive ...

  5. Ubuntu 12/14 个性化配置

    计算机名:jianbao-pc    用户名:jianbao 修改 /opt目录的 用户名 及 用户组 : sudo chown -R jianbao:jianbao /opt Ubuntu 如何开启 ...

  6. 【转】Intellij IDEA 14中使用MyBatis-generator 自动生成MyBatis代码

    Intellij IDEA 14 作为Java IDE 神器,接触后发现,非常好用,对它爱不释手,打算离开eclipse和myeclipse,投入Intellij IDEA的怀抱. 然而在使用的过程中 ...

  7. Android Launcher 3 简单分析

    最近在学习Android Launcher的相关知识,在github上找到可以在Android studio上编译的Launcher 3代码,地址:https://github.com/rydanli ...

  8. Ubuntu 14.04 下搭建SVN服务器 svn://

    Ubuntu 14.04 下搭建SVN服务器 svn:// 安装软件包: sudo apt-get install subversion 之后选择SVN服务文件及配置文件的放置位置.我放在了/srv下 ...

  9. Android Launcher 研究学习

    Launcher是系统启动后第一个启动的程序,是其它应用程序的入口,也就是我们的手机程序的桌面程序; 一.Launcher的定义及构成: <1>通过查看官方提供的Launcher源码可以知 ...

随机推荐

  1. bnu 4351 美女来找茬(水水)

    http://www.bnuoj.com/bnuoj/problem_show.php?pid=4351 [题意]:用最小的矩形框,框住像素点差超过5的点. [题解]:求坐标x,y最大最小值 [cod ...

  2. 1034: [ZJOI2008]泡泡堂BNB - BZOJ

    Description 第XXXX届NOI期间,为了加强各省选手之间的交流,组委会决定组织一场省际电子竞技大赛,每一个省的代表队由n名选手组成,比赛的项目是老少咸宜的网络游戏泡泡堂.每一场比赛前,对阵 ...

  3. jQuery,javascript获得网页的高度和宽度

    网页可见区域宽: document.body.clientWidth网页可见区域高: document.body.clientHeight网页可见区域宽: document.body.offsetWi ...

  4. Java 8 vs. Scala(一): Lambda表达式

    [编者按]虽然 Java 深得大量开发者喜爱,但是对比其他现代编程语言,其语法确实略显冗长.但是通过 Java8,直接利用 lambda 表达式就能编写出既可读又简洁的代码.作者 Hussachai ...

  5. jmeter summariser(命令行执行时的输出) 、查看结果树等结果中文乱码

    在使用jmeter测试时,如果你的sampler名字为中文.或者输出的结果信息有中文,你会发现它们都是乱码,非常蛋碎!原因是:  jmeter的默认编码为:ISO-8859-1, 解决方案就是要修改它 ...

  6. 玩转redis

    http://www.cnblogs.com/huangxincheng/p/5002794.html

  7. codeforces #305 A Mike and Frog

    挺简单的题目,但是有一堆恶心的边界 在刨去恶心的边界之后: 假定我们知道两边的循环节为b1,b2 其中h第一次到达目标的时间为a1,a2 又知道对于答案t t=a1+b1*t1=a2+b2*t2 不妨 ...

  8. Java Web开发 之JavaBean整理

    JavaBean是一种Java组件技术,就其本质就是一个类,具有如下特点:1:实现可序列化2:有一个public的无参的构造方法3:所有实例变量都是private的4:为每一个属性提供getter和s ...

  9. python string 连接test

    def strTest(): name = "" for i in range(10): name += "hello" #print name def str ...

  10. FireBug 调试JS入门

    http://www.blogjava.net/vincent/archive/2009/04/14/265591.html   http://baike.baidu.com/link?url=0S2 ...