web-dev-qa-db-ja.com

デフォルトの起動Androidランチャーをプログラムで

デフォルトのAndroidランチャーをプログラムで起動する方法を探しています。おそらく以下のコードのようなものです。またはマニフェストファイルに何かを追加する必要がありますか?ありがとうございます!

Intent intent = new Intent();
intent.setClassName("com.Android.launcher", "Launcher");
startActivity(intent);
15
dosa

これを試しましたか?

startActivity(new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_LAUNCHER));

(私のユースケースはもう少し複雑なので、自分で試したことはありません---ランチャーを交換しました。oldランチャーと呼びたいです...)

また、パッケージマネージャーを使用して、いくつかのインテントフィルター条件を満たすすべてのアクティビティを調べることができることも発見しました。たとえば、ホームのデフォルトのホームアクティビティとしてマークされているすべてのアクティビティを検索する場合は、次を使用します。

Intent intent=null;
final PackageManager packageManager=getPackageManager();
for(final ResolveInfo resolveInfo:packageManager.queryIntentActivities(new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME), PackageManager.MATCH_DEFAULT_ONLY))
{
    if(!getPackageName().equals(resolveInfo.activityInfo.packageName))  //if this activity is not in our activity (in other words, it's another default home screen)
    {
        intent=packageManager.getLaunchIntentForPackage(resolveInfo.activityInfo.packageName));
        break;
    }
}

デバイスのデフォルトのホーム画面を置き換えたことに注意してください---そのため、見つけたアクティビティが実行中のアクティビティではないことを確認する必要があります。デフォルトのホームアクティビティを置き換えていない場合は、このチェックは必要ありません---最初の(そしておそらく唯一の)デフォルトのホームアクティビティを使用するだけです。

(おそらく、古いランチャーが新しいランチャーであるデフォルトのランチャーの記録を保持し、単にコールバックするため、ランチャーから古いランチャーを起動できないことに注意してください。わかりません。しかし、少なくともクラッシュすることはなく、古いホーム画面を置き換えていなければ、うまくいくかもしれないと思います。)

21
Garret Wilson

Garret Wilsonの回答に続いて、contextがアプリケーションコンテキストであると仮定すると、これは醜いワンライナーです。

_context.startActivity(new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME).setPackage(context.getPackageManager().queryIntentActivities(new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME), PackageManager.MATCH_DEFAULT_ONLY).get(0).activityInfo.packageName));
_

このコードは、元のシステムホームアクティビティが常にqueryIntentActivitiesによって返される最初の結果であると想定していますが、受け入れられた回答は、実行中のパッケージに属していない最初のホームアクティビティを返します。

システムのホームアクティビティをクリーンに取得する方法はまだ不明です。一部のスレッドでは、これにはgetPackageManager().resolveActivity(intent, flags)を使用できると記載されていますが、_PackageManager.MATCH_SYSTEM_ONLY_はこのメソッドでは使用できないようです。

3
zeiky
=> In kotlin add below code in onDestroy method of appCompactActvity use to make your app as default launcher, 

override fun onDestroy() {
        var intent = Intent(Intent.ACTION_MAIN)
        var packageManager: PackageManager = packageManager
        for (resolveInfo in packageManager.queryIntentActivities(Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME), PackageManager.MATCH_DEFAULT_ONLY)) {
            if (packageName != resolveInfo.activityInfo.packageName)  //if this activity is not in our activity (in other words, it's another default home screen)
            {
                startActivity(intent)
            }
            break
        }
        super.onDestroy()
    }
0
Shraddha Patel