如何从通知中恢复活动有许多类似的问题。
但我的情况略有不同。
我的活动应该只能从其他活动启动,而不能从家庭或应用程序列表启动(让我称之为“独立”模式)。
此活动旨在将文件上传到服务器并仅处理一个意图:
<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:如何重新启动“父”活动(此外,我甚至不知道如何找出它是哪个活动)并重新创建它的堆栈以说明它是在活动被销毁之前?
所有“父母”活动都是第三方,因此我无法更改其代码。
有什么建议吗?
答案 0 :(得分:1)
嗯,我发现实现这个的唯一方法是:
android:excludeFromRecents="true" android:launchMode="singleTask"
在恢复之后,这不是我想要的100%(例如,我不能回到“父”应用程序),但总比没有好。