如何收听已选择哪个应用程序作为启动器应用程序?

时间:2018-10-26 16:32:37

标签: android android-intent kotlin callback android-launcher

我试图实现一项功能,该功能允许用户选择默认的Android默认启动器应用程序。另外,我需要接收选择了哪个应用程序的信息。但是这种方法存在问题。

要让用户选择启动器应用程序,我们可以简单地开始给定意图:

val selector = Intent(Intent.ACTION_MAIN)
selector.addCategory(Intent.CATEGORY_HOME)
selector.flags = Intent.FLAG_ACTIVITY_NEW_TASK
startActivity(selector)

它会出现这样的对话框:

enter image description here

我观察到的是,如果我使用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
    }
}

这将导致默认选择器,没有选项“仅一次”或“总是”。我没有确切的图片,但看起来与此相似:

enter image description here

这在某种程度上有效,在接收者的onReceive方法中,我得到了ComponenName对象,该对象保存了选定的应用packageName。问题是-再次-未设置启动器应用程序!

问题是:我如何让用户设置启动器应用程序,并且还接收他选择的信息?

2 个答案:

答案 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
}

请将此代码仅视为草稿,因为我没有任何设置可以实际运行它。