Intent.FLAG_ACTIVITY_REORDER_TO_FRONT在华为C8817D上异常,使用Intent.FLAG_ACTIVITY_CLEAR_TOP直接回到桌面

最近项目中涉及从相册选择照片上传功能,参考QQ相册实现了功能,但是华为在C8817D手机上却出现了异常。具体请容我啰嗦一下:

主要有三个Activity:RootActivity(singleTop)、LocalAlbumsActivity、LocalAlbumDetailActivity

root activity 点“上传照片” ——> 本地照片列表界面LocalAlbumDetailActivity,点返回“相册” ——> 选择相册界面LocalAlbumsActivity, 选择某个相册 ——> 本地照片列表界面LocalAlbumDetailActivity,本地相册和本地列表界面可以来回切换,而只用onCreate()一次,待最终选好照片后,点击”确定“回到RootActivity。见下图

Intent.FLAG_ACTIVITY_REORDER_TO_FRONT在华为C8817D上异常,使用Intent.FLAG_ACTIVITY_CLEAR_TOP直接回到桌面_第1张图片

为了使在多个相册间来回选择照片不用重新创建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 中增加权限:



如果回到根界面RootActivity是通过调用finish() 方法,则将上面onDestroy()方法中的处理放到finish() 方法中即可。






你可能感兴趣的:(android,app)