android activity alias,動態更換桌標 Activity-alias

前言

動態更換App圖標,網上可以收搜到很多,這里也是參考前人經驗,讀完本文可以得到,如何動態更換桌標(非網絡獲取桌標圖片),標志位的闡述,更加透徹的理解.

用到的知識

activity-alias并不是代表一個Activity,而是代表一個已經存在的Activity的別名。

它使用在清單文件中,類似Activity標簽。它可用來設置某個Activity的快捷入口

activity-alias基本用法

android:exported=["true" | "false"]

android:icon="drawable resource"

android:label="string resource"

android:name="string"

android:permission="string"

android:targetActivity="string" >

...

屬性解釋:

屬性

含義

enabled

是否生效。配置多個activity-alias時,如果只想一個生效,就設置一個為true

exported

是否可以被其他應用調起,配置intent-filter時默認為true,未配置intent-filter時默認為false,只能被應用自身調起

icon

自定義生效時的icon

label

作用同Activity標簽中的label屬性,主要表現為桌面上的app名稱和activity的title的名稱

name

該activity-alias的名字

permission

指明通過別名聲明調起目標Activity所必需的權限

targetActivity

指明目標Activity,類似于Activity標簽中的name屬性,需寫明包類路徑。表明通過activity-alias調起的是哪個Activity

使用

首先配置AndroidManifest.xml,設置別名

android:name=".activitys.WelcomeActivity"

android:configChanges="keyboard|keyboardHidden|orientation"

android:hardwareAccelerated="true"

android:label="@string/app_name"

android:screenOrientation="portrait"

android:theme="@style/Acrivity_Fullscreen">

android:name=".changeLauncherIconActivity"

android:configChanges="keyboard|keyboardHidden|orientation"

android:enabled="false"

android:icon="@drawable/yishijie_logo"

android:label="@string/app_name"

android:screenOrientation="portrait"

android:targetActivity=".activitys.WelcomeActivity">

這里要注意的是

android:name 標識:主要用于在代碼中獲取此組件enable的狀態;

android:targetActivity標識,targetActivity標識就是點擊后跳轉的Activity;

icon和lable分別是啟動圖標和桌面名稱

代碼配置

思路是首先獲取服務端下發接口,緩存到本地,等用戶退出主頁的時候執行更換圖標的邏輯

獲取服務端接口,接口提示更換節日圖標

判斷要顯示組件的狀態是否為顯示狀態COMPONENT_ENABLED_STATE_ENABLED

private boolean isComponentState(ComponentName componentName) {

return mPackageManager.getComponentEnabledSetting(componentName) != PackageManager.COMPONENT_ENABLED_STATE_ENABLED;

}

注意:這里的標示位

屬性

含義

COMPONENT_ENABLED_STATE_DEFAULT

默認狀態,xml預設的狀態

COMPONENT_ENABLED_STATE_ENABLED

此組件或應用程序已明確啟用,無論其清單中指定了什么。

COMPONENT_ENABLED_STATE_DISABLED

此組件或應用程序已明確禁用,無論其清單中指定了什么。

COMPONENT_ENABLED_STATE_DISABLED_USER

用戶已明確禁用該應用程序,無論其在清單中指定了什么。

COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED

his application should be considered, until the point where the user actually wants to use it. (這個不清楚怎么翻才好,沒有使用過)

如果不是則設置其可見,否則不變

注意這里設置標志位是永久性的,即使App升級獲取此組件狀態時,也是之前的值

private void enableComponent(ComponentName componentName) {

//此方法用以啟用和禁用組件,會覆蓋Androidmanifest文件下定義的屬性

mPackageManager.setComponentEnabledSetting(componentName,

PackageManager.COMPONENT_ENABLED_STATE_ENABLED,

PackageManager.DONT_KILL_APP);

}

完整代碼

