Activity Launcher
Activity Launcher 是一款功能强大的Android应用程序,专门用于启动隐藏的系统活动并为已安装的应用创建桌面快捷方式。
功能特性
- 隐藏活动启动: 访问和启动Android系统中隐藏的活动界面
-
- 快捷方式创建: 为任何已安装的应用程序创建桌面快捷方式
-
- 多语言支持: 完整的国际化支持,通过Crowdin平台进行翻译协作
-
- 双平台分发: 同时提供F-Droid开源市场和Google Play商店版本
-
- 权限管理: 支持Home screen shortcuts权限配置
安装指南
系统要求
- Android 5.0及以上版本
-
- 需要授予"主屏幕快捷方式"权限
安装方式
F-Droid商店安装:
# 通过F-Droid商店获取开源版本
访问 https://f-droid.org/packages/de.szalkowski.activitylauncher/
Google Play商店安装:
# 通过Google Play获取专业版本
访问 https://play.google.com/store/apps/details?id=de.szalkowski.activitylauncher.pro
权限配置
如果快捷方式无法创建,请确保已授予相应权限:
- 进入设置 -> 应用 -> 管理应用 -> Activity Launcher
-
- 选择"其他权限" -> "主屏幕快捷方式"
-
- 启用该权限
使用说明
基本使用
安装后打开应用,您将看到:
- 所有已安装应用程序列表
-
- 每个应用可用的活动和服务
-
- 长按任何活动即可创建桌面快捷方式
创建快捷方式示例
// 通过Activity Launcher创建的快捷方式实际上是深度链接
// 可以直接启动应用的特定功能界面
Intent shortcutIntent = new Intent();
shortcutIntent.setClassName("package.name", "activity.class.name");
多语言支持
应用支持多种语言翻译,翻译贡献通过Crowdin平台进行:
# 参与翻译项目
访问 https://crowdin.com/project/ActivityLauncher
核心代码
字符串资源解析
def parse_strings_resources(filename):
"""解析XML字符串资源文件"""
with open(filename, "r") as fd:
dom = parse_xml(fd)
result = dict()
for element in dom.childNodes[0].getElementsByTagName("string"):
key = element.attributes.getNamedItem("name").value
value = element.childNodes[0].data
result[key] = value
return result
多语言资源加载
def load_string_resources():
"""加载所有多语言字符串资源"""
regex = re.compile("-(.*)\/")
strings = dict()
for fname in glob("ActivityLauncherApp/src/main/res/values-*/strings.xml"):
code = next(regex.finditer(fname))[1].split("-")
if len(code) > 1:
code[1] = code[1][1:]
resources = parse_strings_resources(fname)
strings[tuple(code)] = {
"shortDescription": resources["short_description"],
"title": resources["app_name"],
}
return strings
Google Play商店列表更新
def update_listings(service, strings):
"""更新Google Play商店的应用列表信息"""
# 准备编辑请求
edit_request = service.edits().insert(body={}, packageName=PACKAGE_NAME)
result = edit_request.execute()
edit_id = result["id"]
# 处理所有描述文件
regex = re.compile("-(.*)\.")
for fname in glob("descriptions/description-*.txt"):
code = next(regex.finditer(fname))[1].split("-")
if len(code) > 2 or code[0] == "xxx":
continue
with open(fname, "r") as fd:
fullDescription = fd.read()
doc = find_strings(code, strings)
doc["fullDescription"] = fullDescription
# 更新商店列表
service.edits().listings().update(
editId=edit_id,
packageName=PACKAGE_NAME,
language="-".join(code),
body=doc
).execute()