欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2024-02-14 16:44:22
本文实例讲述了android编程实现两个activity相互切换而不使用oncreate()的方法。分享给大家供大家参考,具体如下: 这里要实现的目的是: 有3个act...

本文实例讲述了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程序设计有所帮助。