如何两次发起活动?

时间:2018-09-26 18:09:28

标签: android

我的应用有两个入口点。一个是主启动器,另一个是意图操作。

主启动程序启动一个根活动,该活动又反过来启动活动A。活动A可以再次启动根活动。最后,我得到了这样的活动堆栈:

Hist #3: Activity A
Hist #2: Root Activity 
Hist #1: Activity A
Hist #0: Root Activity (launcher)
Task 1

android容忍同一任务中的重复活动的原因是因为两个根活动的启动器属性不同。这正是我想要的。

但是,如果我使用意图动作启动应用程序。重定向之后,我将再次进入root活动。这次我不能重复活动。

// Attempt to start root activity here will end up bring Hist #0 to the front
Hist #1: Activity A
Hist #0: Root Activity (redirected, not launcher)
Task 1

在第二种情况下,我如何拥有重复的根活动?

我尝试使用FLAG_ACTIVITY_MULTIPLE_TASK,它为我提供了以下堆栈:

Hist #1: Activity A
Hist #0: Root Activity
Task 2
Hist #1: Activity A
Hist #0: Root Activity
Task 1

它在某种程度上有效,但同时也会导致应用程序后台出现问题,因此,我尝试避免这种方法。

编辑:这是一些代码:

AndroidManifest:

<activity android:name="com.opentext.m.core.launch.MainRootActivity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

<activity
    android:name="com.opentext.m.core.launch.IntentLauncherActivity"
    android:autoRemoveFromRecents="true"
    android:screenOrientation="sensorPortrait"
    android:taskAffinity="">
    <!-- prod-na -->
    <intent-filter android:autoVerify="true">
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data
        ...
        />
    </intent-filter>
</activity>

MainRootActivity:

@MainThread
@Override
protected void onResume() {
    // ...
    final Intent targetIntent = createTargetIntent();
    startActivity(targetIntent);
}

@NonNull
@Override
public Intent createTargetIntent() {
    final Intent intent = new Intent(this, ActivityA.class);
    // ... (intent extras)
    return intent;
}

IntentLauncherActivity.kt:

internal fun redirect() {
    // ...
    val rootIntent = Intent(this, MainRootActivity::class.java)
    rootIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
    rootIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
    // ... (intent extras)
    startActivity(rootIntent)
}

ActivityA.kt:

internal fun startRootAgain() {
    val rootIntent = Intent(this, MainRootActivity::class.java)
    rootIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
    // rootIntent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK)
    startActivity(rootIntent)
}

0 个答案:

没有答案