首页 > 代码库 > 14、AppWidget及Launcher

14、AppWidget及Launcher

一、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()

 1 @Override 2     protected void onCreate(Bundle savedInstanceState) { 3         super.onCreate(savedInstanceState); 4      //下面一段是界面初始化工作 5         LauncherApplication app = ((LauncherApplication)getApplication()); 6         mModel = app.setLauncher(this); 7         mIconCache = app.getIconCache(); 8         //得到拖动组件实例 9      mDragController = new DragController(this);10         //得到Inflater实例11      mInflater = getLayoutInflater();12 13      //得到AppWidget管理实例 : AppWidgetManager , AppWidgetHost , AppWidgetHostView三个类的关系14         mAppWidgetManager = AppWidgetManager.getInstance(this);15         mAppWidgetHost = new LauncherAppWidgetHost(16           this, APPWIDGET_HOST_ID);17         //Host启动监听,监听LauncherProvider中的数据改变18      mAppWidgetHost.startListening();19 20         if (PROFILE_STARTUP) {21             android.os.Debug.startMethodTracing(22                     Environment.getExternalStorageDirectory() + "/launcher");23         }24 25         loadHotseats();26      //检查本地化语言改变27         checkForLocaleChange();28      //设置桌面尺寸29         setWallpaperDimension();30 31      //加载内容显示32         setContentView(R.layout.launcher);33         //设置动态的每个桌面视图(左右滑动的那个)34      setupViews();35      //注册内容观察36         registerContentObservers();37      //锁定应用程序38         lockAllApps();39 40         mSavedState = savedInstanceState;41         restoreState(mSavedState);42 43         if (PROFILE_STARTUP) {44             android.os.Debug.stopMethodTracing();45         }46 47         if (!mRestoring) {48             mModel.startLoader(this, true);49         }50 51         // For handling default keys52         mDefaultKeySsb = new SpannableStringBuilder();53         Selection.setSelection(mDefaultKeySsb, 0);54 55         IntentFilter filter = new IntentFilter(56           Intent.ACTION_CLOSE_SYSTEM_DIALOGS);57         registerReceiver(mCloseSystemDialogsReceiver, filter);58     }

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到桌面

 

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 其它

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

 

14、AppWidget及Launcher