Android编程实现两个Activity相互切换而不使用onCreate()的方法

本文实例讲述了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>

更多关于Android相关内容感兴趣的读者可查看本站专题:《Android开发入门与进阶教程》、《Android调试技巧与常见问题解决方法汇总》、《Android多媒体操作技巧汇总(音频,视频,录音等)》、《Android基本组件用法总结》、《Android视图View技巧总结》、《Android布局layout技巧总结》及《Android控件用法总结》

希望本文所述对大家Android程序设计有所帮助。

声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:notice#nhooo.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。