public class ChangeAppIconUtils {

private PackageManager mPackageManager;

//默認桌標

private static final String DEFAULT_ICON = "com.x.x.activitys.WelcomeActivity";

//活動桌標

private static final String ANTHER_ICON = "com.x.x.changeLauncherIconActivity";

//緩存文件鍵值

public static final String KEY_LAUNCHER_ICON = "key_launcher_icon";

public ChangeAppIconUtils(PackageManager mPackageManager) {

this.mPackageManager = mPackageManager;

}

/**

* 啟動組件

*

* @param componentName 組件名

*/

private void enableComponent(ComponentName componentName) {

//此方法用以啟用和禁用組件,會覆蓋Androidmanifest文件下定義的屬性

mPackageManager.setComponentEnabledSetting(componentName,

PackageManager.COMPONENT_ENABLED_STATE_ENABLED,

PackageManager.DONT_KILL_APP);

}

/**

* 禁用組件

*

* @param componentName 組件名

*/

private void disableComponent(ComponentName componentName) {

mPackageManager.setComponentEnabledSetting(componentName,

PackageManager.COMPONENT_ENABLED_STATE_DISABLED,

PackageManager.DONT_KILL_APP);

}

/**

* 當前組件的狀態,判斷當前enable狀態

* 即使xml里面設置enable=false 標志位第一次獲取時 還是COMPONENT_ENABLED_STATE_DEFAULT

* 所以這里判斷是否為enable

*

* @param componentName return true 未被應用為可顯示

*/

private boolean isComponentState(ComponentName componentName) {

//默認圖標且為默認狀態則返回false

return !(DEFAULT_ICON.equals(componentName.getClassName()) && mPackageManager.getComponentEnabledSetting(componentName) == PackageManager.COMPONENT_ENABLED_STATE_DEFAULT)

&& mPackageManager.getComponentEnabledSetting(componentName) != PackageManager.COMPONENT_ENABLED_STATE_ENABLED;

}

/**

* 更換app 圖標

*

* @param context context

* @param changeIcon changeIcon

*/

private void changeIconState(Context context, String changeIcon) {

ComponentName defaultIcon = new ComponentName(context, DEFAULT_ICON);

ComponentName otherIcon = new ComponentName(context, ANTHER_ICON);

//判斷狀態

if (DEFAULT_ICON.equals(changeIcon)) {//設置默認icon

boolean componentState = isComponentState(defaultIcon);

if (componentState) {//如果不一樣則設置

enableComponent(defaultIcon);

disableComponent(otherIcon);

// restartSystemLauncher(context, mPackageManager);

}

} else {//其它icon

boolean componentState = isComponentState(otherIcon);

if (componentState) {

enableComponent(otherIcon);

disableComponent(defaultIcon);

// restartSystemLauncher(context, mPackageManager);

}

}

}

/**

* 沒啥用,有的rom不會讓你殺掉Launcher進程,例如華為,VIVO

* @param context

* @param pm

*/

private void restartSystemLauncher(Context context, PackageManager pm) {

ActivityManager am = (ActivityManager) context.getSystemService(Activity.ACTIVITY_SERVICE);

Intent i = new Intent(Intent.ACTION_MAIN);

i.addCategory(Intent.CATEGORY_HOME);

i.addCategory(Intent.CATEGORY_DEFAULT);

List resolves = pm.queryIntentActivities(i, 0);

for (ResolveInfo res : resolves) {

if (res.activityInfo != null && am != null) {

am.killBackgroundProcesses(res.activityInfo.packageName);

}

}

}

public void setAppLauncherIcon(Context context, String tagName) {

if (!TextUtils.isEmpty(tagName)) {

if ("icon2".equals(tagName)) {

changeIconState(context, ANTHER_ICON);

} else {

changeIconState(context, DEFAULT_ICON);

}

}

}

}

使用的時候只需要

new ChangeAppIconUtils(getPackageManager()).setAppLauncherIcon(getApplicationContext(), sharePreUtils.getStringValue(ChangeAppIconUtils.KEY_LAUNCHER_ICON, ""));

這里的sharepreUtils是工具類獲取接口中下發的狀態值,icon1默認圖標,icon2為節日圖標,因為之前有人說會導致app的重啟,所以這里的操作時放在主Activity onDestory里面執行的.

問題

目前已知的問題,當改完圖標之后,使用AS再次啟動會無法啟動,把快速啟動關掉就可以了

Error while executing: am start -n "in.myinnos.changeappiconandname/in.myinnos.changeappiconandname.MainActivity-settings" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER

Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=in.myinnos.changeappiconandname/.MainActivity-settings }

