如何从另一个应用程序启动另一个活动时清除任务堆栈

时间:2015-09-11 18:35:00

标签: android-intent android-activity

活动(DBRestoreActivity)通过收到的意图启动,以响应用户“查看”电子邮件附件或从文件选择器向活动发送文件。

启动此活动时,我希望清除任务堆栈(如果已存在)。我的应用程序没有启动活动。它是通过从另一个应用程序接收Action.View Intent来启动的。

请注意,我已设置launchMode-singleTask。如果没有此设置,DBRestoreActivity将在其自己的任务中打开。我想如果我可以将它与当前正在运行的活动(如果有的话)进行相同的任务,那么我将能够关闭当前活动或清除当前任务的堆栈。

我确实在AndroidManifest中设置了DBRestoreActivity clearTaskOnLaunch =“true”,希望它能关闭除root活动之外的所有活动。但它没有这样做。

AndroidManifest:

<application
    android:name=".MyApp"
    android:allowBackup="true"
    android:label="@string/appName"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".activity.MainActivity"
        android:label="@string/appName" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name=".activity.BallActivity"
        android:label="@string/title_activity_ball"
        android:parentActivityName=".activity.MainActivity" >
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value=".activity.MainActivity" />
    </activity>
    <activity
        android:name=".activity.DBRestoreActivity"
        android:label="@string/title_activityDB_restore"
        android:parentActivityName=".activity.MainActivity"
        android:launchMode="singleTask">
        <intent-filter android:label="@string/appName" >
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:mimeType="application/zip" />
        </intent-filter>
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.mydomain.myapp.activity.MainActivity" />
    </activity>

1 个答案:

答案 0 :(得分:2)

我知道我正在回答我自己的问题......

因此,上面的DBRestoreActivity正在通过动作View的接收意图“实例化”。我的应用程序没有实例化活动。

我理解(虽然是Android新手)如果我们可以在DBRestoreActivity上设置Intent标志:Intent.FLAG_ACTIVITY_NEW_TASK和Intent.FLAG_ACTIVITY_CLEAR_TASK,我会得到所需的状态:DBRestoreActivity会启动一个新任务(如果没有'已存在)或清除现有任务状态并将活动添加到现有任务。

我解决这个问题的方法是创建另一个活动DBRestoreLoaderActivity。此活动现在被指定为从AndroidManifest.xml中的其他应用程序接收ACTION.VIEW意图。在DBRestoreLoaderActivity的onResume()和onNewIntent()方法中,我们捕获intent并将intent的类设置为我们真正想要调用的活动DBRestoreActivity.class。我们添加了intent标志:FLAG_ACTIVITY_NEW_TASK,FLAG_ACTIVITY_CLEAR_TASK和FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS,调用startActivity(Intent)和finish()DBRestoreLoaderActivity。这完成了我正在寻找的行为。

我添加了FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS,因为我注意到DBRestoreActivity在最近的应用列表中,即使我立即在DBRestoreActivity中调用了finish(),并且作为最后一个方法调用,在调用startActivity(Intent)之后,活动是仍然在最近的名单中。对于我的应用程序,我不一定要在最近列表中列出DBRestoreActivity。

这似乎实现了我正在寻找的东西:在现有任务(如果存在)中启动我的DBRestoreActivity并清除任务列表的方法,这样我们就不必担心用户与活动进行交互了可能正在使用“脏数据”。显然,您可能想要在DBRestoreLoaderActivity中提示用户并让他们知道发生了一些需要关闭当前活动的操作......

在我看来,如果一个人正在使用ContentProvider并接收有关数据更改的通知,则可以弹出一条消息并让用户知道数据已更改。但是这个应用程序没有使用ContentProvider,因此不会通知基础数据的更改。