Android-- Launcher拖拽事件详解

本文详细解析了Android ICS 4.0 Launcher的启动过程和拖拽事件的工作流程,包括启动流程的各个步骤,如LauncherApplication的onCreate()、LoaderTask的运行,以及拖拽事件从长按到拖动的处理。内容涵盖了数据库、监听器和拖拽交互的实现细节。
摘要由CSDN通过智能技术生成

分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

               

转自:

http://blog.csdn.net/wdaming1986/article/details/7585649

http://blog.csdn.net/wdaming1986/article/details/7671318

 

最近研究ICS4.0的Launcher,发现4.0和2.3有稍微点区别,但是区别不是特别大,所以我就先整理一下Launcher启动的大致流程。Launcher其实是贯彻于手机的整个系统的,时时刻刻都在运行,要是Launcher不运行了,手机就得黑屏了。Launcher的LauncherMode=singletask,所以说不管Launcher启动了哪个应用,总有个Launcher的实例在堆栈中,并且位于栈底。点击Home键进入到Launcher,上篇Android的全局键(home键/长按耳机键)详解【android源码解析八】中有详细的介绍。大致思路其实就是启动launcher的时候,新启动一个task。大致先说这么多,先看截图:

大明原创,转载请标明出处:http://blog.csdn.net/wdaming1986/article/details/7585649

                                    

                                                                           图(1)

      上图是4.0的Launcher界面,下面我们分步来解析一下Launcher的启动过程。

     Step 0:首先要给大家介绍一下Launcher的数据库,这个数据库中存放着待机界面的图标,主屏底部的应用程序图标和桌面folder中各应用程序的图标,ICS4.0的folder中只能放应用程序的快捷方式,shortcut不能放到这个folder中,先看截图: 

                                                                        图(2)

       说说各字段的含义:

                title:表示桌面应用程序的名字,有的title为空,表示是widget的快捷方式;

             intent:表示启动这个图标的intent放到数据库中,当click的时候就会调用这个字段,启动相应的应用程序;

       container:表示应用程序的容器,folder的容器为整数,-100:表示在桌面的程序,-101:表示是主屏底部的程序;

           screen:表示在第几个屏,folder的screen都是0, container=-101的为0,1,3,4;2为allapp的按钮;

               cellX:表示在屏幕X轴的位置,(0,1,2,3),左上角为0点,往右依次增加;

               cellY:表示在屏幕Y轴的位置,(0,1,2,3),左上角为0点,往下依次增加;

              spallX:表示占X轴几个格;

              spallY:表示占Y轴几个格;

         itemType:应用程序用0表示,shortcut用1表示,folder用2表示,widget用4表示;

    appWidgetId:-1表示不是widget,数字大于0表示才是widget;

       isShortCut:值为0表示不是应用程序的ShortCut,值为1表示是应用程序的ShortCut;

         iconType:值为0表示图标的名字被定义为包名的资源id,值为1表示图标用bitmap保存;

                 icon:表示应用程序的图标,二进制的;显示为一张图片;

       说明:folder中的应用快捷方式绑定folder---->是用container的值绑定folder的id的;

        详细的讲解请参考LauncherSettings.java这个类,有数据库字段的详细讲解;

         手机是在第一次烧机完成后,数据库的值还没有,这时候launcher解析default_workspace.xml把这个值存到数据库中;所以说想定制什么样的开机桌面就在default_workspace.xml中做相应的配置,具体参照我前面的博客:

