调用getPackageManager报空指针 如何实现Android应用动态切换图标
错误原因
遇到异常"java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.pm.PackageManager android.content.Context.getPackageManager()' on a null object reference"
异常根本原因是你在DeviceListAdapter.java中通过new DeviceListActivity()手动创建了Activity实例:
DeviceListActivity deviceListActivity= new DeviceListActivity(); deviceListActivity.activeIcon(); deviceListActivity.defaultIcon();
Android的Activity是系统托管的组件,手动new出来的实例没有绑定系统上下文、也没有走完生命周期回调,内部的Context对象是空值,调用getPackageManager()时自然就触发空指针。
解决方案
方案1:通过Context调用方法(推荐)
把切换图标的方法从Activity中抽离,传入合法的Context参数执行逻辑:
// 可以放到单独的工具类或者Activity的静态方法里 public static void switchAppIcon(Context context, boolean useActiveIcon) { PackageManager packageManager = context.getPackageManager(); String mainComponent = "com.bosch.spi.carplay.devicelist.DeviceListActivity"; String aliasComponent = "com.bosch.spi.carplay.devicelist.DeviceListActivityAlias"; if (useActiveIcon) { packageManager.setComponentEnabledSetting(new ComponentName(context, mainComponent), PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); packageManager.setComponentEnabledSetting(new ComponentName(context, aliasComponent), PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); } else { packageManager.setComponentEnabledSetting(new ComponentName(context, mainComponent), PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); packageManager.setComponentEnabledSetting(new ComponentName(context, aliasComponent), PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); } }
在Adapter中调用时,直接传入Adapter持有的Activity上下文即可:
// 假设Adapter初始化时传入了宿主Activity的context switchAppIcon(context, true); // 切换激活状态图标 switchAppIcon(context, false); // 切换默认图标
方案2:直接使用宿主Activity实例调用
如果一定要用Activity里的原有方法,不要手动new Activity,在初始化Adapter的时候把当前正在运行的DeviceListActivity实例传入Adapter,直接用这个实例调用方法即可。
额外注意
- 切换图标后Launcher桌面图标不会立即刷新,部分厂商的桌面需要等待几分钟甚至重启桌面才会生效,属于正常现象
- 你Manifest中配置的动态占位符
${appIcon}和${appIconRound}和运行时切换图标逻辑不冲突,分别对应构建期默认图标配置和运行时动态切换两个场景
内容的提问来源于stack exchange,提问作者sravani
相关产品推荐
相关产品推荐

