简易launcher¶
更新日期 2020-4-20
- 2020-4-20 创建文档
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
启动另一个app¶
获取到其他app信息后,可以启动它们。 获取到ResolveInfo,launcher启动对应的app。
Intent intent = getPackageManager().getLaunchIntentForPackage(info.activityInfo.packageName);
startActivity(intent);
显示壁纸¶
使用安卓机器时,我们可以在设置中更换壁纸。 自制launcher也可以看到我们设置的壁纸。需要对背景做一些处理。 我们处理的是launcher中activity的背景,让背景透明,就可以直接看到安卓的壁纸。
首先是activity的背景颜色,可以设置成透明。
然后在activity的onCreate
方法中,设置壁纸标记。
@Override
protected void onCreate(Bundle savedInstanceState) {
// ...
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER);
super.onCreate(savedInstanceState);
// ...
}
这个设置对静态壁纸和动态壁纸都有效。
本文也发布在
本站说明
一起在知识的海洋里呛水吧。广告内容与本站无关。如果喜欢本站内容,欢迎投喂作者,谢谢支持服务器。如有疑问和建议,欢迎在下方评论~