如何从通知中“恢复”活动(“非独立”模式)?

时间:2011-04-13 11:29:28

标签: android

如何从通知中恢复活动有许多类似的问题。

但我的情况略有不同。

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

此活动旨在将文件上传到服务器并仅处理一个意图:

<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>

因此可以通过“共享文件”从Gallery或Camera启动它。但不是来自应用程序列表,因为没有办法传递应该上传的文件,我不想为其选择添加任何UI:我希望尽可能简化应用程序。

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

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

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

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 个答案:

答案 0 :(得分:1)

嗯,我发现实现这个的唯一方法是:

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

在恢复之后,这不是我想要的100%(例如,我不能回到“父”应用程序),但总比没有好。