还有很多类似的如何从通知恢复活动的问题。如何从通知(“非独立”模式)“恢复”活动?
但我的情况稍有不同。
我有一个活动,只能从其他活动启动,而不能从家庭或应用程序列表(让我称之为“独立”模式)。
这个活动的目的是上传文件到服务器,只处理一个意图:
<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:如何重新启动“父”活动(此外,我甚至不知道如何找出它是哪个活动),并重新创建它的堆栈来陈述它在活动被破坏之前?
所有“父母”活动都是第三方,所以我不能更改他们的代码。
有什么建议吗?