歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 簡單分析Android中添加shortcut方面的源碼

簡單分析Android中添加shortcut方面的源碼

日期:2017/3/1 10:13:05   编辑:Linux編程

首先要知道Launcher,就是主屏幕,它是Android系統啟動後所加載的第一個程序,如下,主屏幕分成兩部分,Workspace和Hotseats,而shortcut就是添加在workspace上的,這上面還可以添加諸如widget、文件夾等。這兒說的shortcut是指跳轉到具體功能的快捷方式,而不是簡單的程序的入口圖標,APIDemos中有一個添加shortcut的例子,我們稍後分析它。


這兒以Android2.3的模擬器分析添加shortcut有關的源碼,要添加shortcut,一般是摁menu鍵選擇Add或長摁主屏幕,彈出菜單選擇相應的shortcut,如下:

關於獲取Android的源碼和將源碼導入到eclipse中,可以參看我前面的文章,首先找到Launcher的源碼,在<源碼目錄>\packages\apps\Launcher2下。

1、從manifest文件中可以知道主屏幕就是Launcher.java這個activity,可以看下其布局文件,找到onOptionsItemSelected()方法,跟下去在onCreateDialog()方法中

  1. case DIALOG_CREATE_SHORTCUT:
  2. return new CreateShortcut().createDialog();
找到create上左圖這個dialog的代碼,下面的方法是給dialog添加一個adapter,第二個參數是click事件的listener
  1. builder.setAdapter(mAdapter, this);
在其adapter中,發現其每一列就是個textview,通過:
  1. textView.setCompoundDrawablesWithIntrinsicBounds(item.image, null, null, null);
這個方法可以在textview的左、上、右、下添加圖片,無添加就為null。跟蹤onclick()方法,在pickShortcut() 方法中:
  1. Intent pickIntent = new Intent(Intent.ACTION_PICK_ACTIVITY);
  2. ...
  3. startActivityForResult(pickIntent, REQUEST_PICK_SHORTCUT);
所以上右圖其實是一個dialog樣式的activity。

2、這個dialog樣式的activity經常可以碰到,比如有時你點擊一個鏈接,如果你裝了多個浏覽器,就會彈出這個activity讓你選擇哪個浏覽器。其實就是ActivityPicker.java這個類。

跟蹤其onCreate()方法:

  1. // Build list adapter of pickable items
  2. List<PickAdapter.Item> items = getItems();
  3. mAdapter = new PickAdapter(this, items);
跟蹤getItems()方法,可以知道這個activityPicker中顯示了兩種數據,第一種便是上右圖的第一項:
  1. // Add any injected pick items
  2. final Intent intent = getIntent();
  3. ArrayList<String> labels = intent.getStringArrayListExtra(Intent.EXTRA_SHORTCUT_NAME);
第二種便是在系統中查詢一個Intent,就是上面一步中啟動ActivityPicker的pickIntent中的name為Intent.EXTRA_INTENT的extraData,並且對其排序,是按照查詢得出的activity的label或者name排序的:
  1. List<ResolveInfo> list = packageManager.queryIntentActivities(baseIntent, 0 /* no flags */);
  2. Collections.sort(list, new ResolveInfo.DisplayNameComparator(packageManager));
所以系統中有Intent.ACTION_CREATE_SHORTCUT這個IntentFilter的activity都會顯示在上右圖中的列表中。

3、點擊這個picker中ApiDemos,觸發onclick(),會帶著指向有Intent.ACTION_CREATE_SHORTCUT的activity的Intent返回到Launcher.java中。在onActivityResult()方法中跟下去:

  1. case REQUEST_PICK_SHORTCUT:
  2. processShortcut(data);
  3. break;
if中是處理如果你當時點擊的是第一項Applications時會繼續彈出一個ActivityPicker,列出所有安裝程序的入口activity的快捷方式。
Copyright © Linux教程網 All Rights Reserved