两个类所在包:
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();
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);
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
t
=
false;
private
final
BroadcastReceiver
mCloseSystemDialogsRecei
ver
=
new
CloseSystemDialogsIntent
Receiver();
protected
void
onPrepareDialog(int
id,
Dialog
dialog)
{
switch
(id)
{
case
DIALOG_CREATE_SHORTCUT:
+
if
(mLocaleChangedForShortcu
t
==
true)
{
+
AlertDialog
aDialog
=
(AlertDialog)(dialog);
+
ListView
view
=
aDialog.getListView();
+
+
dialog.setTitle(R.string.menu_item_add_item);
+
view.setAdapter(new
AddAdapter(Launcher.this));
+
mLocaleChangedForShortcu
t
=
false;
+
}
break;
case
DIALOG_RENAME_FOLDER:
if
(mFolderInfo
!=
null)
{
super.onConfigurationChanged(newConfig);
checkForLocaleChange();
mLocaleChanged
=
true;
+
mLocaleChangedForShortcu
t
=
true;
mModel.setAllAppsLoader(false);
mModel.startLoader(this,
true);
//reload
apps
}