赞
踩
时不时的我们就会发现,一些我们常见的应用,比如某宝,某东,在一些特殊的日子中,比如双十一、元旦,为了迎合这样一个日子的气氛,在桌面的应用图标就会发生改变,再譬如一些理财产品在举办一些活动的时候也会醒目的在桌面图标上有所展示。
在这期间我们并没有更新应用,但是桌面图标自动发生了变化,不仅醒目的为用户提示了一些信息,还体现了个性化的定制内容,从而达到了传达营销信息和提高用户体验的目的。
本篇我们就套路下该逻辑的实现方式。
- 动态更换桌面图标,可以显式告知用户关键信息或个性化定制。
- 譬如可以在口袋助理桌面图标加入ISO认证字眼,以告知用户口袋助理通过了ISO认证;
- 譬如节假日自动更换图标以展现个性化定制;
- 远程控制桌面图标,通过运营后台发送指令自动切换具体用户图标为某预设样式;
- 为业务模块创建快捷方式,减少操作序列,提高用户体验;
Android的API里已经提供了类似的的功能,但是需要我们组合起来使用
AndroidManifest中支持标签activity-alias,顾名思义,即activity的别名,目的在于解决重复的Activity。activity-alias并非代表一个独立的Activity,而是为一个已经存在的Activity创建的别名
activity-alias作为一个已存在Activity的别名,则应该可以通过该别名标签声明快速打开目标Activity。因此activity-alias可用来设置某个Activity的快捷入口,可以放在桌面上或者通过该别名被其他组件快速调起。该标签元素支持一些属性及intent-filter、meta-data等配置,因此可以触发一些跟目标Activity不同的功能逻辑,虽然打开的是同一个Activity。
举个简单的例子,我们下文会用到
如之前需要先打开主界面,然后才能点击进入某个Activity,如果使用activity-alias为该Activity配置一个快捷入口,甚至可以为其在桌面生成一个图标,然后点击桌面图标可直接进入该Activity,该功能可满足某些需要快速到达功能界面的需求
<activity-alias android:enabled=["true" | "false"]
android:exported=["true" | "false"]
android:icon="drawable resource"
android:label="string resource"
android:name="string"
android:permission="string"
android:targetActivity="string" >
. . .
</activity-alias>
部分属性说明如下
需要注意的是,activity-alias的属性可以理解为activity属性的子集,如果是activity-alias和activity共有的属性,则以activity-alias为准,目标Activity中的设置并不会在activity-alias中生效;如果是仅activity才有的属性,则为目标Activity配置的属性会在activity-alias中生效
另外需要注意的一点是,在AndroidManifest配置文件中,activity-alias标签元素必须声明在目标Acitvity对应的activity标签元素之后,否则会编译错误
activity-alias可以设置自己的intent-filter或meta-date,最常用的就是设置如下intent-filter从而在桌面Launcher上创建一个快捷入口:
<intent-filter>
// 决定应用程序最先启动的Activity
<action android:name="android.intent.action.MAIN" />
// 决定应用程序是否显示在程序列表里
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
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,就可以控制一个组件的是否启用
我们创建一个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>
默认我们会把这些activity-alias先禁用“android:enabled=”false””,等到要用的时候再启用,以避免Launcher上显示3个入口
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) {
disableComponent(mDefault);
disableComponent(mDouble12);
enableComponent(mDouble11);
}
public void changeIcon12(View view) {
disableComponent(mDefault);
disableComponent(mDouble11);
enableComponent(mDouble12);
}
private void enableComponent(ComponentName componentName) {
if(componentName == null){
return;
}
if(pm.getComponentEnabledSetting(componentName) == PackageManager.COMPONENT_ENABLED_STATE_ENABLED){
return;
}
mPm.setComponentEnabledSetting(componentName,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
}
private void disableComponent(ComponentName componentName) {
if(componentName == null){
return;
}
if(pm.getComponentEnabledSetting(componentName) == PackageManager.COMPONENT_ENABLED_STATE_DISABLED){
return;
}
mPm.setComponentEnabledSetting(componentName,
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
}
}
最终效果如图所示:
android kdzl本身拥有着端内推送和命令模式,可以通过“端内推送或命令模块”,对相关推送信息进行响应,对相关已经内部集成的图标样式进行切换,从而实现远程控制桌面图标的方式
kdzl拥有诸多业务模块,在正常的用户场景下进入一个具体的业务模块需要经历一下几个场景,基本要经历三个步骤:
然而 我们可以通过监听用户对某个业务模块的点击次数,一旦点击超过某个阈值就认为该业务为用户常用模块,提醒用户创建快捷方式,该快捷方式直接进入业务模块,从而减少操作序列以增加用户体验。
<activity-alias
android:name=".workattendance.activity.WorkAttendanceActivity.alias"
android:enabled="false"
android:icon="@drawable/v2__apps_ic__workattendence"
android:label="考勤"
android:targetActivity=".workattendance.activity.WorkAttendanceActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity-alias>
final MsgDoubleDlgInteraction msgDoubleDlgInteraction = new MsgDoubleDlgInteraction(getActivity(), false);
msgDoubleDlgInteraction.msg().setMsg("是否为考勤应用在桌面创建快捷方式");
msgDoubleDlgInteraction.buttons().setOnLeftClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(mParentActivity, WorkAttendanceActivity.class);
startActivity(intent);
msgDoubleDlgInteraction.dismiss();
}
});
msgDoubleDlgInteraction.buttons().setOnRightClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
PackageManager mPm;
mPm = getActivity().getApplicationContext().getPackageManager();
ComponentName componentName = new ComponentName(getContext(), FunctionConfig.PACKAGE_NAME + ".workattendance" +
".activity" +
".WorkAttendanceActivity" +
".alias");
mPm.setComponentEnabledSetting(componentName,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
Intent intent = new Intent(mParentActivity, WorkAttendanceActivity.class);
startActivity(intent);
msgDoubleDlgInteraction.dismiss();
}
});
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。