在默认的Android启动器中,当您在另一个活动中按下主页键时,将启动启动器。在启动器中再次按下主页键将重置为默认主屏幕页面。我不明白这是如何完成的。Android发送相同的意图,无论启动器是否在前台。用户应用程序也无法拦截主页键。
有没有一种方法可以实现这个功能?
有没有一种方法可以实现这个功能?
无论启动器是否在前台,Android都会发送相同的意图。
正确。
用户应用程序也无法拦截Home键。
正确。
我不明白这是如何实现的。
如果调用 startActivity()
将导致 Intent
被传递到现有的活动实例,则不会创建新实例(按定义),而是使用 onNewIntent()
调用现有实例而不是 onCreate()
。
对于主屏幕来说,通常真正的主屏幕活动将在清单中使用 android:launchMode="singleTask"
或 android:launchMode="singleInstance"
,例如:
<activity
android:name="Launcher"
android:launchMode="singleTask"
android:clearTaskOnLaunch="true"
android:stateNotNeeded="true"
android:theme="@style/Theme"
android:screenOrientation="nosensor"
android:windowSoftInputMode="stateUnspecified|adjustPan">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.HOME"/>
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.MONKEY" />
</intent-filter>
</activity>
(来自 AOSP中的旧版启动器)
然后,活动可以实现onNewIntent()
来执行某些操作。在上述旧版启动器的情况下,它的onNewIntent()
包括:
if (!mWorkspace.isDefaultScreenShowing()) {
mWorkspace.moveToDefaultScreen();
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
if ((intent.getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) !=
Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) {
goHome();
}
}
FLAG_ACTIVITY_CLEAR_TOP
和FLAG_ACTIVITY_SINGLE_TOP
的组合吧。我知道这个方法是可行的,因为我在一些NFC示例应用程序中使用它来获取NFC标签事件并将其传递给正在运行的活动(而不是启动另一个副本)。我以为FLAG_ACTIVITY_REORDER_TO_FRONT
会有同样的效果。请记住,只有当活动已经存在时,onNewIntent()
才会被调用--如果您使用了finish()
或BACK按钮来关闭活动,则必须创建一个新的活动并调用onCreate()
而不是onNewIntent()
。 - CommonsWare