Error type 3

Error: Activity class {in.myinnos.changeappiconandname/in.myinnos.changeappiconandname.MainActivity-settings} does not exist.

Error while Launching activity

這里我使用打包的方式覆蓋安裝沒有出現這個問題

改過圖標后,會過一會兒圖標才會改變,有的(華為)改變之前點擊會提示,但是桌面更新后就可以點進去了

使用重啟桌面的方法,加快圖標的切換,1.會被系統禁用例如華為 Vivo Oppo則無法重啟桌面2.小米可以,但是還是會在1~3秒的時候關閉應用一次

僅僅修改的是啟動圖標,如果有快捷方式那么快捷方式不會發生改變,當然可以使用代碼動態更新快捷方式

無法動態加載網絡圖片,還是僅僅是本地資源修改的桌標

參考

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/272999.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/272999.shtml
英文地址,請注明出處:http://en.pswp.cn/news/272999.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python替代php,Python架構的PHP替代方案

I am happily using fabric for my Python projects for deployment. Now I am engaged in a larger PHP project and wondering if there is something like fabric for PHP?解決方案Hmm? Why does it matter? Fabric is just python scripting. So its project language a…

MAC終端安裝grunt--javascript世界得構建工具

祝賀我成為前端啦!~~從年前得小測試到今年得前端,成功轉型!我真是一個進步得好青年,好少女! 這兩天出去受虐,面了兩家前端,表現非常不好,還是回到我現在得公司好好沉淀技術&#xff…

android sdk eclipse沒導入,Android—新的eclipse導入SDK出錯解決辦法

原先系統崩潰,重裝系統,加入一塊內存條,從32位變成62位,原先的eclipse用不了;去官網下載64位的eclipse,安裝,用一樣的方法導入SDK。這時候肯定會提示錯誤,如下:1.This An…

兩個分數化簡比怎么化_我學《分數的意義》心得

停課不停學已經有將近兩個月了,我們邁入了“分數”這一部分。聽媽媽說,這一塊內容很重要,可我覺得到目前為止(明天就學真分數、假分數和帶分數了),分數好像并不比四年級難。看了看書,再做點練習,把這點新的…

html在線拖拽環繞,jQuery實現html元素拖拽

