android Launcher2浅析

两个类所在包:

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菜单

          private  static  final  Object  sLock  new  Object();
          private  static  int  sScreen  DEFAULT_SCREEN;
      private  static  boolean  mLocaleChanged  false;
 
          private  final  BroadcastReceiver  mCloseSystemDialogsRecei ver
                          new  CloseSystemDialogsIntent Receiver();
@@ -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对话框
@@ -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  mLocaleChangedForShortcu false;
 
          private  final  BroadcastReceiver  mCloseSystemDialogsRecei ver
                          new  CloseSystemDialogsIntent Receiver();
@@ -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));
                                      mLocaleChangedForShortcu false;
                              }
                                  break;
                          case  DIALOG_RENAME_FOLDER:
                                  if  (mFolderInfo  !=  null)  {
@@ -2349,6 +2359,7 @@  public final class Launcher extends Activity
                  super.onConfigurationChanged(newConfig);
                  checkForLocaleChange();
                  mLocaleChanged  true;
              mLocaleChangedForShortcu true;
                  mModel.setAllAppsLoader(false);
                  mModel.startLoader(this,  true);  //reload  apps
          }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值