最近项目中涉及从相册选择照片上传功能,参考QQ相册实现了功能,但是华为在C8817D手机上却出现了异常。具体请容我啰嗦一下:
主要有三个Activity:RootActivity(singleTop)、LocalAlbumsActivity、LocalAlbumDetailActivity
root activity 点“上传照片” ——> 本地照片列表界面LocalAlbumDetailActivity,点返回“相册” ——> 选择相册界面LocalAlbumsActivity, 选择某个相册 ——> 本地照片列表界面LocalAlbumDetailActivity,本地相册和本地列表界面可以来回切换,而只用onCreate()一次,待最终选好照片后,点击”确定“回到RootActivity。见下图
为了使在多个相册间来回选择照片不用重新创建LocalAlbumsActivity、LocalAlbumDetailActivity,每次跳转时Intent加flag:Intent.FLAG_ACTIVITY_REORDER_TO_FRONT。具体代码如下:
1、从相册列表界面,点击某个相册,进入相册详情界面:
Intent it = new Intent(this, LocalAlbumDetailActivity.class);
it.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
//省略部分代码
startActivity(it);
2、从相册详情界面返回相册列表界面
Intent it = new Intent(this, LocalAlbumsActivity.class);
it.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
//省略部分代码
startActivity(it);
但是,当我选好照片,点击“确定”后,并没有回到RootActivity,而是回到了桌面,代码如下:
Intent it = new Intent();
it.setClass(this, RootActivity.class);
it.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(it);
此现象仅在华为手机C8817D上有问题,目前没发现其他手机上有问题。具体原因不清楚,初步检查不用Intent.FLAG_ACTIVITY_REORDER_TO_FRONT,每次重新创建LocalAlbumDetailActivity 就不会有问题。实在不知什么原因,希望高手不吝赐教!
经查阅各方资料,终于找到了问题的原因及解决方法,希望可以帮到那些与我一样曾经困惑的朋友。参考https://code.google.com/p/android/issues/detail?id=63570#c2
原因是android4.4.* platform issues for FLAG_ACTIVITY_REORDER_TO_FRONT, reordered activity back press will go to home unexpectly。但是在android5.*的部分手机上也仍存在该问题,所以我们针对4.4以上的手机都进行处理。
具体代码如下:
LocalAlbumDetailActivity 和 LocalAlbumsActivity分别添加如下代码
private boolean mIsRestoredToTop;
@Override
protected void onNewIntent(Intent intent)
{
super.onNewIntent(intent);
//省略部分代码
if ((intent.getFlags() | Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) > 0) {
mIsRestoredToTop = true;
}
}
@Override
public void onDestroy()
{
super.onDestroy();
if (android.os.Build.VERSION.SDK_INT >= 19 && !isTaskRoot() && mIsRestoredToTop) {
// 4.4.2 platform issues for FLAG_ACTIVITY_REORDER_TO_FRONT,
// reordered activity back press will go to home unexpectly,
// Workaround: move reordered activity current task to front when it's finished.
ActivityManager tasksManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
tasksManager.moveTaskToFront(getTaskId(), ActivityManager.MOVE_TASK_NO_USER_ACTION);
}
}
AndroidManifest.xml 中增加权限: