デフォルトの Android ランチャーをプログラムで起動する方法を探しています。おそらく以下のコードのようなものです。または、マニフェスト ファイルに何かを追加する必要がありますか? ありがとう!
Intent intent = new Intent();
intent.setClassName("com.android.launcher", "Launcher");
startActivity(intent);
これを試しましたか?
startActivity(new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_LAUNCHER));
(私のユースケースはもう少し複雑なので、自分で試したことはありません---ランチャーを交換しました。古いランチャーを呼び出したいです...)
また、パッケージ マネージャーを使用して、インテント フィルター基準を満たすすべてのアクティビティを調べることができることも発見しました。たとえば、ホームのデフォルトのホーム アクティビティとしてマークされたすべてのアクティビティを検索する場合は、次のように使用します。
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;
}
}
デバイスのデフォルトのホーム画面を置き換えたことに注意してください---そのため、見つけたアクティビティが実行中のアクティビティではないことを確認する必要があります! デフォルトのホーム アクティビティを置き換えていない場合、このチェックは必要ありません。最初の (おそらく唯一の) デフォルトのホーム アクティビティを使用してください。
(私のランチャーから古いランチャーをまだ起動できないことに注意してください。おそらく、古いランチャーは、新しいランチャーであるデフォルトのランチャーの記録を保持し、単純にそれにコールバックするためです。わかりません。しかし、少なくともクラッシュすることはありません。古いホーム画面を交換していなければ、うまくいくかもしれません.)
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
ありますが、この方法では使用できないようです。