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中使用某个按钮或返回键回到最开始的页面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照片选择功能,尽情期待。

时间: 2024-10-27 19:47:05

Android:实现两个Activity相互切换而都不走onCreate().(程序更加流畅!)的相关文章

android实现两个activity数据交互

android如何实现两个Activity数据交互?主要是根据Intent的携带功能,intent可以携带很多信息,比如Bundle,URI甚至对象(此时要序列化,并且对象里面的成员变量如果是对象,也要序列化),实现的具体代码如下: package com.example.yzj.android_8_3; import android.content.Intent; import android.net.Uri; import android.support.v7.app.AppCompatAc

Android中两个Activity之间简单通信

在Android中,一个界面被称为一个activity,在两个界面之间通信,采用的是使用一个中间传话者(即Intent类)的模式,而不是直接通信. 下面演示如何实现两个activity之间的通信. 信息的发起者为Test,接收者为Target,代码如下: Test类: 1 package com.example.testsend; 2 3 import android.content.Intent; 4 import android.support.v7.app.AppCompatActivit

Android Activity实现切换动画的两种方法

方法一 overridePendingTransition(0,0) void android.app.Activity.overridePendingTransition(int enterAnim, int exitAnim) Call immediately after one of the flavors of startActivity(Intent) or finish to specify an explicit transition animation to perform ne

android开发中,两个按下手机实体返回键,两个Activity反复来回跳转的问题

android开发中,对于用intent实现跳转的Ativity,有时候按下手机的返回键时,两个Activity之间会多次相互跳转,始终退出不了程序的情况.这是由于从Activity  A跳转到Activity  B时,A被压入Activity栈中:当从B返回时,默认又重新创建了一个Activity A对象,这样一来就有了多个Activity A对象.所以造成了无法退出情况. 解决办法是:在AndroidManifest.xml文件中找到Activity A项,在其属性中加入  android:

Android实例-手机安全卫士(二十一)-自定义Activity界面切换动画

一.目标. 实现两个Activity界面的动画切换效果. 二.代码实现. 1.在res文件夹下新建一个名为anim的文件夹. 2.在新建的anim文件夹中新建一个Android xml file文件(取名tran_out),根据动画要求选择根元素(本例为translate),用于实现Activity界面移出屏幕的动画效果. 3.在新建的xml文件中,根标签<translate>的属性中,当输入一个属性时会自动增加命名空间.属性android:fromXDelta表示从哪个X轴来,原点为屏幕左上

切换两个activity

下面是一个切换两个activity是过度动画效果实例: (注意里面的overridePendingTransition()方法) Java代码 1.  @Override public  void  onCreate(Bundle  savedInstanceState)  { super.onCreate(savedInstanceState); setContentView(R.layout.SplashScreen); new  Handler().postDelayed(new  Run

Android基础学习之Activity之间的切换

首先我还是要先介绍Intent这个家伙,没错,就是这个家伙让我们实现了Activity之间的跳转切换来着的. 接下来的介绍引用了 enjoy风铃所写的<Intent的那些事>的部分内容: Intent在Android大家庭中是一个活泼的小男孩,从小就是交际草.在代码中,Activity.Service.BroadcastReceiver这三个重要的大妈级重量组件,之间的调用关联都是依靠Intent去交流的,例如Activity的startActivity(),Service的startServ

android动画-Activity之间切换动画

Android中页面之间动画切换可以使用两种方式,一种是代码,一种是定义修改Activity Theme. 一.代码实现相对来说比较简单 通过调用 overridePendingTransition() 可以实时修改Activity的切换动画. 但需注意的是:该函数必须在调用startActivity()或finishe后立即调用,且只有效一次. 二.Activity Theme 1. 在styles.xml中输入以下代码: <style name="AnimationActivity&q

Android Activity界面切换添加动画特效

在Android 2.0之后有了overridePendingTransition() ,其中里面两个参数,一个是前一个activity的退出两一个activity的进入, Java代码   @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.SplashScreen); new Handler().postD