2011-04-13 58 views
0

还有很多类似的如何从通知恢复活动的问题。如何从通知(“非独立”模式)“恢复”活动?

但我的情况稍有不同。

我有一个活动,只能从其他活动启动,而不能从家庭或应用程序列表(让我称之为“独立”模式)。

这个活动的目的是上传文件到服务器,只处理一个意图:

<activity android:name="FileUploader" 
        android:label="..." 
        > 
      <intent-filter> 
       <action android:name="android.intent.action.SEND"/> 
       <data android:mimeType="*/*"/> 
       <category android:name="android.intent.category.DEFAULT"/> 
      </intent-filter> 
     </activity> 

,因此它可以通过“共享文件”来展开,例如,从画廊或照相机。但不是从应用程序列表中,因为没有办法传递应该上传的文件,我不想为其选择添加任何UI:我想尽可能简化应用程序。

这里是一个小例子:从主屏幕启动画廊,然后选择照片,点击共享并从列表中选择我的FileUploader。 活动堆栈是:GalleryMain> Gal2> ...> FileUploader 现在,如果我点击主页键 - 我回到主屏幕,再次点击图库后,我直接返回到我的FileUploader - 这正是我需要的,所以这现在可以。

现在记住比上传操作需要时间我添加实际上实现上传的服务:FileUploaderService。我还希望在(并且只有)用户通过按Home键离开FileUploader活动时添加显示当前上载进度的通知。

点击此通知应将用户返回到FileUploader活动,如果已启动,则恢复该活动;如果活动已由系统完成,则再次启动该活动。 !但是!在“父”活动(上例中的图库)中恢复或启动它,因为在它自己的上下文中创建它会导致不需要的行为:FileUploader图标变成显示在Recent Apps列表中,允许用户以“独立”模式。

所以2例: 1.如果已经启动了恢复 2.重新创建是否被系统破坏。

我发现我的方式(也许这是肮脏的黑客,但它的工作原理)首先执行:

String className = FileUploader.class.getCanonicalName(); 
Intent notificationIntent = null; 
mAM = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); 

Iterator<ActivityManager.RunningTaskInfo> iter = mAM.getRunningTasks(1000).iterator(); 
int pid = -1; 
while (iter.hasNext()) { 
    ActivityManager.RunningTaskInfo ti = iter.next(); 
    if (className.equals(ti.topActivity.getClassName())) { 
     pid = ti.id; 
     break; 
    } 
} 

if (pid != -1) { 
    Iterator<ActivityManager.RecentTaskInfo> iter2 = mAM.getRecentTasks(100, 0).iterator(); 
    while (iter2.hasNext()) { 
     RecentTaskInfo ti = iter2.next(); 
     if (pid == ti.id) { 
      notificationIntent = ti.baseIntent; 
     } 
    } 
} 

有了这个代码,我得到这是用于启动“家长”的活动意图(如。Gallery),然后用这个意图设置我的通知。因此,它就像从主屏幕领先用户直接恢复到我的活动,这是目前在堆栈顶部。

但如何处理2:如何重新启动“父”活动(此外,我甚至不知道如何找出它是哪个活动),并重新创建它的堆栈来陈述它在活动被破坏之前?

所有“父母”活动都是第三方,所以我不能更改他们的代码。

有什么建议吗?

回答

1

好吧,我发现实现这个唯一的办法是:

android:excludeFromRecents="true" android:launchMode="singleTask" 

这不是100%的我想要的东西(如:我不能在简历后回到“父母”申请),但总比没有好。