代碼很簡單,效果非常棒,直接給大家上源碼:html定投金額 :元10050010002000300040005000600070008000900010000單位:元css.money-input{margin:36px auto 0;width:330px;font-size:14px;color:#818181}.input-rela{width:250px;height:42px;di…

iphone 抹除設備是什么意思_SMT設備有哪些,SMT是什么意思?

SMT設備其實就是表面貼裝技術所需要的機器,一般一條SMT整線常規包含以下設備:上板機、印刷機、接駁臺、SPI、貼片機、插件機、回流焊、波峰焊、AOI、X-ray、下板機等設備,以上設備是一條比較完整的smt配線清單設備,不同工廠可根據…

visual studio 安裝Entity framework失敗

今日通過Nuget安裝Entity Framwork 6.1.3時候在最后一步石一直報錯,提示“安裝失敗,正在回滾”。 回滾也就罷了,居然還卸載不了安裝了一半的EF。 shit 考慮是不是得用管理員模式run Visual Studio 試之,然并卵。 是不是Nuget版本太…

筆記本軟件頁面分辨率低_筆記本最容易忽略的屏幕 有幾個參數一定要知道

對于第一次購買筆記本的朋友來說,往往會忽視一個重要的硬件,那就是屏幕。尺寸有多大?分辨率是多少?色彩好不好?這些都應該是大家應該關心的問題。下面筆者就和大家聊聊筆記本屏幕應該注意的幾個參數。1、尺寸屏幕尺寸示…

html優美界面左側下拉,一組時尚的側邊欄菜單和下拉列表UI設計

這是一款非常時尚的可伸展的側邊欄菜單和select下拉列表以及手風琴式垂直下拉列表UI設計效果。它們通過簡單的CSS樣式設置,以及和jQuery,jqueryUI的配合,制作出非常時尚的web組件UI設計效果。制作方法HTML結構側邊欄的HTML結構使用在中嵌套無…

.NET基礎 (03)生成、部署和管理

生成、部署和管理1 如何生成強簽名的程序集2 如何把程序集放入GAC中3 延遲簽名及其作用4 程序集的版本分哪幾部分 1 如何生成強簽名的程序集在生成程序集時,CLR提供了兩種可選類型:強簽名程序集。弱簽名程序集。 強簽名程序集是一個帶有公鑰和數字簽名的…

.net 識別一維碼_天若OCR文字識別 v5.0 原創好用的OCR及翻譯小工具

一款非常好用的OCR及翻譯小工具,集合百度、騰訊、有道、搜狗,調用了各大網站的ocr接口,免費不限次數(有道免費接口有ip限制僅供娛樂)。1、對于搜狗的接口調用的還是http://ocr.shouji.sogou.com/v2/ocr/json,這個接口識別效果很好…

html中div中加顏色,css怎樣給div加邊框顏色

css怎樣給div加邊框顏色1、css為div四個邊分別添加邊框border-color:#000(設置4邊邊框顏色為黑色)border-color:顏色值,即可設置對象邊框顏色border-left-color:#000 設置左邊框顏色為黑色border-right-color:#000 設置右邊框顏色為黑色border-top-color:#000 設置上…

Microsoft Dynamics CRM 前瑞開發

做CRM開發最大的感受就是其前瑞開發過程中,調試起來比較麻煩,需要做一些斷點還要配制一些瀏覽器設置,對新手來說比較困難。還有就是對REST調試,經常為了調試一個正確的結果而花費大量的時間。現在推薦一個REST 工具來調試CRM的前瑞…

割線法求解過程_求解稀疏優化問題2——臨近點方法+半光滑牛頓法

這篇文章是我之前一篇文章的兄弟篇,沒看過的可以看下面這個。鄧康康:求解稀疏優化問題——半光滑牛頓方法?zhuanlan.zhihu.com我們考慮的問題仍然是如下的一般問題:其中 ,并且 特別大;表示一個凸可微函數,例如 表示一…

html 樹形圖可拖拽,HTML5拖拽API實現vue樹形拖拽組件

因業務場景需要一個可拖拽修改節點位置的樹形組件,因此動手擼了一個,乘此機會摸了一把html5原生拖拽。近期有時間將核心部分代碼抽出,簡單說下實現方式。1.樹形結構-組件遞歸使用樹形結構非常簡單,tree組件作為父組件,…

navicat 或者workbench 無法連接127.0.0.1(61)的解決方法

1、輸入mysql -uroot 進入命令行模式, 2、輸入"show variables like %sock%;"查看sock文件所在位置 如: 3、配置客戶端(以navicat為例) (1)打開mac 下的navicat(2)建立相應的連接&…

jmeter如何定位網絡延時_JMeter用戶定義變量和properties變量高級使用

Jmeter有個配置元素叫做用戶自定義變量(英文名稱是UserDefinedVariables)而我們提到的vars即是Variables的簡寫。 之前我們也說到過Jmeter的腳本中(jsr223sampler或者beanshell編寫的腳本)使用varsput和varsget的操作(varsget和put的操作僅在threadgroup測試組線程中執行&#…

html5與跨平臺開發,HTML5應用與跨平臺應用開發

本課程將總體講解開發HTML5應用和跨平臺應用的方法,共分成三部分。第一部分為HTML5開發基礎,帶你分析并掌握多種移動開發技術和設計方式;第二部分為HTML5高級應用,講解在HTML5中調用其它應用或服務的方法;第三部分為跨…

jQuery中的幾個模塊總結

Query插件,以備并希望在前端方面有所長進。請批評指正。 一,類型判斷全解 JQuery判斷類型擴展方法:$.type() 1 /*type: function( obj ) { 2 if ( obj null ) { 3 return obj ""; 4 } …

python實現連續數列相加_技術 | Python經典面試題解析實現斐波那契數列

黑馬程序員微信號:heiniu526傳智播客旗下互聯網資訊,學習資源免費分享平臺大家在面試過程中經常會考到斐波那契數列,斐波那契數列(Fibonacci)最早由印度數學家Gopala提出,而第一個真正研究斐波那契數列的是意大利數學家 Leonardo …