目标:
实现切换APP图标功能。即不同的时间显示不同的App Icon。
准备知识:
要实现切换APP图标的功能,就需要对配置在AndroidManifest.xml中的 < activity-alias>(Activity的别名) 有所了解。
< activity-alias>
即:Activity的别名,由targetActivity属性 命名。指定的target activity与别名activity在同一应用中,并且在清单中必须放在别名之前进行声明。
<activity-alias android:enabled=["true" | "false"]
android:icon="drawable resource"
android:label="string resource"
android:name="string"
android:targetActivity="string" >
. . .
</activity-alias>
属性:
android:enabled
系统是否可以通过此别名实例化目标 Activity。如果可以,则设为“true”;如果不能,则设为“false”。默认值为“true”。
android:icon
通过别名呈现给用户时目标 Activity 的图标。
android:name
别名的唯一名称。该名称应类似于完全限定类名。但是,与目标 Activity 的名称不同,别名名称是任意的,它不引用实际类。
android:targetActivity
可通过别名激活的 Activity 的名称。此名称必须与清单中别名前面的 元素的 name 属性匹配。
实施步骤:
一、androidManifest文件中配置
<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
// 别名activtiy的名称任意,手动创建空白 MainAliasActivity
android:name="MainAliasActivity"
// 默认指定false,如果默认指定true。则应用会出现两个App Icon
android:enabled="false"
// 点击别名activity icon
android:targetActivity=".MainActivity"
android:icon="@mipmap/app_logo_square">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity-alias>
创建一个空白的别名activity
public class MainAliasActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// do nothing!!!
}
}
二、设置定时器实现Icon切换
实现切换Icon方法:
public void switchAppIcon(boolean isSwich){
ComponentName disabletName = new ComponentName(this, MainActivity.class.getName());
ComponentName enableName = new ComponentName(this, MainAliasActivity.class.getName());
if(!isSwich){
enableName = new ComponentName(this, MainActivity.class.getName());
disabletName = new ComponentName(this, MainAliasActivity.class.getName());
}
this.getPackageManager()
.setComponentEnabledSetting(disabletName,
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
this.getPackageManager()
.setComponentEnabledSetting(enableName,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
}
设置定时器(这里使用Rxjava 也可以使用Handler、Timer等):
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
// 10秒后 切换Icon
Observable.timer(10, TimeUnit.SECONDS)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<Long>() {
@Override
public void accept(Long aLong) throws Exception {
Log.d("App","切换Icon");
switchAppIcon(true);
}
});
// 20秒后 恢复Icon
Observable.timer(20, TimeUnit.SECONDS)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<Long>() {
@Override
public void accept(Long aLong) throws Exception {
Log.d("App","恢复Icon");
switchAppIcon(false);
}
});
}
小结:
这里只把切换app Icon简单思路串通了一下,要实现完整的切换App Icon的方法还需要考虑
通过Application#registerActivityLifecycleCallbacks方法注册了对应用内Activity生命周期的监听,通过是否有活跃状态的Activity判断应用是否进入了后台。然后再进行Icon的切换和恢复。
参考:
双11快到了,不给你的APP加上自动换图标的功能吗?
< activity-alias>
安卓-自动定时切换APP图标,节假日APP icon图标自动变化