Android总结 四大组件之Activity

为了自己以后能随时回顾


目录

Android 四大组件 Activity

Activity窗口构成

Activity 生命周期

影响生命周期的因素

Activity 启动模式

standart

singleTop

singleTask

singleInstance


  • Android 四大组件 Activity

Activity是Android提供的四大组件之一,是进行Android开发必不可少的组件.Activity是一个界面的载体,可以把它与html页面进行类比,html页面由各种各样的标签组成,而Activity则可以由各种控件组成.

具体可查看:

https://www.jianshu.com/p/0b99db3b8ed8

  • Activity窗口构成

 

  • Activity 生命周期

1.当Activity位于栈顶时,此时正好处于屏幕最前方,此时处于运行状态

2.当Activity失去了焦点但仍然对用于可见(如栈顶的Activity是透明的或者栈顶Activity并不是铺满整个手机屏幕),此时处于暂停状态

3.当Activity被其他Activity完全遮挡,此时此Activity对用户不可见,此时处于停止状态

4.当Activity由于人为或系统原因(如低内存等)被销毁,此时处于销毁状态;

Activity的生命周期都是成对的,下面是Activity生命周期的回调方法

  • onCreate(Bundle saveInstanceState) - onDestroy() 

  • onStart() - onStop() - onReStart()

  • onResume() - onPause()

在实际应用场景中,假设A Activity位于栈顶,此时用户操作,从A Activity跳转到B Activity

开始时,A被实例化,执行的回调有A:onCreate -> A:onStart -> A:onResume。

当用户点击A中按钮来到B时,假设B全部遮挡住了A,将依次执行A:onPause -> B:onCreate -> B:onStart -> B:onResume -> A:onStop。

此时如果点击Back键,将依次执行B:onPause -> A:onRestart -> A:onStart -> A:onResume -> B:onStop -> B:onDestroy。

至此,Activity栈中只有A。

  • 影响生命周期的因素

  1. 在Android中,有两个按键在影响Activity生命周期这块需要格外区分下,即Back键和Home键。

当由A跳转B后,点击Back键,将依次执行B:onPause -> A:onRestart -> A:onStart -> A:onResume -> B:onStop -> B:onDestroy。

当已经返回到A,此时如果按下Back键,系统返回到桌面,并依次执行A:onPause -> A:onStop -> A:onDestroy。

如果在A中按下Home键(非长按),系统返回到桌面,并依次执行A:onPause -> A:onStop。由此可见,Back键和Home键主要区别在于是否会执行onDestroy。

如果长按Home键,不同手机可能弹出不同内容,Activity生命周期未发生变化.

当前不少应用程序都是采取如Home键的效果,当点击了Back键,系统返回到桌面,然后点击应用程序图标,直接回到之前的Activity界面。

@Override
public void onBackPressed() {
    Intent home = new Intent(Intent.ACTION_MAIN);
    home.addCategory(Intent.CATEGORY_HOME);
    startActivity(home);
}

当然,此种方式通过Home键效果强行影响到Back键对Activity生命周期的影响。注意,此方法只是针对按Back键需要退回到桌面时的Activity且达到Home效果才重写。为达到此类效果,Activity实际上提供了直接的方法。

activity.moveTaskToBack(true);

moveTaskToBack()此方法直接将当前Activity所在的Task移到后台,同时保留activity顺序和状态。 

  • 当设备进行旋转后,当前Activity生命周期将改变。

当屏幕旋转时,Activity需要被重建,Activity对象会被终止,onPause() -> onStop() ->onDestroy() ->onCreate() ->onStart() ->onResume();

重建导致所有页面数据都被重置,用户体验性不好。

解决方法:

 1)禁止旋转屏幕,在androidManifest.xml中配置

<activity 
  android:name=".MyActivity" 
  android:screenOrientation="portrait" 
  android:label="@string/app_name"/> 

           2 ) 旋转后恢复现场,android提供了屏幕旋转监听回调方法,在此方法中可以进行恢复数据


