我试图实现一项功能,该功能允许用户选择默认的Android默认启动器应用程序。另外,我需要接收选择了哪个应用程序的信息。但是这种方法存在问题。
要让用户选择启动器应用程序,我们可以简单地开始给定意图:
val selector = Intent(Intent.ACTION_MAIN)
selector.addCategory(Intent.CATEGORY_HOME)
selector.flags = Intent.FLAG_ACTIVITY_NEW_TASK
startActivity(selector)
它会出现这样的对话框:
我观察到的是,如果我使用startActivity
,则启动器应用程序设置得很好,并且可以按预期工作,但是如果使用startActivityForResult
,则将获得一些回调,但是启动器应用程序将不会被设置。另外,onActivityResult
中收到的意图没有什么有趣的。
然后,我尝试改用IntentSender。
代码如下:
val selector = Intent(Intent.ACTION_MAIN)
selector.addCategory(Intent.CATEGORY_HOME)
selector.flags = Intent.FLAG_ACTIVITY_NEW_TASK
val receiver = Intent(this, MyBroadcastReceiver::class.java)
val pendingIntent = PendingIntent.getBroadcast(this, 0, receiver, PendingIntent.FLAG_UPDATE_CURRENT)
val chooser = Intent.createChooser(selector, "Select a Home app", pendingIntent.intentSender);
startActivity(chooser)
接收器如下:
class MyBroadcastReceiver: BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
val componentName = intent.extras.getParcelable<ComponentName>(Intent.EXTRA_CHOSEN_COMPONENT)
//com.example.myapp if my app was choosen
val pkg = componentName.packageName
}
}
这将导致默认选择器,没有选项“仅一次”或“总是”。我没有确切的图片,但看起来与此相似:
这在某种程度上有效,在接收者的onReceive
方法中,我得到了ComponenName
对象,该对象保存了选定的应用packageName
。问题是-再次-未设置启动器应用程序!
问题是:我如何让用户设置启动器应用程序,并且还接收他选择的信息?
答案 0 :(得分:7)
尝试使用以下代码:
PackageManager localPackageManager = getPackageManager();
Intent intent = new Intent("android.intent.action.MAIN");
intent.addCategory("android.intent.category.HOME");
String launcherName = localPackageManager.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY).activityInfo.packageName;
Log.e("Current launcher Package Name:",launcherName);
答案 1 :(得分:6)
使用getPreferredActivities()
,您可以检索用户喜欢的所有活动。这也应该包括启动器。
然后,您可以尝试实现getPreferredLauncher()
函数以获取当前的Launcher
。但是由于没有办法监听此更改,因此您必须在Service
内或在您认为数据可能已更改的任何时候主动查询它:
fun PackageManager.getPreferredLauncher(): ComponentName? {
val filters = mutableListOf<IntentFilter>()
val components = mutableListOf<ComponentName>()
getPreferredActivities(filters, components, null)
filters.forEachIndexed { (i, it) ->
if (it.hasAction(ACTION_MAIN) && it.hasCategory(CATEGORY_LAUNCHER))
return@getPreferredLauncher components[i]
}
return null
}
请将此代码仅视为草稿,因为我没有任何设置可以实际运行它。