2015-09-11 65 views
2

響應用戶「查看」電子郵件附件或將文件從文件選擇器發送到活動,通過接收的意圖啓動活動(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> 

回答

2

我知道我張貼的答案,我自己的問題....

所以,上面的DBRestoreActivity正在通過與行動查看收到的意圖「實例」 。我的應用程序沒有實例化活動。

我瞭解(雖然Android的新手),如果我們可以通過設置意圖的標誌:Intent.FLAG_ACTIVITY_NEW_TASK和Intent.FLAG_ACTIVITY_CLEAR_TASK在DBRestoreActivity,我會得到想要的狀態:在DBRestoreActivity將開始一個新的任務(如果沒有按一個已經存在)或清除現有任務狀態並將活動添加到現有任務。

我解決這個問題的方法是創建另一個活動DBRestoreLoaderActivity。此活動現在被指定爲從AndroidManifest.xml中的其他應用程序接收ACTION.VIEW意圖。在DBRestoreLoaderActivity的onResume()和onNewIntent()方法中,我們捕獲意圖並將意圖的Class設置爲我們真正想調用的活動DBRestoreActivity.class。我們添加意圖標誌:FLAG_ACTIVITY_NEW_TASK,FLAG_ACTIVITY_CLEAR_TASK和FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS,調用startActivity(Intent)並完成()DBRestoreLoaderActivity。這完成了我正在尋找的行爲。

我加FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS,因爲我注意到,DBRestoreActivity是在最近的應用程序列表中,而且即使我馬上打電話DBRestoreActivity結束(),並作爲最後的方法調用,調用startActivity(意向),活動結束後仍在最近的名單中。對於我的應用程序,我不一定需要在最近列表中列出的DBRestoreActivity。

這似乎實現了我在尋找的東西:一種在現有任務(如果存在)內啓動我的DBRestoreActivity並清除任務列表以便我們不必擔心用戶與某個活動交互的方式這可能與「髒數據」有關。顯然,你可能想提示用戶在DBRestoreLoaderActivity,並讓他們知道發生了一些行動,要求當前活動被關閉...

在我看來,如果一個人使用ContentProvider並接收通知在數據改變時,可以彈出消息並讓用戶知道數據已經改變。但是這個應用程序沒有使用ContentProvider,所以它不會收到底層數據更改的通知。

相關問題