2010年10月27日 星期三

[Android] 如何在桌面建立捷徑圖示 (2.接受Intent.ACTION_CREATE_SHORTCUT動作)



在上一篇 [Android] 如何在桌面建立捷徑圖示 (1.Launcher 的 BroadcastReceiver)文章介紹透過Launcher的權限在桌面建立捷徑 , 但其實我們還可以在桌面的
空白處長按不放 , 系統即會詢問我們是否要在桌面加入物件 , 如下圖





在這邊可以選擇要加入的物件類別 , 如果說我們想要替我們的程式產生捷徑



使用系統內建的功能 , 這邊許多城市都可以產生出捷徑 , 而我們的程式會被系統放在
應用程式下點選之後桌面就會出現程式捷徑了 ,  可是這樣產生的捷徑固定動作就是前
往該應用程式 , 如果我們想透過長按的方式呼叫出清單並自訂我們捷徑的動作的話
該如何實作呢?


首先我們需要在 AndroidManifest.xml 添加屬性 , 這邊多加了一行 
<action android:name="android.intent.action.CREATE_SHORTCUT"/>










          

現在可以看到ShortcutTest 出現在清單上了 


接下來就是程式碼的部分


import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Parcelable;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;


public class ShortcutTest extends Activity 
{
    @Override
    
    public void onCreate(Bundle savedInstanceState)
    {        
     super.onCreate(savedInstanceState);

        // 如果intent的動作是被要求建立一個捷徑 , 那麼進入判斷式子建立捷徑 , 然後終止Activity

        if (Intent.ACTION_CREATE_SHORTCUT.equals(getIntent().getAction()))
        {
            setupShortcut();
            finish();
            return;
        }
     
     setContentView(R.layout.main);     
     TextView Info = (TextView) findViewById(R.id.TextView);        
        Info.setText("請回到桌面 , 在空白處長按 , 選取建立捷徑");
    
    }
    
    private void setupShortcut() 
 {
     Intent shortcutIntent = new Intent(Intent.ACTION_CREATE_SHORTCUT);
     //也可以使用 Intent.ACTION_MAIN
     
     shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, "Shortcut");
      shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,Intent.ShortcutIconResource.fromContext(this,R.drawable.icon));
        
     Intent intent = new Intent(); 
        intent.setClassName(this, this.getClass().getName());
        shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, intent);
       
        setResult(RESULT_OK, shortcutIntent);
  /*
   * setResult (int resultCode, Intent data)
   * Call this to set the result that your activity will return to its caller.
           Parameters
           resultCode: The result code to propagate back to the originating activity, often    RESULT_CANCELED or RESULT_OK
           data:       The data to propagate back to the originating activity.
           See Also
           RESULT_CANCELED
           RESULT_OK
           RESULT_FIRST_USER
           setResult(int)
   * */
 }
    
}

當我們執行這個程式的時候會出現這樣的畫面



(*)由於我們的程式碼裡面有一個是否為 Intent.ACTION_CREATE_SHORTCUT 
動作的判斷式所以直接從應用程式中執行的話只會出現上面的提示
沒有任何產生捷徑的動作 , 所以必須從剛剛的清單選取
ShortcutTest此時系統會宣告一個android.intent.action.CREATE_SHORTCUT
的Intent並呼叫 
startActivityForResult(Intent intent, int requestCode) 

來等候ShortcutTest 的回應這

個時候
ShortcutTest 接獲Intent.ACTION_CREATE_SHORTCUT

的Intent


就會呼叫判斷式中的setupShortcut() , 最後再以SetResult(int)回傳資訊給系統

告知要建立捷徑




之後桌面就會成功的出現我們要的捷徑了




打星號的部份雖然可以成功執行 , 但是細節部分是我的推測 , 有興趣的人可以再試試
在清單中要加入捷徑時 , 在應用程式底下的apps , 會直接的產生捷徑 , 而和應用程
式同
一層Level的物件, 該Level 中
共同點都是會先執行該程式
 , 但並不是每個都可以
成功產生捷徑
ex. 書籤,直接傳訊,直接撥號 
Google 定位倒是可以。

所以
ShortcutTest
出現在該Level 也就會
被執行一次 , 所以接到 
Intent.ACTION_CREATE_SHORTCUT後 , 再完成捷徑的回傳程式就自finish() , 好讓
畫面跳回桌面 , 這邊都是自己的實驗和推測 , 有錯誤的話歡迎討論。



沒有留言:

張貼留言

Google Analytics