launcher代码分析

 

http://blog.sina.com.cn/s/blog_674212810100sws7.html

(1)LauncherHomeScreenActivity

 

 

 

  1. <intent-filter>  
  2.  <action android:name="android.intent.action.MAIN" />  
  3.  <category android:name="android.intent.category.HOME"/>  
  4.  <category android:name="android.intent.category.DEFAULT" />  
  5. <category android:name="android.intent.category.MONKEY" /> </intent-filter>  


 

上面这段代码就标志着它是开机启动后HomeActivity。通过Launcher.javaonCreat()的分析我们可以大致把握屏幕的主要活动:

 

 

 

  1. protected void onCreate(Bundle savedInstanceState)  
  2.         super.onCreate(savedInstanceState);  
  3. //把xml文件的内容实例化到View中  
  4.         mInflater getLayoutInflater();  
  5. //监听应用程序控件改变事件  
  6.         mAppWidgetManager AppWidgetManager.getInstance(this);  
  7.         mAppWidgetHost new LauncherAppWidgetHost(thisAPPWIDGET_HOST_ID);  
  8.         mAppWidgetHost.startListening();  
  9. // 用于调试?      
  10.         if (PROFILE_STARTUP)  
  11.             android.os.Debug.startMethodTracing("/sdcard/launcher");  
  12.          
  13.   //监听locale,mcc,mnc是否改变,如果改变,则重写新配置  
  14.       //mcc:mobile country code(国家代码China 460); mnc:mobile network code(网络代码)  
  15.         checkForLocaleChange();  
  16.          
  17.         setWallpaperDimension();  
  18. //显示主屏幕UI元素,workspace,slidingdrawer(handleview and appgridview),deletezone  
  19.         setContentView(R.layout.launcher);  
  20. //Finds all the views we need and configure them properly.  
  21. //完成workspace,slidingdrawer,deletezone的各种事件操作和监听  
  22.         setupViews();  
  23. //Registers various intent receivers.  
  24. //允许其他应用对本应用的操作  
  25.         registerIntentReceivers();  
  26. //Registers various content observers.  
  27. //例如,注册一个内容观察者跟踪喜爱的应用程序  
  28.         registerContentObservers();  
  29. //重新保存前一个状态(目的??)  
  30.         mSavedState savedInstanceState;  
  31.         restoreState(mSavedState);  
  32. //调试?  
  33.         if (PROFILE_STARTUP)  
  34.             android.os.Debug.stopMethodTracing();  
  35.          
  36. //Loads the list of installed applications in mApplications.  
  37.         if (!mRestoring)  
  38.             startLoaders();  
  39.          
  40.         // For handling default keys??  
  41.         mDefaultKeySsb new SpannableStringBuilder();  
  42.         Selection.setSelection(mDefaultKeySsb, 0);  
  43.      
 

 

 

方法onActivityResult():完成在workspace上增加shortcutappwidgeLivefolder

方法onSaveInstantceState()onRestoreInstanceState():为了防止SensorLandPort布局自动切换时数据被置空,通过onSaveInstanceState方法可以保存当前窗口的状态,在即将布局切换前将当前的Activity压入历史堆栈。如果我们的Activity在后台没有因为运行内存吃紧被清理,则切换时回触发onRestoreIntanceState()


(2)WallpaperChooser:设置墙纸。

同理我们从onCreat()作为入口来分析这个活动的主要功能。

 

 

  1. public void onCreate(Bundle icicle)  
  2.         super.onCreate(icicle);  
  3. //设置允许改变的窗口状态,需在 setContentView 之前调用  
  4.         requestWindowFeature(Window.FEATURE_NO_TITLE);  
  5. /添加墙纸资源,将资源标识符加入到动态数组中  
  6.         findWallpapers();  
  7. //显示墙纸设置屏幕的UI元素,Imageview,Gallery and Button(LinearLayout)  
  8.         setContentView(R.layout.wallpaper_chooser);  
  9. //图片查看功能的实现  
  10.         mGallery (Gallery) findViewById(R.id.gallery);  
  11.         mGallery.setAdapter(new ImageAdapter(this));  
  12.         mGallery.setOnItemSelectedListener(this);  
  13.         mGallery.setCallbackDuringFling(false);  
  14. //Button事件监听,点击选择setWallpaper(Resid)  
  15.         findViewById(R.id.set).setOnClickListener(this);  
  16.         mImageView (ImageView) findViewById(R.id.wallpaper);  
  17.      
 

 

 

 

(3)default_searchable

