launcher是什么意思(手机launcher是什么意思)

2021.10.28

问题澄清:Plugtest 联调支撑;蓝牙手咪适配问题配合定位;河北联创项目联调支撑,挑战认证token认证接口优化、验证;MCX R2需求分析;mcvideo赋能文档书写;支持SDS服务器版本返回空时默认为4.0版本,OTA参数增加;

应用动态显示在桌面Launcher

启用禁用组件基础知识

PackageManager pm = getPackageManager();

pm.setComponentEnabledSetting(componentName,

PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); // 禁用该componentName组件,如果带有category.LAUNCHER,则不会显示在Launcher上

pm.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); // 启用componentName组件

应用动态出现在Launcher上

要应用出现在Launcher上,则启用组件,不出现则禁用组件.我们只需在适当时候做启用和禁用操作即可.一般是通过广播实现.比如当有SIM卡时应用出现,没有SIM则不出现.

public class BootCompletedReceiver extends BroadcastReceiver {

@Override

public void onReceive(Context context, Intent intent) {

String action = intent.getAction();

if (action == null) {

return;

}

if (action.equals(Intent.ACTION_BOOT_COMPLETED)) {

// 刚开机卡先禁用组件

disableComp(yourCompName);

}else if (action.equals(TelephonyIntents.ACTION_SIM_STATE_CHANGED)) {

String SIMStatus = intent.getStringExtra(IccCardConstants.INTENT_KEY_ICC_STATE);

if(!(IccCardConstants.INTENT_VALUE_ICC_ABSENT).equals(SIMStatus)){

// 其他状态的卡说明存在卡,则启用组件

enableComp(yourCompName);

}else{

// 卡处于ABSENT状态则取消图标显示,也就是引用带有Launcher的Category的组件

disableComp(yourCompName);

}

}

}

// 启用组件

public static void enableComp(ComponentName compName){

PackageManager pm = getPackageManager();

pm.setComponentEnabledSetting(compName,

PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);

}

// 禁用组件

public static void disableComp(ComponentName compName) {

PackageManager pm = getPackageManager();

pm.setComponentEnabledSetting(compName,

PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);

}

}

AndroidManifest.xml

<receiver android:name="com.nan.breeze.BootCompletedReceiver">

<intent-filter>

<action android:name="android.intent.action.BOOT_COMPLETED" />

<action android:name="android.intent.action.SIM_STATE_CHANGED" />

</intent-filter>

</receiver>

应用动态替换图标

既然可以动态禁用启用组件,再通过</activity-alias>属性,我们就可以实现在不更新应用的情况下替换应用图标. 从而实现类似天猫双11图标替换的效果

activity-alias基本用法

<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>

属性解释

属性 含义

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

<application

android:allowBackup="true"

android:icon="@mipmap/ic_launcher"

android:label="Android ICON"

android:supportsRtl="true"

android:theme="@style/AppTheme">

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

android:targetActivity=".MainActivity"

android:icon="@mipmap/ic_launcher_change"

android:enabled="false">

<intent-filter>

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

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

</intent-filter>

</activity-alias>

</application>

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:orientation="vertical"

android:layout_height="match_parent">

<Button

android:layout_margin="10dp"

android:id="@+id/btn_change_to_alias"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="切换至alias图标" />

<Button

android:layout_margin="10dp"

android:id="@+id/btn_change_to_default"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="切换至默认图标" />

</LinearLayout>

MainActivity.java

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

initView();

}

private void initView() {

Button changeToAlias = (Button) findViewById(R.id.btn_change_to_alias);

Button changeToDefault = (Button) findViewById(R.id.btn_change_to_default);

changeToAlias.setOnClickListener(this);

changeToDefault.setOnClickListener(this);

}

@Override

public void onClick(View view) {

switch (view.getId()) {

case R.id.btn_change_to_alias:

changeIcon("com.nan.breeze.MainActivity");

break;

case R.id.btn_change_to_default:

changeIcon("com.nan.breeze.MainAliasActivity");

break;

default:

break;

}

}

public void changeIcon(String activityPath) {

PackageManager pm = getPackageManager();

pm.setComponentEnabledSetting(getComponentName(),

PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);

pm.setComponentEnabledSetting(new ComponentName(this, activityPath),

PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);

//重启桌面 加速显示

// restartSystemLauncher(pm);

}

public void restartSystemLauncher(PackageManager pm) {

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

Intent i = new Intent(Intent.ACTION_MAIN);

i.addCategory(Intent.CATEGORY_HOME);

i.addCategory(Intent.CATEGORY_DEFAULT);

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

for (ResolveInfo res : resolves) {

if (res.activityInfo != null) {

// 调用该方法需要增加权限

// <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />

am.killBackgroundProcesses(res.activityInfo.packageName);

}

}

}

}

杀死桌面更换应用图标对用户有些突兀,我们只需在适当时候禁用启用,Launcher延时一会刷新图标也不失为一种选择.

本文链接:https://www.zhantian9.com/181039.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2000000@qq.com 举报,一经查实,本站将立刻删除。

发表回复

您的电子邮箱地址不会被公开。