Android動態(tài)更換桌面圖標

動態(tài)更換APP 桌面icon的引述

activity組件及定義“同盟”組件activity-alias位隶;

PackageManager類進行啟用/禁用組件;

PackageInfo的簡介县遣;

新名詞記錄{PackageInfo:Androidmanifest.xml文件描述類}

使用Activity-alias


<activity

? ? android:name="com.aliasicon.MainActivity"

? ? android:enabled="false"

? ? android:exported="true"

? ? >

? ? <intent-filter>

? ? ? ? <action android:name="android.intent.action.MAIN"/>

? ? ? ? <category android:name="android.intent.category.LAUNCHER"/>

? ? </intent-filter>

</activity>

<activity-alias

? ? android:name="com.android.simple.activity.HeadPageGenearlActivity"

? ? android:configChanges="orientation|keyboardHidden|fontScale|screenSize"

? ? android:enabled="true"

? ? android:exported="true"

? ? android:icon="@drawable/icon"

? ? android:label="@string/app_general_name"

? ? android:screenOrientation="portrait"

? ? android:targetActivity=".MainActivity">

? ? <intent-filter>

? ? ? ? <action android:name="android.intent.action.MAIN"/>

? ? ? ? <category android:name="android.intent.category.LAUNCHER"/>

? ? </intent-filter>

</activity-alias>

<activity-alias

? ? android:name="com.android.simple.activity.HeadPageLicaiActivity"

? ? android:configChanges="orientation|keyboardHidden|fontScale|screenSize"

? ? android:enabled="false"

? ? android:exported="true"

? ? android:icon="@drawable/icon_licai"

? ? android:label="@string/app_licai_name"

? ? android:screenOrientation="portrait"

? ? android:targetActivity=".MainActivity">

? ? <intent-filter>

? ? ? ? <action android:name="android.intent.action.MAIN"/>

? ? ? ? <category android:name="android.intent.category.LAUNCHER"/>

? ? </intent-filter>

</activity-alias>

String systemPath = "com.aliasicon.MainActivity";

String springPath = "com.android.simple.activity.CommHeadPageAliasActivity";

String licaiPath = "com.android.simple.activity.CommHeadPageLicaiActivity";

String genearlPath = "com.android.simple.activity.CommHeadPageGenearlActivity";

String finalPath = "";

ComponentName genearlComponent;

ComponentName licaiComponent;

ComponentName springComponent;

@Override

protected void onCreate(Bundle savedInstanceState) {

? ? super.onCreate(savedInstanceState);

? ? setContentView(R.layout.activity_main);

? ? genearlComponent = new ComponentName(getApplication(), genearlPath);

? ? licaiComponent = new ComponentName(getApplication(), licaiPath);

? ? springComponent = new ComponentName(getApplication(), springPath);

//第一個默認按鈕

? ? Button btnDefault = (Button) findViewById(R.id.ToDefault);

? ? btnDefault.setOnClickListener(new View.OnClickListener() {

? ? ? ? @Override

? ? ? ? public void onClick(View v) {

? ? ? ? ? ? disableComponent(MainActivity.this, licaiComponent);

? ? ? ? ? ? disableComponent(MainActivity.this, springComponent);

? ? ? ? ? ? enableComponent(MainActivity.this, genearlComponent);

? ? ? ? }

? ? });

? ? //理財按鈕

? ? Button btnLiCai = (Button) findViewById(R.id.ToLiCai);

? ? btnLiCai.setOnClickListener(new View.OnClickListener() {

? ? ? ? @Override

? ? ? ? public void onClick(View v) {

? ? ? ? ? ? disableComponent(MainActivity.this, genearlComponent);

? ? ? ? ? ? disableComponent(MainActivity.this, springComponent);

? ? ? ? ? ? enableComponent(MainActivity.this, licaiComponent);

? ? ? ? }

? ? });

? ? //春節(jié)按鈕

? ? Button btnSpring = (Button) findViewById(R.id.ToSpring);

? ? btnSpring.setOnClickListener(new View.OnClickListener() {

? ? ? ? @Override

? ? ? ? public void onClick(View v) {

? ? ? ? ? ? disableComponent(MainActivity.this, genearlComponent);

? ? ? ? ? ? disableComponent(MainActivity.this, licaiComponent);

? ? ? ? ? ? enableComponent(MainActivity.this, springComponent);

? ? ? ? }

? ? });

}

