本文要实现的目的是:

有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照片选择功能,尽情期待。

Android:实现两个Activity相互切换而都不走onCreate()的更多相关文章

  1. android实现两个activity数据交互

    android如何实现两个Activity数据交互?主要是根据Intent的携带功能,intent可以携带很多信息,比如Bundle,URI甚至对象(此时要序列化,并且对象里面的成员变量如果是对象,也 ...

  2. Android中两个Activity之间简单通信

    在Android中,一个界面被称为一个activity,在两个界面之间通信,采用的是使用一个中间传话者(即Intent类)的模式,而不是直接通信. 下面演示如何实现两个activity之间的通信. 信 ...

  3. QT两个窗口相互切换

    信号(signals)与槽(slots)是QT重要机制,例子使用了C++11 lambda表达式进行了信号与槽的连接. 实现两个窗口通过点击按钮完成互相切换,注意子窗口只能发送信号,不能处理,所有信号 ...

  4. 01.QT初学--两个窗口相互切换

    //qqwidget.cpp #include "qqwidget.h" #include "ui_qqwidget.h" qqwidget::qqwidget ...

  5. Android -- 两个activity界面的切换, 显示Intent 和 隐式Intent,putExtra传递数据

    1. 两个Activity之间可以通过Intent切换, 包括显示Intent 和 隐式Intent. 实例代码 MainActivity.java public class MainActivity ...

  6. 切换两个activity

    下面是一个切换两个activity是过度动画效果实例:(注意里面的overridePendingTransition()方法)Java代码 1. @Override public void onCre ...

  7. 《转载》两个activity界面间跳转切换动画效果

    1overridePendingTransition Activity的切换动画指的是从一个activity跳转到另外一个activity时的动画. 它包括两个部分:一部分是第一个activity退出 ...

  8. 解决Activity启动黑屏和设置android:windowIsTranslucent不兼容activity切换动画的问题

    在该项目中遇到开Activity之后,黑屏问题,解决的办法是在网上通过设置发现theme和style特性,可以实现. http://www.cnblogs.com/sunzn/p/3407078.ht ...

  9. Android的Activity屏幕切换动画(一)-左右滑动切换

    (国内知名Android开发论坛eoe开发者社区推荐:http://www.eoeandroid.com/) Android的Activity屏幕切换动画(一)-左右滑动切换 在Android开发过程 ...

随机推荐

  1. C#图解教程学习笔记——接口

    一.接口概念接口是指定一组函数成员而不实现它们的引用类型.所以只能类和结构来实现接口. 二.声明接口1. 接口声明不能包含:数据成员.静态成员,只能包含以下类型的非静态成员函数:方法.属性.事件.索引 ...

  2. pylint & jenkins

    利用pylint 检测 python源码. Pylint 提供了简单的方式来分析 Python 代码,其高可配置性很容易使一个部门的人员使用统一的代码风格. Pylint 是什么 Pylint 是一个 ...

  3. 联通积分兑换的Q币怎么兑换到QQ上

    可登录联通积分商城http://jf.10010.com  查询和兑换Q币, 1,通过联通积分商城自主兑换,提交订单扣除积分成功后,10010端口将自动为您下发验证码短信. 2,在有效期内登陆Q币充值 ...

  4. Android中节操播放器JieCaoVideoPlayer使用

    效果 使用 即便是自定义UI,或者对Library有过修改,也是这五步骤来使用播放器. 1.添加类库 compile 'cn.jzvd:jiaozivideoplayer:6.0.0' 2.添加布局 ...

  5. RecyclerView的Item和Item内的控件点击处理

    需求场景:RecyclerView的Item需要点击,或者Item中的某个控件需要点击,或者两者同时需要点击处理. 一.adapter代码如下: package com.ldw.adapter; im ...

  6. HDU 1027 Ignatius and the Princess II[DFS/全排列函数next_permutation]

    Ignatius and the Princess II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K ( ...

  7. C++面向对象程序设计_Part1

    目录 C++历史 C++的组成 C++ 与 C 的数据和函数区别 基于对象与面向对象的区别 C++类的两个经典分类 头文件防卫式声明 头文件的布局 类的声明 类模板简介 内联(inline)函数 访问 ...

  8. SQLite添加列的限制

    SQLite添加列的限制   向SQLite表中添加字段,需要注意以下问题: (1)添加的列不能定义为主键. (2)添加的列为日期时间类型,不能使用CURRENT_TIME.CURRENT_DATE. ...

  9. 11G在用EXP导出时,空表不能导出

    11G中有个新特性,当表无数据时,不分配segment,以节省空间 解决方法: 1.insert一行,再rollback就产生segment了. 该方法是在在空表中插入数据,再删除,则产生segmen ...

  10. mysql count(*) 和count(1)区别

    count *更快, 不要加where,否则同count(1)效率相同 sql语句对大小写不敏感,关键字一般大写,其他小写, count(*)不加where,mysql会直接返回总条数,因为mysql ...