天天看點

Android Api Demos登頂之路(四十四)Launcher Shortcuts

通常情況下為一個應用添加快捷方式,隻要在launcher中長按這個應用 的圖示,系統就會為這個應用在桌面上建立一個快捷方式,名字與圖示與launcher中應用的名字與圖示相同。利用這種方法建立快捷方式 不需要對activity進行特殊的設定,是由系統自動完成的。

* 在android的早期版本中(我試了Api15的模拟器 該功能已經取消了)還可以通過在系統桌面長按,這時Android會顯示使用者可以選擇添加 的桌面種類清單,選擇Shortcut(快捷方式)後,Android會列出所有定義了android.intent.action.CREATE_SHORTCUT的所有應用. 我們就可以選擇為清單中的某個activity添加快捷方式。利用這種方法添加快捷方式,需要處理activity,讓它支援添加快捷方式。

* 這個demo示範的就是利用這種方式來為activity添加快捷方式。

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="@string/hello_world" />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="intent:" />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:id="@+id/intent_info" />


</LinearLayout>
           

MainActivity

public class MainActivity extends Activity {

    private static final String EXTRA_KEY = "com.fishtosky.launchershortcuts.MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // 在加載視圖之前就進行判斷,如果接收到的intent是建立快捷方式,那麼就調用建立快捷方式的方法後,結束掉自己。
        Intent intent = getIntent();
        if (Intent.ACTION_CREATE_SHORTCUT.equals(intent.getAction())) {
            setupShortcut();
            finish();
            return;
        }
        // 如果是正常的打開應用則建立視圖,并将意圖的資訊和意圖中傳遞的資料顯示在文本框中。
        // 在本例中如果使用launcher中正常的方式打開則extra為空,如果使用桌面的快捷方式打開則intent會傳遞字元串
        // 顯示在文本上,以差別兩種不同方式打開應用。
        setContentView(R.layout.activity_main);
        TextView intentInfo = (TextView) findViewById(R.id.intent_info);
        String info = intent.toString();
        String extra = intent.getStringExtra(EXTRA_KEY);
        if (extra != null) {
            info = info + " " + extra;
        }
        intentInfo.setText(info);
    }

    //設定快捷方式
    private void setupShortcut() {
        //建立一個意圖,用于指明當我們點選快捷方式時需要打開的activity,這裡打開的是自己
        Intent shortcutIntent=new Intent(Intent.ACTION_MAIN);
        shortcutIntent.setClassName(this, this.getClass().getName());
        shortcutIntent.putExtra(EXTRA_KEY, "這是通過快捷方式打開的應用!");

        //再建立一個意圖,指明建立快捷方式的意圖,快捷方式的名字和圖示
        Intent intent=new Intent();
        intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
        intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, getString(R.string.app_name));
        Parcelable iconResource=Intent.ShortcutIconResource.fromContext(this, R.drawable.ic_launcher);
        intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, iconResource);

        //設定傳回的結果
        setResult(RESULT_OK, intent);
    }

}
           

配置檔案:一是對activity進行配置。activity-alias在需要重複使用同一個activity時使用,直接了解就是activity的一個别名。比如在本例中我們可以在launcher中直接啟動activity,也以可通過長按桌面為activity添加一個快捷方式,兩種操作都調用了同一個activity,這個時候就需要用到activity-alias。

<activity-alias 
            android:name="ShortCut"
            android:targetActivity=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.CREATE_SHORTCUT" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity-alias>
           

二是要為建立快捷方式添權重限: