怎么receiver上没有应用(工作日报 20211028 应用动态显示在桌面Launcher)

Posted

篇首语:犀渠玉剑良家子,白马金羁侠少年。本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎么receiver上没有应用(工作日报 20211028 应用动态显示在桌面Launcher)相关的知识,希望对你有一定的参考价值。

怎么receiver上没有应用(工作日报 20211028 应用动态显示在桌面Launcher)

2021.10.28

  1. 问题澄清:
  2. Plugtest 联调支撑;
  3. 蓝牙手咪适配问题配合定位;
  4. 河北联创项目联调支撑,挑战认证token认证接口优化、验证;
  5. MCX R2需求分析;
  6. mcvideo赋能文档书写;
  7. 支持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延时一会刷新图标也不失为一种选择.

相关参考

手机射频接收器坏了(手机的基本原理)

...双工状态下的收发信机。一部移动电话包括无线接收机(Receiver)、发射机(Transmitter)、控制模块(Controller)及人机界面部分(Interface)和电源(PowerSupply)。数字手机从电路可分为,射频与逻辑音频电路两大部分。其中射频电路包含从天线...

手机扁平马达摆锤(如果当年有这么神奇的动图,我会爱上物理……)

...的《自然》以封面文章刊登了目前世界上最快的只接收(receive-only)2D超高速摄像机

汉口管家婆(举国同心 又见遍地英雄)

...据为全省疫情防控工作提供支撑服务。从除夕开始,陈刚没有休息过一天,在疫情防控形势最严峻的2月至4月,他平均每天工作18个小

干冰之雾的原理(如果当年有这么神奇的动图,我会爱上物理……)

...的《自然》以封面文章刊登了目前世界上最快的只接收(receive-only)2D超高速摄像机

江铜工作服多少钱一套(江西日报要闻版报道:创新赋能,打造世界一流企业)

...育、科技、人才作为一个整体进行论述,为我们开展科研工作指明了方向,那就是回归实体、为产业赋能。”近日,位于南昌高新区的江铜研究院四楼党员活动室,正在召开第二党支部党员大会。科研人员正聚精会神地学习党的...

戴发卡是哪个戴(教育局回应学生戴“监测头环”@人民日报 也发声了)

...要带孙悟空的“紧箍咒”了?10月30日,浙江金华一小学应用监测走神的头环引发热议,相关话题迅速登上微博热搜。31日下午,浙江省金华市金东区教育局相关工作人员回应称,学生是无偿、自愿使用“头环”,未产生任何不良...

武汉0.5吨防爆电动葫(湖北三六重工有限公司副总经理、技术中心常务副主任范晓霞——研发工作没有“朝九晚五”)

范晓霞文/图湖北日报全媒记者袁超一“我停不下来,也不想停下来。”9月29日,湖北日报全媒记者在湖北三六重工有限公司见到范晓霞时,她正在按客户要求修改项目产品设计方案。在这家以男性职工为主体的重工业企业,身...

泰州景观护栏喷塑应用(人民日报法治头条:提高交通安全意识 养成文明出行习惯)

来源:人民日报  图①:贵州省丹寨县扬武镇排倒村,民警在向学生宣传道路交通安全知识。  陆德华摄  图②:安徽省六安市交警与当地大学生在城区主要斑马线路口进行创意彩绘,强化斑马线的警示作用。  田凯平...

泰州景观护栏喷塑应用(人民日报法治头条:提高交通安全意识 养成文明出行习惯)

来源:人民日报  图①:贵州省丹寨县扬武镇排倒村,民警在向学生宣传道路交通安全知识。  陆德华摄  图②:安徽省六安市交警与当地大学生在城区主要斑马线路口进行创意彩绘,强化斑马线的警示作用。  田凯平...

数控车床应用行业(从开数控机床变身养老护理员,他说:“这是一项值得一辈子从事的工作”)

长江日报大武汉客户端4月1日讯(记者史强通讯员骆晓迪)从开数控机床变身养老护理员,在1992年出生的陈林看来,既是偶然,也是必然。陈林在为老人修脚。通讯员骆晓迪摄陈林是湖北大冶人,18岁时孤身去深圳打工,在电子...