Android 控制 App 显示图标

Android 系统给用户提供了很大的自由度来定制他们的设备,其中之一就是可以控制应用程序的图标在桌面上显示与否。这种功能对于一些特定的应用场景来说非常有用,比如一些监控软件不希望被用户轻易发现。在本篇文章中,我们将介绍如何在 Android 应用程序中控制图标的显示与隐藏,并提供相应的代码示例。

AndroidManifest.xml

首先,我们需要在 AndroidManifest.xml 文件中添加一个 receiver 元素,用于接收系统的广播消息。

<receiver
    android:name=".IconReceiver"
    android:enabled="true"
    android:exported="true"
    android:label="@string/app_name"
    android:icon="@mipmap/ic_launcher">
    <intent-filter>
        <action android:name="android.intent.action.PACKAGE_ADDED" />
        <action android:name="android.intent.action.PACKAGE_REMOVED" />
        <data android:scheme="package" />
    </intent-filter>
</receiver>

这里我们创建了一个名为 IconReceiver 的广播接收器,并设置了两个 action,分别是 PACKAGE_ADDEDPACKAGE_REMOVED,即当安装或卸载应用程序时触发的广播消息。我们还通过 data 元素指定了接收的数据类型为 package

IconReceiver.java

创建一个名为 IconReceiver 的 Java 类,并继承自 BroadcastReceiver 类。在该类中,我们需要重写 onReceive 方法,以便在收到广播消息时执行相应的操作。

public class IconReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        Uri data = intent.getData();
        String packageName = data.getSchemeSpecificPart();

        if (action.equals(Intent.ACTION_PACKAGE_ADDED)) {
            // 应用程序被安装
            showIcon(context, packageName);
        } else if (action.equals(Intent.ACTION_PACKAGE_REMOVED)) {
            // 应用程序被卸载
            hideIcon(context, packageName);
        }
    }

    private void showIcon(Context context, String packageName) {
        PackageManager pm = context.getPackageManager();
        ComponentName componentName = new ComponentName(packageName, packageName + ".MainActivity");
        pm.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
    }

    private void hideIcon(Context context, String packageName) {
        PackageManager pm = context.getPackageManager();
        ComponentName componentName = new ComponentName(packageName, packageName + ".MainActivity");
        pm.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
    }
}

onReceive 方法中,我们首先获取广播消息的 actiondata,然后根据 action 的值判断是安装还是卸载应用程序。如果是安装应用程序,则调用 showIcon 方法显示应用程序图标;如果是卸载应用程序,则调用 hideIcon 方法隐藏应用程序图标。

showIcon 方法和 hideIcon 方法中,我们首先获取 PackageManager 对象,然后通过 ComponentName 构造方法指定应用程序的包名和主活动类名,最后调用 setComponentEnabledSetting 方法来控制应用程序图标的显示与隐藏。

使用示例

为了演示如何使用以上代码,我们创建一个名为 "AppLauncher" 的应用程序,该应用程序的图标可以通过发送广播消息来控制显示与隐藏。我们将在 MainActivity 类中发送广播消息,以触发 IconReceiver 接收器执行相应的操作。

public class MainActivity extends AppCompatActivity {

    private static final String ACTION_SHOW_ICON = "com.example.applauncher.SHOW_ICON";
    private static final String ACTION_HIDE_ICON = "com.example.applauncher.HIDE_ICON";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button showButton = findViewById(R.id.show_button);
        Button hideButton = findViewById(R.id.hide_button);

        showButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                sendBroadcast(new Intent(ACTION_SHOW_ICON));
            }
        });

        hideButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                sendBroadcast(new Intent(ACTION_HIDE_ICON));
            }
        });
    }
}

MainActivity 类的 onCreate 方法