专栏名称: 安卓开发精选
伯乐在线旗下账号,分享安卓应用相关内容,包括:安卓应用开发、设计和动态等。
目录
相关文章推荐
开发者全社区  ·  华为青浦的工作餐,被网友调侃太贵...... ·  11 小时前  
开发者全社区  ·  深圳公务员天也塌了 ·  16 小时前  
开发者全社区  ·  AI提升成人玩具用户体验 ·  昨天  
开发者全社区  ·  人大发TT了 ·  3 天前  
51好读  ›  专栏  ›  安卓开发精选

上次发版我就改了一行代码!

安卓开发精选  · 公众号  · android  · 2016-12-29 21:12

正文

(点击 上方公众号 ,可快速关注)


来源:伯乐在线专栏作者 - eclipse_xu

链接: http://android.jobbole.com/85251/

如有好文章投稿,请点击 → 这里了解详情


动态更换应用Icon


产品:我们可以动态更换App在Launcher里面的Icon吗

开发:不可以

产品:我们可以动态更换App在Launcher里面的Icon吗

开发:不可以

产品:我们可以动态更换App在Launcher里面的Icon吗

开发:不可以

产品:我们可以动态更换App在Launcher里面的Icon吗

开发:让我想想……


原理1——activity-alias


在AndroidMainifest中,有两个属性:


// 决定应用程序最先启动的Activity

android . intent . action . MAIN

// 决定应用程序是否显示在程序列表里

android . intent . category . LAUNCHER


另外,还有一个activity-alias属性,这个属性可以用于创建多个不同的入口,相信做过系统Setting和Launcher开发的开发者在系统的源码中应该见过很多。


原理2——PM.setComponentEnabledSetting


PackageManager是一个大统领类,可以管理所有的系统组件,当然,如果Root了,你还可以管理其它App的所有组件,一些系统优化工具就是通过这个方式来禁用一些后台Service的。


使用方式异常简单:


private void enableComponent ( ComponentName componentName ) {

mPm . setComponentEnabledSetting ( componentName ,

PackageManager . COMPONENT_ENABLED_STATE_ENABLED ,

PackageManager . DONT_KILL_APP );

}

private void disableComponent ( ComponentName componentName ) {

mPm . setComponentEnabledSetting ( componentName ,

PackageManager . COMPONENT_ENABLED_STATE_DISABLED ,

PackageManager . DONT_KILL_APP );

}


根据PackageManager.COMPONENT_ENABLED_STATE_ENABLED和PackageManager.COMPONENT_ENABLED_STATE_DISABLED这两个标志量和对应的ComponentName,就可以控制一个组件的是否启用。


动态换Icon


有了上面的两个原理,来实现动态更换Icon就只剩下思路问题了。


首先,我们创建一个Activity,作为默认的入口并带着默认的图片,再创建一个双11的activity-alias,指向默认的Activity并带有双11的图片,再创建一个双12的activity-alias,指向默认的Activity并带有双12的图片……等等等。


activity android : name = ".MainActivity" >

intent - filter >

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

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

intent - filter >

activity >

activity - alias

android : name = ".Test11"

android : enabled = "false"

android : icon = "@drawable/s11"

android : label = "双11"

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 = ".Test12"

android : enabled = "false"

android : icon = "@drawable/s12"

android : label = "双12"

android : targetActivity = ".MainActivity" >

intent - filter >

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

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

intent - filter >

activity - alias >


等等,这样有个问题,那就是这样会在Launcher上显示3个入口,所以,默认我们会把这些activity-alias先禁用,等到要用的时候再启用,养兵千日,用兵一时。


public class MainActivity extends AppCompatActivity {

private ComponentName mDefault ;

private ComponentName mDouble11 ;

private ComponentName mDouble12 ;

private PackageManager mPm ;

@ Override

protected void onCreate ( Bundle savedInstanceState ) {

super . onCreate ( savedInstanceState );

setContentView ( R . layout . activity_main );

mDefault = getComponentName ();

mDouble11 = new ComponentName (

getBaseContext (),

"com.xys.changeicon.Test11" );

mDouble12 = new ComponentName (

getBaseContext (),

"com.xys.changeicon.Test12" );

mPm = getApplicationContext (). getPackageManager ();

}

public void changeIcon11 ( View view







请到「今天看啥」查看全文