Android中源码Launcher主屏幕程序排列详解【安卓Launcher进化一】中有详细的介绍:

       i f (!convertDatabase(db)) {
                 // Populate favorites table with initial favorites
                loadFavorites(db, R.xml.default_workspace);
        }

      Step 1:开机后先启动LauncherApplication.java这个类的onCreate()方法,下面看代码:  

   

  1. @Override 
  2. public void onCreate() { 
  3.      super.onCreate(); 
  4.  
  5.      // set sIsScreenXLarge and sScreenDensity *before* creating icon cache 
  6.      // 在创建图标缓存之前先设置sIsScreenXLarge和屏幕设备的分辨率 
  7.      final int screenSize = getResources().getConfiguration().screenLayout & 
  8.              Configuration.SCREENLAYOUT_SIZE_MASK; 
  9.      sIsScreenLarge = screenSize == Configuration.SCREENLAYOUT_SIZE_LARGE || 
  10.          screenSize == Configuration.SCREENLAYOUT_SIZE_XLARGE; 
  11.      sScreenDensity = getResources().getDisplayMetrics().density; 
  12.  
  13.      // 实例化图标缓存区的对象 
  14.      mIconCache = new IconCache(this); 
  15.      // 实例化一个LauncherModel对象,这个类是保存Launcher的内存启动状态,更新Launcher的数据库的作用 
  16.      mModel = new LauncherModel(this, mIconCache); 
  17.  
  18.      // Register intent receivers 
  19.      // 注册监听,应用package增加,删除,改变的监听。 
  20.      IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED); 
  21.      filter.addAction(Intent.ACTION_PACKAGE_REMOVED); 
  22.      filter.addAction(Intent.ACTION_PACKAGE_CHANGED); 
  23.      filter.addDataScheme("package"); 
  24.      registerReceiver(mModel, filter); 
  25.      filter = new IntentFilter(); 
  26.      // 注册application是否可用,语言改变,方向改变的监听。4.0支持横竖屏 
  27.      filter.addAction(Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE); 
  28.      filter.addAction(Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE); 
  29.      filter.addAction(Intent.ACTION_LOCALE_CHANGED); 
  30.      filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED); 
  31.      registerReceiver(mModel, filter); 
  32.      filter = new IntentFilter(); 
  33.      filter.addAction(SearchManager.INTENT_GLOBAL_SEARCH_ACTIVITY_CHANGED); 
  34.      registerReceiver(mModel, filter); 
  35.      filter = new IntentFilter(); 
  36.      filter.addAction(SearchManager.INTENT_ACTION_SEARCHABLES_CHANGED); 
  37.      registerReceiver(mModel, filter); 
  38.  
  39.      // Register for changes to the favorites 
  40.      // 注册favorites应用程序数据库改变的监听 
  41.      ContentResolver resolver = getContentResolver(); 
  42.      resolver.registerContentObserver(LauncherSettings.Favorites.CONTENT_URI,true
  43.              mFavoritesObserver); 
   @Override    public void onCreate() {        super.onCreate();        // set sIsScreenXLarge and sScreenDensity *before* creating icon cache        // 在创建图标缓存之前先设置sIsScreenXLarge和屏幕设备的分辨率        final int screenSize = getResources().getConfiguration().screenLayout &                Configuration.SCREENLAYOUT_SIZE_MASK;        sIsScreenLarge = screenSize == Configuration.SCREENLAYOUT_SIZE_LARGE ||            screenSize == Configuration.SCREENLAYOUT_SIZE_XLARGE;        sScreenDensity = getResources().getDisplayMetrics().density;        // 实例化图标缓存区的对象        mIconCache = new IconCache(this);        // 实例化一个LauncherModel对象,这个类是保存Launcher的内存启动状态,更新Launcher的数据库的作用        mModel = new LauncherModel(this, mIconCache);        // Register intent receivers        // 注册监听,应用package增加,删除,改变的监听。        IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED);        filter.addAction(Intent.ACTION_PACKAGE_REMOVED);        filter.addAction(Intent.ACTION_PACKAGE_CHANGED);        filter.addDataScheme("package");        registerReceiver(mModel, filter);        filter = new IntentFilter();        // 注册application是否可用,语言改变,方向改变的监听。4.0支持横竖屏        filter.addAction(Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE);        filter.addAction(Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE);        filter.addAction(Intent.ACTION_LOCALE_CHANGED);        filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED);        registerReceiver(mModel, filter);        filter = new IntentFilter();        filter.addAction(SearchManager.INTENT_GLOBAL_SEARCH_ACTIVITY_CHANGED);        registerReceiver(mModel, filter);        filter = new IntentFilter();        filter.addAction(SearchManager.INTENT_ACTION_SEARCHABLES_CHANGED);        registerReceiver(mModel, filter);        // Register for changes to the favorites        // 注册favorites应用程序数据库改变的监听        ContentResolver resolver = getContentResolver();        resolver.registerContentObserver(LauncherSettings.Favorites.CONTENT_URI, true,                mFavoritesObserver);    }

 


   

       Step 2:在LauncherApplication.java中onTerminate()的方法,解除监听的绑定;

  1. /**
  2.     * There's no guarantee that this function is ever called.
  3.     */ 
  4.    @Override 
  5.    public void onTerminate() { 
  6.        super.onTerminate(); 
  7.  
  8.        unregisterReceiver(mModel); 
  9.  
  10.        ContentResolver resolver = getContentResolver(); 
  11.        resolver.unregisterContentObserver(mFavoritesObserver); 
  12.    } 
 /**     * There's no guarantee that this function is ever called.     */    @Override    public void onTerminate() {        super.onTerminate();        unregisterReceiver(mModel);        ContentResolver resolver = getContentResolver();        resolver.unregisterContentObserver(mFavoritesObserver);    }

     Step 3:Step1中的数据库mFavoritesObserver监听内部类如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值