android Launcher2浅析

来源:互联网 发布:销售数据 编辑:程序博客网 时间:2024/06/05 19:11

两个类所在包:

com.Android.internal.policy.impl.LockScreen.java

com.Android.internal.widget.SlidingTab.java

SlidingTab.java分析:

分析我们的Touch在 SlidingTab 上产生的效果,主要看onTouchEvent ()的处理。

ACTION_DOWN 时会调用disableButtonPress(),产生手指点击时的动画效果。

ACTION_MOVE 时会调用moveControl()产生图片跟随手指移动的效果。

ACTION_UP   时会判断移动的位置是否已经到了,可以触发Trigger的程度,如果到了,则调用   dispatchTriggerEvent,通知在 SlidingTab上的Trigger Listener。由于 SlidingTab上的 Trigger Listener是在  LockScreen里实现的,所以会代用到 LockScreen中。

LockScreen.java分析:

代码中有一行:  private SlidingTab mSelector; 将SlidingTab 作为它的一个属性值.

另外此类实现了SlidingTab.OnTriggerListener。这个listener用来执行我们从左到右或者从右到左的滑动,在构造函数中有mSelector.setOnTriggerListener(this);这样我们在 SlidingTab上的滑动会调用到 public void onTrigger(View v, int whichHandle)方法中。

onTrigger的执行为两个分支,一个为从右滑向左,执行了mAudioManager.setRingerMode(),设置了声音的模式,并更新右边声音的图片。另一个为从左滑向右,执行的是mCallback.goToUnlockScreen();这个mCallback是何方神圣呢?它是 KeyguardScreenCallback类型,并且在LockScreen初始化的时候传进来的,跟踪后我们发现,LockScreen是类LockPatternKeyguardView的一个属性值(private View mLockScreen);KeyguardScreenCallback的实现在LockPatternKeyguardView中。

LockPatternKeyguardView中LockPatternKeyguardView的逻辑是,如果用户在设置->位置和安全 ->设置屏幕锁定中设置了解锁画面,则调用了updateScreen(Mode.UnlockScreen)进入相应的解锁画面,否则调用:getCallback().keyguardDone(true); 这个getCallback() 返回的是KeyguardViewMediator。

KeyguardViewMediator 中 keyguardDone()方法,最终会给Handler发送KEYGUARD_DONE 的消息,Handler会执行handleKeyguardDone()方法,在方法中会调用handleHide(),这个函数会将我们的LockScreen给隐藏。

总结:总体来说,上面提到的类基本上可以这么认为,SlidingTab属于LockScreen,LockScreen属于 LockPatternKeyguardView, LockPatternKeyguardView 属于KeyguardViewManager,KeyguardViewManager来统管所有与锁解屏相关的操作,另外通过 KeyguardViewMediator,来实现KeyguardViewManager和PhoneWindowManager之间的交互与通信.

画面的更新实现

画面更新是由com.Android.internal.policy.impl.KeyguardUpdateMonitor 来实现的。它注册锁屏Receive 用于接受各种Intent(例如:时间,电池,Sim状态,电话状态),来处理Lock界面上的信息的更新。




luncher2 语言更改的bug




 在手机开机后,在Home界面按Menu按钮,更改语言,回到Home界面,再按Menu按钮,弹出菜单中的选项还是原来的语言。选择Add(以手机原先的语言为英文为例),出现的Add to Home screen对话框也是原来的语言。在Android2.3中好像没有这个问题了。

    笔者做了如下的修改,是在《Android2.2更改语言时的Bug》一文的所描述更改代码的基础上更改的,大家如果有更好的办法,欢迎提出。 

 

(1)修正menu菜单

--- a/src/com/android/launcher2/Launcher.java
+++ b/src/com/android/launcher2/Launcher.java  
     private static final Object sLock new Object();
     private static int sScreen DEFAULT_SCREEN;
   private static boolean mLocaleChanged false;
 
     private final BroadcastReceiver mCloseSystemDialogsReceiver
             new CloseSystemDialogsIntentReceiver();
@@ -1120,6 +1121,37 @@ public final class Launcher extends Activity
             return false;
         }
 
       if (mLocaleChanged) {
           MenuItem item;
+
           item menu.findItem(MENU_ADD);
           if (item != null) {
               item.setTitle(R.string.menu_add);
           }
+
           item menu.findItem(MENU_WALLPAPER_SETTINGS);
           if (item != null) {
               item.setTitle(R.string.menu_wallpaper);
           }
+
           item menu.findItem(MENU_SEARCH);
           if (item != null) {
               item.setTitle(R.string.menu_search);
           }
+
           item menu.findItem(MENU_NOTIFICATIONS);
           if (item != null) {
               item.setTitle(R.string.menu_notifications);
           }
+
           item menu.findItem(MENU_SETTINGS);
           if (item != null) {
               item.setTitle(R.string.menu_settings);
           }
+
           mLocaleChanged false;
       }
+
         // Only show the add and wallpaper options when we're not in all apps.
         boolean visible !mAllAppsGrid.isOpaque();
         menu.setGroupVisible(MENU_GROUP_ADD, visible);
@@ -2314,6 +2346,7 @@ public final class Launcher extends Activity
     public void onConfigurationChanged(Configuration newConfig) {
         super.onConfigurationChanged(newConfig);
         checkForLocaleChange();
       mLocaleChanged true;
         mModel.setAllAppsLoader(false);
         mModel.startLoader(this, true); //reload apps
     }
 
(2)修正Add对话框
--- a/src/com/android/launcher2/Launcher.java
+++ b/src/com/android/launcher2/Launcher.java
@@ -75,6 +75,7 @@ import android.widget.PopupWindow;
 import android.widget.LinearLayout;
 import android.appwidget.AppWidgetManager;
 import android.appwidget.AppWidgetProviderInfo;
+import android.widget.ListView;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -161,6 +162,7 @@ public final class Launcher extends Activity
     private static final Object sLock new Object();
     private static int sScreen DEFAULT_SCREEN;
     private static boolean mLocaleChanged false;
   private static boolean mLocaleChangedForShortcufalse;
 
     private final BroadcastReceiver mCloseSystemDialogsReceiver
             new CloseSystemDialogsIntentReceiver();
@@ -1788,6 +1790,14 @@ public final class Launcher extends Activity
     protected void onPrepareDialog(int id, Dialog dialog) {
         switch (id) {
             case DIALOG_CREATE_SHORTCUT:
               if (mLocaleChangedForShortcu== true) {
                   AlertDialog aDialog (AlertDialog)(dialog);
                   ListView view aDialog.getListView();
+
                   dialog.setTitle(R.string.menu_item_add_item);
                   view.setAdapter(new AddAdapter(Launcher.this));
                   mLocaleChangedForShortcufalse;
               }
                 break;
             case DIALOG_RENAME_FOLDER:
                 if (mFolderInfo != null) {
@@ -2349,6 +2359,7 @@ public final class Launcher extends Activity
         super.onConfigurationChanged(newConfig);
         checkForLocaleChange();
         mLocaleChanged true;
       mLocaleChangedForShortcutrue;
         mModel.setAllAppsLoader(false);
         mModel.startLoader(this, true); //reload apps
     }