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,即:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. Intent intent = new Intent(B.this, C.class);  
  2. intent.addFlags(Intent.FLAG_ACTIVITY__TO_FRONT);  
  3. startActivity(intent);  
在这种情况下,如果C之前没有创建则会被创建,如果已经创建了,则只会把C从Aciticy栈中搬到B的上面来,而不再重新创建。

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

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. @Override  
  2.     protected void onNewIntent(Intent intent) {  
  3.         super.onNewIntent(intent);  
  4.     }  
该方法中的参数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)

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. Intent intent = new Intent(this, A.class);  
  2.         intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);  
  3.         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从左侧进入)。只需一行代码:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. 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从左侧退出:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="utf-8"?>  
  2.   
  3. <translate xmlns:android="http://schemas.android.com/apk/res/android"  
  4.     android:duration="150"  
  5.     android:fromXDelta="0"  
  6.     android:toXDelta="-100%p"  
  7.     android:fromYDelta="0"  
  8.     android:toYDelta="0" >  
  9.   
  10. </translate>  

(2)Activity从右侧退出:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="utf-8"?>  
  2.   
  3. <translate xmlns:android="http://schemas.android.com/apk/res/android"  
  4.     android:duration="150"  
  5.     android:fromXDelta="0"  
  6.     android:fromYDelta="0"  
  7.     android:toXDelta="100%p"  
  8.     android:toYDelta="0" >  
  9.   
  10. </translate>  

(3)Activity从左侧进入:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="utf-8"?>  
  2.   
  3. <translate xmlns:android="http://schemas.android.com/apk/res/android"  
  4.     android:duration="150"  
  5.     android:fromXDelta="-100%p"  
  6.     android:fromYDelta="0"  
  7.     android:toXDelta="0"  
  8.     android:toYDelta="0" >  
  9.   
  10. </translate>  

(4)Activity从右侧进入:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="utf-8"?>  
  2.   
  3. <translate xmlns:android="http://schemas.android.com/apk/res/android"  
  4.     android:duration="150"  
  5.     android:fromXDelta="100%p"  
  6.     android:toXDelta="0"  
  7.     android:fromYDelta="0"  
  8.     android:toYDelta="0" >  
  9.   
  10. </translate>  

原文链接:  http://blog.csdn.net/books1958/article/details/40858835?utm_source=tuicool&utm_medium=referral
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 创建三个ActivityActivity1、Activity2、Activity3。 2. 在AndroidManifest.xml文件中注册三个Activity。 3. 在Activity1的布局文件中添加两个Button分别用于跳转到Activity2和Activity3。 4. 在Activity2和Activity3的布局文件中也分别添加一个Button,用于返回Activity1。 5. 在Activity1的Java文件中获取Button的实例,为Button添加点击事件,在点击事件中使用Intent跳转到Activity2或Activity3。 6. 在Activity2和Activity3的Java文件中也分别获取Button的实例,为Button添加点击事件,在点击事件中使用Intent跳转到Activity1。 7. 运行程序,测试三个Activity之间的跳转是否正常。 示例代码如下: Activity1.java ``` public class Activity1 extends AppCompatActivity { private Button btnToActivity2; private Button btnToActivity3; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity1); btnToActivity2 = findViewById(R.id.btn_to_activity2); btnToActivity3 = findViewById(R.id.btn_to_activity3); btnToActivity2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(Activity1.this, Activity2.class); startActivity(intent); } }); btnToActivity3.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(Activity1.this, Activity3.class); startActivity(intent); } }); } } ``` Activity2.java ``` public class Activity2 extends AppCompatActivity { private Button btnToActivity1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity2); btnToActivity1 = findViewById(R.id.btn_to_activity1); btnToActivity1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(Activity2.this, Activity1.class); startActivity(intent); } }); } } ``` Activity3.java ``` public class Activity3 extends AppCompatActivity { private Button btnToActivity1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity3); btnToActivity1 = findViewById(R.id.btn_to_activity1); btnToActivity1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(Activity3.this, Activity1.class); startActivity(intent); } }); } } ``` activity1.xml ``` <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity1" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".Activity1"> <Button android:id="@+id/btn_to_activity2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="To Activity 2" android:layout_centerHorizontal="true" android:layout_marginTop="100dp"/> <Button android:id="@+id/btn_to_activity3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="To Activity 3" android:layout_centerHorizontal="true" android:layout_below="@+id/btn_to_activity2" android:layout_marginTop="50dp"/> </RelativeLayout> ``` activity2.xml ``` <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity2" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".Activity2"> <Button android:id="@+id/btn_to_activity1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="To Activity 1" android:layout_centerHorizontal="true" android:layout_marginTop="100dp"/> </RelativeLayout> ``` activity3.xml ``` <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity3" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".Activity3"> <Button android:id="@+id/btn_to_activity1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="To Activity 1" android:layout_centerHorizontal="true" android:layout_marginTop="100dp"/> </RelativeLayout> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值