Skip to content

简易launcher

launcher,即我们常说的“桌面”。按home键会回到的那个app。

launcher也是一个app。可以自制一个简易launcher。

manifest设置

在manifest中,给主activity的<intent-filter>添加category。 添加的是

  • "android.intent.category.HOME"
  • "android.intent.category.DEFAULT"

AndroidManifest.xml 如下:

<activity
    android:name=".MainActivity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

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

    </intent-filter>
</activity>

运行app到手机上后,在手机的设置-桌面-默认桌面中,选择这个app作为默认桌面。 此时点击home键,会发现跳回了这个app。

获取手机上能被launcher启动的app信息

获取手机上app的信息,离不开PackageManager。自制launcher中的很多功能都依靠PackageManager来实现。

获取ResolveInfo

获取手机上能被launcher启动的app的信息列表。 使用PackageManager的queryIntentActivities(intent, flags)方法。

    private List<ResolveInfo> scanApp() {
        Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
        mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
        List<ResolveInfo> list = new ArrayList<>();
        for (ResolveInfo info : getPackageManager().queryIntentActivities(mainIntent, 0)) {
            if (info.activityInfo.packageName.equals(getPackageName())) {
                continue; // 跳过自己
            }
            if (info.activityInfo.packageName.matches("com.abc.*")) {
                list.add(info);
            }
        }
        return list;
    }

获取PackageInfo

获取手机上已安装的app列表。使用PackageManager.getInstalledPackages方法。

    private List<PackageInfo> getAvaAppList() {
        List<PackageInfo> res = new ArrayList<>();
        PackageManager pm = getPackageManager();
        List<PackageInfo> packages = pm.getInstalledPackages(0);
        for (PackageInfo packageInfo : packages) {
//            Log.d(TAG, "[app] " + packageInfo);
            if (packageInfo.packageName.equals(getPackageName())) {
                continue; // 跳过自己
            }
            if (packageInfo.packageName.matches("com.iNTGO.*")) {
                res.add(packageInfo);
            }

            if ((packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
                // 非系统应用

            } else {
                // 系统应用
            }
        }
        return res;
    }

启动另一个app

获取到其他app信息后,可以启动它们。 需要ResolveInfo。

Intent intent = getPackageManager().getLaunchIntentForPackage(info.activityInfo.packageName);
startActivity(intent);

显示壁纸

使用安卓机器时,我们可以在设置中更换壁纸。 自制launcher也可以看到我们设置的壁纸。需要对背景做一些处理。

首先是activity的背景颜色,可以设置成透明。

android:background="@android:color/transparent"

然后在activity的onCreate方法中,设置壁纸标记。

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // ...
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER);
        super.onCreate(savedInstanceState);
        // ...
    }

这个设置对静态壁纸和动态壁纸都有效。