对于home中任意的Acitivty,使能系统缺省Search模式,这样就可以使用android系统默认的search UI


 

(4)InstallShortcutReceiver

继承自BroadcastReceiver,重写onReceier()方法,对于发送来的Broadcast(这里指Intent)进行过滤(IntentFilt)并且响应(这里是InstallShortcut())。这里分析下onReceive():

 

 

  1. <!-- Enable system-default search mode for any activity in Home -->  
  2. <!-- Intent received used to install shortcuts from other applications -->  
  3. public void onReceive(Context context, Intent data)  
  4.        //接受并过滤Intent  
  5. if (!ACTION_INSTALL_SHORTCUT.equals(data.getAction()))  
  6.             return 
  7.          
  8.       //获取屏幕  
  9.         int screen Launcher.getScreen();  
  10. //安装快捷方式  
  11.         if (!installShortcut(context, data, screen))  
  12.             //如果屏幕已满,搜寻其他屏幕  
  13.             for (int 0; Launcher.SCREEN_COUNT; i++)  
  14.                 if (i != screen && installShortcut(context, data, i)) break 
  15.              
  16.          
  17.      
 

 

 

其中IntallShortcut()方法:首先,对传入的坐标进行判断(findEmptyCell(),如果是空白位置,则可以放置快捷方式;其次,缺省情况下,我们允许创建重复的快捷方式,具体创建过程(addShortcut())就是把快捷方式的信息传入数据库(addItemToDatabase())。


(5)UninstallShortcutReceiver

同理,UninstallShortcutReceiver()继承自BroadcastReceiver(),实现onReceiver()方法。定义一个ContentResolver对象完成对数据库的访问和操作(通过URI定位),进而删除快捷方式。


 

(6)LauncherProvider

继承自ContentProvider(),主要是建立一个数据库来存放HomeScreen中的数据信息,并通过内容提供者来实现其他应用对launcher中数据的访问和操作。

重写了ContentProvider()中的方法

getType():返回数据类型。如果有自定义的全新类型,通过此方法完成数据的访问。

query():查询数据。传入URI,返回一个Cursor对象,通过Cursor完成对数据库数据的遍历访问。

Insert():插入一条数据。

bulkInsert():大容量数据的插入。

delete():删除一条数据。

update():更改一条数据。

sendNotify():发送通知。

DatabaseHelper继承自一个封装类SQLiteOpenHelper(),方便了数据库的管理和维护。

重写的方法:

onCreate():创建一个表。其中db.execSQL()方法执行一条SQL语句,通过一条字符串执行相关的操作。当然,对SQL基本语句应该了解。

onUpgrade():升级数据库。

HomeScreen数据库操作的一些方法:

addClockWidget(),addSearchWidget,addShortcut,addAppShortcut,

loadFavorites(),launcherAppWidgetBinder(),convertWidget(),updateContactsShortcuts(),

copyFromCursor()

补充:

AddAdapter(AddAdapter.java)列出了这四个类型对象。当用户在桌面空白处长按时,下列函数序列被执行:

Launcher::onLongClick -->

Launcher::showAddDialog -->

Launcher::showDialog(DIALOG_CREATE_SHORTCUT); -->

Launcher::onCreateDialog -->

Launcher::CreateShortcut::createDialog:这个函数创建一个弹出式对话框,询问用户是要添加什么(快捷方式,appwidget, 文件夹和墙纸)其内容就来自AddAdapter。

DesktopItemsLoader负责将桌面上所有的对象从content provider中提取。

线程private ApplicationsLoader mApplicationsLoader负责从包管理器中获取系统中安装的应用列表。(之后显示在AllAppsGridView上)。ApplicationsLoader::run实现:
1)通过包管理器列出系统中所有类型为Launcher,action为MAIN的activity;
2)对每一个Activity,
       a) 将Activity相关元数据信息,如title, icon, intent等缓存到appInfoCache;
         b) 填充到ApplicationsAdapter 中。填充过程中用到了一些小技巧,每填充4(UI_NOTIFICATION_RATE)个activity更新一下相应view。

在Launcher::onCreate中,函数startLoaders被调用。而该函数接着调用loadApplications和loadUserItems,分别获取系统的应用列表,以及显示在桌面上的对象列表(快捷方式,appwidget,folder等)。
Launcher上排列的所有应用图标由AllAppsGridView对象呈现。这个对象是一个GridView。其对应的Adapter是ApplicationsAdapter,对应的model则是ApplicationInfo数组。数组内容是由ApplicationsLoader装载的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值