android - startactivity - kotlin intent context




どのアプリケーションがランチャーアプリケーションとして選択されているのを聞くことができますか? (2)

私はユーザーがデフォルトのAndroidのデフォルトのランチャーアプリケーションを選択できるようにする機能を実装しようとしました。 また、どのアプリケーションが選択されたかについての情報を受け取る必要があります。 しかし、そのアプローチには問題があります。

ユーザーにランチャーアプリケーションを選択させるために、与えられた意図を単純に始めることができます。

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

そのようなダイアログが表示されます。

私が観察したこと、 startActivityを使用するとLauncherアプリケーションはstartActivityに設定され意図したとおりに動作しますが、 startActivityForResultを使用するとコールバックが発生しますが、Launcherアプリケーションはまったく設定されません。 また、 onActivityResult得られた意図には何も興味がありませんでした。

そこで、代わりにIntentSenderを使って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
    }
}

これにより、オプション "JUST ONCE"または "ALWAYS"を指定せずにデフォルトの選択が行われます。 正確な写真はありませんが、これは次のようになります。

これは、レシーバのonReceiveメソッドでComponenNameオブジェクトを取得し、選択されたアプリのpackageNameを保持するという方法で機能ます。 問題は - 再び - ランチャーアプリケーションが設定されていません!

だから質問は:どのように私はユーザーにランチャーアプリケーションを設定させ、そしてまた彼が選んだ情報を受け取らせることができますか?


getPreferredActivities()を使用すると、ユーザーが優先しているすべてのアクティビティを取得できます。 これにはランチャーも含まれるべきです。

それから、現在のLauncherを取得するためにgetPreferredLauncher()関数を実装しようとすることができます。 しかし、この変更を監視する方法がないため、 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
}

私は実際にそれを実行するための設定を持っていなかったので、このコードをドラフトのみと考えてください。


次のコードを使ってみてください。

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






android-launcher