Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android實現qq郵箱多個圖標效果

android實現qq郵箱多個圖標效果

編輯:關於Android編程

前幾天,蛋疼的技術主管非要實現類似裝一個qq郵箱,然後可以使用qq郵箱日歷的那麼一個東西,相當於一個應用生成兩個圖標,但是不同的是點擊不同的圖標可以進入不同的應用,如下圖的效果。


\



<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+1eLQp7n7sNm2yMHL0rvM7NKysrvWqrXAyOe6ztfFytajrNa7xNzX1Ly6uOOjrLfWz+3Su8/C19S8ur3ivvbV4rj2zsrM4rXEuf2zzKOstPO4xcrH1eLR+bXEPC9wPgo8cD4xLsrXz8i31s72wLTLtdX7uPbXwMPmbHVuY2hlcsrH0ru49mFjdGl2aXR5o6zL+dPQtcTNvLHqtrzKx9K7uPawtMWltvjS0aOsteO79828seq+zcrHteO799K7uPawtMWlyLu688il1rTQ0GFjdGl2aXR5PC9wPgo8cD4yLrLpv7RsYXVuY2hlciBmcmFtZXdvcmuy47XE1LS0+sLro6xodHRwczovL2FuZHJvaWQuZ29vZ2xlc291cmNlLmNvbS9wbGF0Zm9ybS9wYWNrYWdlcy9hcHBzL0xhdW5jaGVyLyYjNDM7L21hc3Rlci9zcmMvY29tL2FuZHJvaWQvbGF1bmNoZXIvTGF1bmNoZXIuamF2YSAgwre+tsrH1eK49qOssum/tL/Jzai5/betx72ho9XiwODG5Mq1us3U29fUvLrQtLXEwODSssO7ybbH+LHwLiAg0vLOqkxhdW5jaGVyyse8zLPQwcthY3Rpdml0ebXEPC9wPgo8cD48L3A+CjxwcmUgY2xhc3M9"brush:java;">public final class Launcher extends Activity implements View.OnClickListener, OnLongClickListener其次我們只需要找到click事件就行,在這裡他會判斷被點擊view是文件夾還是應用程序,

public void onClick(View v) {
        Object tag = v.getTag();
        if (tag instanceof ApplicationInfo) {
            // Open shortcut
            final Intent intent = ((ApplicationInfo) tag).intent;
            startActivitySafely(intent);
        } else if (tag instanceof FolderInfo) {
            handleFolderClick((FolderInfo) tag);
        }
    }

接下來看看startActivitySafely,其實在這裡就是處理了下異常和添加一些個flag,但是flag是重點。解析來會繼續說flag

    void startActivitySafely(Intent intent) {
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        try {
            startActivity(intent);
        } catch (ActivityNotFoundException e) {
            Toast.makeText(this, R.string.activity_not_found, Toast.LENGTH_SHORT).show();
        } catch (SecurityException e) {
            Toast.makeText(this, R.string.activity_not_found, Toast.LENGTH_SHORT).show();
            e(LOG_TAG, "Launcher does not have the permission to launch " + intent +
                    ". Make sure to create a MAIN intent-filter for the corresponding activity " +
                    "or use the exported attribute for this activity.", e);
        }
    }
這裡其實都很簡單,就是添加一個flag,這個flag作用很大,仔細講一下

FLAG_ACTIVITY_NEW_TASK設置此狀態,首先會查找是否存在和被啟動的Activity具有相同的親和性的任務棧(即taskAffinity)如果有直接把這

個棧整體移動到前台,並保持棧中的狀態不變,即棧中的activity順序不變,如果沒有,則新建一個棧來存放被啟動的activity. 這就是為什麼我們點擊home鍵之後然後再點擊圖標會恢復到原來的狀態,而不是重新去創建一個activity。

通過以上的分析大概能實現這樣的東西了,現在我只需要讓他們運行在不同的任務棧裡面即可,相互之間不能夠影響。下面是大概實現的流程,僅供參考,因為這個只是基礎的模型而已。實際上我們在裡面加了很多業務。

\


大概的思路就這樣一下是代碼的實現。主要是放入了一個字段叫做class然後點擊圖標的時候獲取這個字段,打開相應的activity即可

public class BootupActivity extends Activity {

    private Handler handler  = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what)
            {
                case 1:

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

        Log.i("BootupActivity", "OnCreate");

        String className = getIntent().getStringExtra("Class");
        if (className==null) {
            addShortcutToDesktop(BootupActivity.this.getString(R.string.shopping_app_name), R.drawable.shopping_ic_launcher,
                    Activity1.class.getName(), Activity1.class);
            addShortcutToDesktop(BootupActivity.this.getString(R.string.xiaohua_app_name), R.drawable.xiaohua_ic_launcher,
                    Activity2.class.getName(), Activity2.class);
            startAppProcess(Activity1.class.getName());
        } else {
            startAppProcess(className);
        }


    }


    private void addShortcutToDesktop(String lable, int iconRes, String destClassName, Class bootupClass) {

        Intent shortcut = new Intent(
                "com.android.launcher.action.INSTALL_SHORTCUT");

        // no rebuilding
        shortcut.putExtra("duplicate", false);
        // shortcut.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
        // setting name
        shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, lable);
        // setting icon
        if (iconRes!=0) {
            shortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,
                    Intent.ShortcutIconResource.fromContext(this, iconRes));
        }

        // create a broadcast intent
        Intent intent = new Intent(this, bootupClass);
        intent.putExtra("Class", destClassName);
        intent.setAction(Intent.ACTION_MAIN);

        // setting intent
        shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, intent);

        // send broadcast
        sendBroadcast(shortcut);

    }
    private void startAppProcess(String bootupClass) {
        ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);

        Intent i = new Intent();

        i.setComponent(new ComponentName(this.getPackageName(), bootupClass));
        i.putExtra("class", bootupClass);

        this.startActivity(i);

    }


}


以下是需要在配置文件裡面配置的,需要注意到得時android:taskAffinity這個屬性,不同的activity需要配置不同的。把主要的activity和默認打開的activity的親和性配置成一樣得。保證點擊桌面圖標和應用圖標能夠打開相同的任務棧。然後注意把主要的BootupActivity放在第一個位置。其他得都需要加上一個action並且和主要的相同。


        
            
                
                

            
        
        
            
                

            
        
        
            
                


            
        
        
       
    
    


  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved