首页 > 代码库 > Android学习之Activity深入

Android学习之Activity深入

activitiy中打开一个Aactivitiy,Aactivitiy会走以下生命周期
onCreate–》onStart–》onResume–》A运行–》发出打开B的intent–》AonPause–》B可见–》AonStop,此时B经历同样的生命周期,
等B结束,A再度可见,onRestart–》onStart–》onResume

注意:AonPause之后B可见,为了不影响B界面的显示,这里最好不要在A的onPause中做耗时操作,耗时操作可以在onPause中操作,因为此时B已经可见。

一,异常情况下的生命周期

1,资源相关的系统配置发生改变
比如横竖屏切换,系统资源配置发生了改变,activity会被摧毁并重新创建,因为是异常终止,activity会使用saveInstanceState方法来保存状态,这个方法在onStop之前,与onPause没有时序关系,当activitiy重建时,系统会把saveInstanceState保存下来的Bundle对象传递给onRestoreInstanceState和onCreate方法,

2,系统内存不足导致低优先级activity被杀死
activity优先级
1,处于前台与用户交互的activitiy优先级最高,
2,可见但非前台居中,比如弹出的dialog或者显示的progress使activity无法与用户交互,但此时activity仍然可见
3,位于后台失去焦点,此时activity处于onStop状态,优先级最低。
当系统资源不足时,会优先杀死优先级低的activity,由于是异常终止,系统会调用saveInstanceSate和onRestoreInstanceState两个方法来保存和恢复数据

二,Activity过渡的五中实现
1.使用overridePendingTransition方法实现Activity跳转动画
overridePendingTransition方法是Activity中提供的Activity跳转动画方法,通过该方法可以实现Activity跳转时的动画效果
比如:
Intent intent =newIntent(MainActivity.this, SecondActivity.class);
startActivity(intent);
overridePendingTransition(R.anim.slide_in_left, R.anim.slide_in_left);
这个函数有两个参数,一个参数是第一个activity进入时的动画,另外一个参数则是第二个activity退出时的动画。

这里需要特别说明的是,关于overridePendingTransition这个函数,有两点需要主意
1>.它必需紧挨着startActivity()或者finish()函数之后调用”
2>.它只在android2.0以及以上版本上适用

2、使用style的方式定义Activity的切换动画
(1)定义Application的theme给主题定义style

<application 
Android:allowBackup="true"
Android:icon="@mipmap/ic_launcher" 
Android:label="@string/app_name" 
Android:supportsRtl="true" 
Android:theme="@style/AppTheme">

(2)定义具体的AppTheme样式
其中这里的windowAnimationStyle就是我们定义Activity切换动画的style。而@anim/slide_in_top就是我们定义的动画文件,也就是说通过为Appliation设置style,然后为windowAnimationStyle设置动画文件就可以全局的为Activity的跳转配置动画效果。

<!-- Base application theme. --> 
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
 <!-- Customize your theme here. --> 
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item> 
<item name="colorAccent">@color/colorAccent</item>
<item name="Android:windowAnimationStyle">@style/activityAnim</item>
</style><!-- 使用style方式定义activity切换动画 -->
 <style name="activityAnim">
 <item name="Android:activityOpenEnterAnimation">@anim/slide_in_top</item>
 <item name="Android:activityOpenExitAnimation">@anim/slide_in_top</item> </style>

而在windowAnimationStyle中存在四种动画:

activityOpenEnterAnimation
用于设置打开新的Activity并进入新的Activity展示的动画
activityOpenExitAnimation
用于设置打开新的Activity并销毁之前的Activity展示的动画
activityCloseEnterAnimation
用于设置关闭当前Activity进入上一个Activity展示的动画
activityCloseExitAnimation
用于设置关闭当前Activity时展示的动画

案列中只做了两种动画

3.使用ActivityOptions切换动画实现Activity跳转动画

通过overridePendingTransition方法基本上可以满足我们日常中对Activity跳转动画的需求了,但MD风格出来之后,overridePendingTransition这种老旧、生硬的方式怎么能适合我们的MD风格的App呢?ActivityOptions是google在新的sdk中给我们提供了另外一种Activity的过度动画。并且提供了兼容包——ActivityOptionsCompat。ActivityOptionsCompat是一个静态类,提供了相应的Activity跳转动画效果,通过其可以实现不少炫酷的动画效果。
(1)在跳转的Activity中设置contentFeature

@Override protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
// 设置contentFeature,可使用切换动画 
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS); 
Transition explode = TransitionInflater.from(this).inflateTransition(Android.R.transition.explode);
getWindow().setEnterTransition(explode); 
setContentView(R.layout.activity_three); }

(2)在startActivity执行跳转逻辑的时候调用startActivity的重写方法,执行ActivityOptions.makeSceneTransitionAnimation方法

/** * 点击按钮,实现Activity的跳转操作 * 通过Android5.0及以上代码的方式实现activity的跳转动画 */
button3.setOnClickListener(new View.OnClickListener() { 
@Override public void onClick(View v) { 
Intent intent = new Intent(MainActivity.this, ThreeActivity.class); 
startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(MainActivity.this).toBundle()); } });

4,使用ActivityOptions之后内置的动画效果通过style的方式
这种方式其实就是通过style的方式展示和使用ActivityOptions过度动画,下面是实现通过定义style方式定义过度动画的步骤:
(1)编写过度动画文件

首先我们需要在Application项目res目录下新建一个transition目录,然后创建资源文件,然后使用这些系统自带的过渡动画效果,这里设置了过度时长为300ms。

<explode xmlns:Android="http://schemas.Android.com/apk/res/Android" 
Android:duration="300" />

(2)定义style文件,把translation目录下定义好的资源引用进来

<!-- Base application theme. --> 
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> 
<!-- Customize your theme here. --> 
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item> 
<item name="colorAccent">@color/colorAccent</item>
<item name="Android:windowEnterTransition">@transition/activity_explode</item>
<item name="Android:windowExitTransition">@transition/activity_explode</item> 
</style>

在Application的style文件中添加,并指定过渡动画效果为我们刚刚定义的过渡动画文件:

<item name="Android:windowEnterTransition">@transition/activity_explode</item>
<item name="Android:windowExitTransition">@transition/activity_explode</item>

(3)执行跳转逻辑
点击按钮,实现Activity的跳转操作 * 通过Android5.0及以上style的方式实现activity的跳转动画

button4.setOnClickListener(new View.OnClickListener() 
{ @Override public void onClick(View v) {
 /** * 调用ActivityOptions.makeSceneTransitionAnimation实现过度动画 */ 
Intent intent = new Intent(MainActivity.this, FourActivity.class); 
startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(MainActivity.this).toBundle()); 
}
 });

(五)使用ActivityOptions动画共享组件的方式实现跳转Activity动画
这里的共享组件动画效果是指将前面一个Activity的某个子View与后面一个Activity的某个子View之间有过渡效果,即在这种过度效果下实现Activity的跳转操作。那么如何实现两个组件View之间实现过渡效果呢?

(1)定义共享组件
在Activity a中的button按钮点击transitionName属性:

<Button Android:id="@+id/button5" 
Android:layout_width="match_parent" 
Android:layout_height="wrap_content" 
Android:layout_below="@+id/button4" 
Android:layout_marginTop="10dp" 
Android:layout_marginRight="10dp" 
Android:layout_marginLeft="10dp" Android:text="组件过度动画" 
Android:background="@color/colorPrimary" 
Android:transitionName="shareNames" />

在Activity b的布局文件中为组件定义transitionName属性,这样这两个组件相当于有了过度对应关系,这里需要注意的是这两个组件的transitionName属性的值必须是相同的。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
xmlns:Android="http://schemas.Android.com/apk/res/Android" 
Android:id="@+id/activity_second" 
Android:layout_width="match_parent" 
Android:layout_height="match_parent" 
Android:gravity="center_horizontal" Android:orientation="vertical" 
Android:transitionName="shareNames" > <TextView 
Android:layout_width="match_parent" 
Android:layout_height="match_parent" 
Android:background="@color/colorAccent" 
Android:layout_marginTop="10dp" 
Android:layout_marginBottom="10dp" />
</LinearLayout>

(2)调用startActivity执行跳转动画
点击按钮,实现Activity的跳转操作 * 通过Android5.0及以上共享组件的方式实现activity的跳转动画

button5.setOnClickListener(new View.OnClickListener() { 
@Override public void onClick(View v) { 
Intent intent = new Intent(MainActivity.this, FiveActivity.class); 
startActivity(intent, 
ActivityOptions.makeSceneTransitionAnimation(MainActivity.this, button5, "shareNames").toBundle()); } 
});

需要说明的是这里调用的ActivityOptions.makeSceneTransitionAnimation方法,传递了三个参数,其中第一个参数为context对象,第二个参数为启动Activity的共享组件,第三个参数为启动Activity的共享组件transitionName属性值。
这样经过调用之后我们就实现了从Activity a跳转到Activity b的时候a中的组件到b中组件的过度效果。

过渡动画总结

  • overridePendingTransition方法从Android2.0开始,基本上能够覆盖我们activity跳转动画的需求;

  • ActivityOptions API是在Android5.0开始的,可以实现一些炫酷的动画效果,更加符合MD风格;ActivityOptions还可以实现两个Activity组件之间的过度动画;

  • 定义Application style的动画为全局动画,而在java代码中设置的是局部动画

参考文章
http://www.jianshu.com/p/c21216bf5f82
http://www.cnblogs.com/bavariama/p/3368515.html

<script type="text/javascript"> $(function () { $(‘pre.prettyprint code‘).each(function () { var lines = $(this).text().split(‘\n‘).length; var $numbering = $(‘
    ‘).addClass(‘pre-numbering‘).hide(); $(this).addClass(‘has-numbering‘).parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($(‘
  • ‘).text(i)); }; $numbering.fadeIn(1700); }); }); </script>

    Android学习之Activity深入