14、AppWidget及Launcher

一、Launcher的简单研究

1 什么是Launcher

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

Launcher构成:

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

AllAppList (用GridView)

14、AppWidget及Launcher

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 keys 52 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   壁纸

14、AppWidget及Launcher

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

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

 

你可能感兴趣的:(appwidget)