/**

* 啟用組件 *

* @param componentName

* 重要方法

*/

private void enableComponent(Activity activity, ComponentName componentName) {

? ? PackageManager pm = activity.getPackageManager();

? ? int state = pm.getComponentEnabledSetting(componentName);

? ? if (PackageManager.COMPONENT_ENABLED_STATE_ENABLED == state) {

? ? ? ? //已經啟用

? ? ? ? return;

? ? }

? ? pm.setComponentEnabledSetting(componentName,

? ? ? ? ? ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED,

? ? ? ? ? ? PackageManager.DONT_KILL_APP);

}

/**

* 禁用組件 *

* @param componentName

* 重要方法

*/

private void disableComponent(Activity activity, ComponentName componentName) {

? ? PackageManager pm = activity.getPackageManager();

? ? int state = pm.getComponentEnabledSetting(componentName);

? ? if (PackageManager.COMPONENT_ENABLED_STATE_DISABLED == state) {

? ? ? ? //已經禁用

? ? ? ? return;

? ? }

? ? pm.setComponentEnabledSetting(componentName,

? ? ? ? ? ? PackageManager.COMPONENT_ENABLED_STATE_DISABLED,

? ? ? ? ? ? PackageManager.DONT_KILL_APP);

}

public void saveData(String savePath) {

? ? SharedPreferences sp = getSharedPreferences("Icon", Context.MODE_PRIVATE);

? ? //獲取到edit對象

? ? SharedPreferences.Editor edit = sp.edit();

? ? //通過editor對象寫入數據

? ? edit.putString("Value", savePath);

? ? //提交數據存入到xml文件中

? ? edit.commit();

}

public String getData() {

? ? SharedPreferences sp = getSharedPreferences("Icon", Context.MODE_PRIVATE);

? ? return sp.getString("Value", "");

}

其他

? ? ? 通過上面的程序能夠實現卻換圖標贡未;如果代碼里通過節(jié)假日的時間進行控制,則客戶打開app會自動的切換圖標锚国;

? ? ? 是不是很神奇腕巡?先別高興太早。

App的覆蓋

? ? ? 任何App都會更新血筑,進行覆蓋安裝绘沉。覆蓋安裝的Manifest的配置不當導致出現難以挽回的問題。

? ? ? 1豺总、從上面的xml里配置可見车伞,一個Activity和兩個Activity-alisa的配置情況:

Activity的android:enabled="false"

第一個Activity-alias的android:enabled="true"

第二個Activity-alias的android:enabled="false"

? ? ? ? ? ? 所以App打開,桌面上默認的就是使用第一個Activity-alias的名字和圖標喻喳。

? ? ? 2另玖、如果新版本的配置還是按照這個配置(即使添加了新的alias,只要默認的Activity-alias不發(fā)生變化)客戶端額升級覆蓋安裝表伦,是不會出現錯誤的谦去。

3、我們稱之為“方案一”

桌面上出現兩個圖標的問題

? ? ? 1蹦哼、如果新版本把Activity的enable設置為true(方案二)鳄哭,則桌面上除了原來的Activity-alias圖標之外,還擁有了該Activity的圖標纲熏,即有了兩個圖標妆丘;

Activity的android:enabled="true"

第一個Activity-alias的android:enabled="false"

第二個Activity-alias的android:enabled="false"

? ? ? 3、如果試圖使用使用上面的代碼里的disableComponent方法或者android:enabled="false"隱藏顯示的Activity-alias圖標局劲,則導致兩個圖標都消失勺拣;

桌面上圖標消失的問題

? ? ? 1、方案二會出現兩個圖標容握,如果再使用方案一進行覆蓋宣脉,則兩個圖標都消失。

