简易launcher

AnRFDev 发表于 2021/06/02 14:06:59 2021/06/02
【摘要】 launcher,即我们常说的“桌面”。按home键会回到的那个app。launcher也是一个app。如果设备上有多个launcher,系统会弹窗询问使用哪一个launcher,或者能直接设置默认launcher。launcher也是一个app。我们可以自制一个简易launcher在设备上运行,并选定它为默认launcher。 manifest设置在AndroidManifest.xml中...

launcher,即我们常说的“桌面”。按home键会回到的那个app。launcher也是一个app。
如果设备上有多个launcher,系统会弹窗询问使用哪一个launcher,或者能直接设置默认launcher。

launcher也是一个app。我们可以自制一个简易launcher在设备上运行,并选定它为默认launcher。

manifest设置

AndroidManifest.xml中,给主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已经配置好了。接下来我们写一些launcher可能会用到的功能。

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

说到launcher(或者叫”桌面“),我们第一反应可能是能通过它打开其他的app。
打开其他app,第一步要知道设备上有哪些app可以被launcher打开。第二步是打开用户指定的app。

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

获取ResolveInfo

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

ResolveInfo存储着一系列应用相关的信息。

使用PackageManager的queryIntentActivities(intent, flags)方法,获取机器上的app的AndroidManifest.xml的信息。
我们关注的是能被launcher启动的app。

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

屏蔽返回键

launcher作为“桌面”,不让它自己退出。在最主要的activity上复写onBackPressed

@Override
public void onBackPressed() {
// 不处理返回键
}

启动另一个app

获取到其他app信息后,可以启动它们。
获取到ResolveInfo,launcher启动对应的app。

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

显示壁纸

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

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

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

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

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

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

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区),文章链接,文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。