//此方法 是屏幕切换会触发
@Override 
public Object onRetainNonConfigurationInstance() { 
  final MyDataObject data = collectMyLoadedData(); 
  return data; 
}


//使用 getLastNonConfigurationInstance()进行恢复数据
@OVerride
protected void onCreate(Bundle saveInstanceState){
    //最终obj的内容就是上次切换时的内容。
    Object obj = getLastNonConfigurationInstance();
}
  1. 也可以在onPause()里将用户当前已经输入的内容保存到数据库或Preference,在onCreate()方法里读取并填充到表单中。
  2. 屏幕旋转也会触发onSaveInstanceState,而还原时会产生onRestoreInstanceState,也可以在这两个方法中执行操作。
  3. 注意:onRetainNonConfigurationInstance()在onSaveInstanceState()之后被调用

            3)手工处理旋转

             一般情况下Configuration的改变会导致Activity被销毁重建,但也有办法让指定的Configuration改变时不重建Activity,方法是在AndroidManifest.xml里通过android:configChanges属性指定需要忽略的Configuration名字,例如下面这样: 

<activity 
  android:name=".MyActivity" 
  android:configChanges="orientation|keyboardHidden" 
  android:label="@string/app_name"/> 

这样设置以后,当屏幕旋转时Activity对象不会被销毁——作为替代,Activity的onConfigurationChanged()方法被触发 。

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
  super.onConfigurationChanged(newConfig); 

  // Checks the orientation of the screen 
  if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { 
    Toast.makeText(this, "横屏模式", Toast.LENGTH_SHORT).show(); 
  } 
  else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){ 
    Toast.makeText(this, "竖屏模式", Toast.LENGTH_SHORT).show(); 
  } 
} 
  • 当系统资源不足、将处于onStop、onPause的Activity进行销毁,将改变生命周期

由于android的厂商和系统不同,给应用分配的内存也不同,有的大,有的小,如果应用的内存不足首先会销毁onStop的Activity,其次会销毁处于onPause的Activity,如果B在栈顶,A在栈中处于onStop,在B上点击返回A,则会依次执行 B:onPause->B:onStop->A:onCreate-A:onStart->A:onResume,而A中的数据已被重置。

  • 开发中的建议
  1. 尽量不要在onCreate、onStart、onReume中执行耗时操作,如果要执行耗时操作,使用多线程执行,不要在主线程中执行,防止阻塞主线程。
  2. 当设备可以旋转操作时,要使用好旋转监听方法进行数据保存,提高用户的体验性。
  3. 当要销毁Activity时,要记住关闭所有的数据流防止内存溢出。
  4. 在Activity处于onStop状态时、可以在onPause中保存数据,在onResume中填充数据,这样可以保证数据存储。
  • Activity 启动模式

在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作。在Android中Activity的启动模式决定了Activity的启动运行方式。

配置是在AndroidManifast.xml中配置:

<activity android:name=".MainActivity" android:launchMode="standard" />

Activity启动模式有四种:

  • standart

  1. 默认启动模式,打开新Activity,都会压入到栈中,不会去判断栈中是否存在。
  • singleTop

当打开新的Activity,会先判断栈顶的Activity是否是当前Activity,如果是则启动栈顶的Activity,不会创建新的Activity,如果不是则会创建一个新的Activity并且压入到栈顶。

  • singleTask

当打开新的Activity,会先判断返回栈中是否有当前Activity,如果有则启动,并且把当前Activity以上的所有返回栈中的Activity全部出栈,使当前Activity处于栈顶,如果没有则创建新Activity对象,并且压入到栈顶。

  • singleInstance

会启用一个新的返回栈来管理这个活动(其实如果singleTask模式指定了不同的taskAffinity,也会启动一个新的返回栈);并且该返回栈中只放入这一个活动。

FirstActivity和ThirdActivity处于同一个返回栈,SecondActivity处于一个新建的返回栈

调用第三方应用是会设置此模式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值