zoukankan      html  css  js  c++  java
  • Android:实现两个Activity相互切换而都不走onCreate()

    本文要实现的目的是:

    有3个Activity: A,B,C。从A中能够进入B,B中能够进入C。而且B和C之间可能须要多次相互切换,因此不能使用普通的startActivity-finish方式,由于又一次创建Activity比較耗时。当这个Activity内容比較多时,反复创建非常大的影响了流畅性。(即实现类似于QQ上 选择照片页面-选择相冊页面,这两个页面可能多次相互切换。所以不能多次创建)

    1.从B进入C或者从C进入B时。均使用startActivity的方式(不使用finish),并为intent加入參数FLAG_ACTIVITY_REORDER_TO_FRONT,即:

    Intent intent = new Intent(B.this, C.class);
    intent.addFlags(Intent.FLAG_ACTIVITY__TO_FRONT);
    startActivity(intent);
    在这样的情况下。假设C之前没有创建则会被创建,假设已经创建了。则仅仅会把C从Aciticy栈中搬到B的上面来,而不再又一次创建。

    2.在C中重写onNewIntent方法,即:

    @Override
        protected void onNewIntent(Intent intent) {
            super.onNewIntent(intent);
        }
    该方法中的參数intent即为从B到C时startActivity的intent,在第二次进入C时,能够在此方法中依据从B中传过来的数据更新C的页面。(第一次进入C时走onCreate,不会走onNewIntent)

    3.在B中也重写onNewIntent,和上述2同样。


    4.在A和B中使用某个button或返回键回到最開始的页面A时。相同使用startActivity的方式,并为intent加入參数FLAG_ACTIVITY_CLEAR_TOP。这样B和C都会被关闭(finish)

    Intent intent = new Intent(this, A.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(intent);

    5.相同,在A中重写onNewIntent方法,处理B或C返回时传递的信息。而且,在Manifest中为A加入属性android:launchMode="singleTop"

    6.最后一个问题,因为从B到C和从C到B都使用的是startActivity的方式,因此Activity之间切换的动画都是 开启新Activity 的样式。比如,不管从B到C或者从C到B,新页面都是从右側进入,给人的感觉似乎一直在创建新Activity。非常不友好。

    解决问题的方法是自己定义Activity之间切换的动画。目的是给用户一种感觉:从C到B的时候是新开Activity(B从右側进入),而从B到C的时候是“返回”(C从左側进入)。仅仅需一行代码:

    overridePendingTransition(in, out);
    in:进入的Activity的动画; out:退出的Activity的动画。

    这里须要注意:

    (1)对于普通的startActivity-finish方式,假设须要自己定义Activity之间切换的动画,仅仅需将上述代码写在startActivity或finish之后就可以:

    (2)可是。本文中因为使用了FLAG_ACTIVITY_REORDER_TO_FRONT的方式,上述动画将仅仅在第一次创建页面B或C的时候有效。

    解决方法是,将上述代码写在onNewIntent中。比如从B到C,则在C中onNewIntent中写上这行代码,指定C进入的样式和B退出的样式。

    7.动画资源:

    (1)Activity从左側退出:

    <?xml version="1.0" encoding="utf-8"?>
    
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="150"
        android:fromXDelta="0"
        android:toXDelta="-100%p"
        android:fromYDelta="0"
        android:toYDelta="0" >
    
    </translate>

    (2)Activity从右側退出:

    <?

    xml version="1.0" encoding="utf-8"?> <translate xmlns:android="http://schemas.android.com/apk/res/android" android:duration="150" android:fromXDelta="0" android:fromYDelta="0" android:toXDelta="100%p" android:toYDelta="0" > </translate>


    (3)Activity从左側进入:

    <?xml version="1.0" encoding="utf-8"?>
    
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="150"
        android:fromXDelta="-100%p"
        android:fromYDelta="0"
        android:toXDelta="0"
        android:toYDelta="0" >
    
    </translate>

    (4)Activity从右側进入:

    <?xml version="1.0" encoding="utf-8"?>
    
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="150"
        android:fromXDelta="100%p"
        android:toXDelta="0"
        android:fromYDelta="0"
        android:toYDelta="0" >
    
    </translate>

    本文完。

    下一篇文章中,将使用此种方式实现仿QQ照片选择功能,尽情期待。



  • 相关阅读:
    CATransform3D中m34字段的取值含义
    iOS模拟器分辨率的问题(转载)
    优秀iOS学习网站(待更新)
    内联函数的理解
    UIView的setNeedsLayout, layoutIfNeeded 和 layoutSubviews 方法之间的关系解释
    Flume基础学习
    2019年总结
    Linux基础学习
    Mysql中几种sql的常见用法
    各种设计模式的简单介绍
  • 原文地址:https://www.cnblogs.com/wzzkaifa/p/6835617.html
Copyright © 2011-2022 走看看