活动(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>
答案 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,因此不会通知基础数据的更改。