? ? ? 2剔氏、如果再次使用方案二進行覆蓋塑猖,則圖標還是能重新顯示出來的。

總結

? ? ? 1谈跛、如果使用方案一進行覆蓋安裝羊苟,不管圖標怎么動態(tài)的變換,再使用方案一進行覆蓋安裝感憾,是正常的蜡励;

? ? ? 2、如果使用方案二進行覆蓋安裝阻桅,不管配置的圖標是什么樣的凉倚,再使用方案二進行覆蓋安裝,也是正常的嫂沉;

? ? ? 3稽寒、如果使用方案一進行覆蓋安裝,如果圖標沒有動態(tài)切換的情況下趟章,再使用方案二進行覆蓋安裝杏糙,也是正常的;

? ? ??4蚓土、如果使用方案一進行覆蓋安裝宏侍,如果圖標已經經過動態(tài)切換的情況下,再使用方案二進行覆蓋安裝蜀漆,會出現雙圖標的谅河;

? ? ??5、如果使用方案一進行覆蓋安裝确丢,如果圖標已經經過動態(tài)切換的情況下绷耍,再使用方案二進行覆蓋安裝,會出現雙圖標的蠕嫁;如果在進行使用代碼試圖隱藏其中一個锨天,則兩個圖標都消失;

? ? ? 6剃毒、如果使用方案一進行覆蓋安裝病袄,如果圖標沒有動態(tài)切換的情況下,再使用方案二進行覆蓋安裝赘阀,也是正常的益缠,再使用方案一進行覆蓋安裝,也是正常的基公;

最終方案(方案一)

? ? ? 采用方案一的方案幅慌,即通過代碼動態(tài)變動圖標,一定要注意以下事項:

? ? ? 1轰豆、Activity的android:enabled="false"

? ? ? ? ? ? 如果設置為true了胰伍,則會出現雙圖標齿诞;

? ? ? 2、Activity-alias的android:enabled="true"的默認顯示的項不要中途進行變動骂租,如果確實需要使用新的默認值祷杈,則使用代碼進行動態(tài)變換;

? ? ? 3渗饮、Activity-alias的android:enabled="true"的不要設置為多個但汞,否則會出現多個圖標,如果試圖通過代碼進行隱藏其中的一個或者幾個互站,可能會出現圖標消失的情況私蕾。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市胡桃,隨后出現的幾起案子踩叭,更是在濱河造成了極大的恐慌,老刑警劉巖标捺,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件懊纳,死亡現場離奇詭異,居然都是意外死亡亡容,警方通過查閱死者的電腦和手機嗤疯,發(fā)現死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來闺兢,“玉大人茂缚,你說我怎么就攤上這事∥萏罚” “怎么了脚囊?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長桐磁。 經常有香客問我悔耘,道長,這世上最難降的妖魔是什么我擂? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任衬以,我火速辦了婚禮,結果婚禮上校摩,老公的妹妹穿的比我還像新娘看峻。我一直安慰自己,他們只是感情好衙吩,可當我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布互妓。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪冯勉。 梳的紋絲不亂的頭發(fā)上澈蚌,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天珠闰,我揣著相機與錄音伏嗜,去河邊找鬼。 笑死军熏,一個胖子當著我的面吹牛,可吹牛的內容都是我干的摩幔。 我是一名探鬼主播或衡,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼舶担,長吁一口氣:“原來是場噩夢啊……” “哼柄瑰!你這毒婦竟也來了?” 一聲冷哼從身側響起详囤,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后理澎,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡户侥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年刃泌,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片耙替。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡亚侠,死狀恐怖,靈堂內的尸體忽然破棺而出俗扇,到底是詐尸還是另有隱情硝烂,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布铜幽,位于F島的核電站滞谢,受9級特大地震影響,放射性物質發(fā)生泄漏除抛。R本人自食惡果不足惜狮杨,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望到忽。 院中可真熱鬧橄教,春花似錦清寇、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至持灰,卻和暖如春盔夜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背堤魁。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工喂链, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人姨涡。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓衩藤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親涛漂。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,033評論 2 355