Activity的点点滴滴

声明:此文非本人原创,为整理网络资料加自己的一些注解所得。

参考:http://blog.csdn.net/tscyds/article/details/47686619

一.Activity生命周期


二.重要的方法

1.onWindowFocusChanged(boolean hasFocus)

       在Activity窗口获得或失去焦点时被调用,例如创建时首次呈现在用户面前;当前Activity被其他Activity覆盖;当前Activity转到其他Activity或按Home键回到主屏,自身退居后台;用户退出当前Activity。打开软键盘进行输入,  窗口失去焦点;软键盘输入完毕消失,  窗口重新获取焦点;调用getwidth()  getHeight()获取视图宽高值

      以上几种情况都会调用onWindowFocusChanged,并且当Activity被创建时是在onResume之后被调用,当Activity被覆盖或者退居后台或者当前Activity退出时,它是在onPause之后被调用.

hasWindowFocus()
说明:获取activity主窗口的焦点状态,该状态与窗口中的View的状态是不一样的。


2.onSaveInstanceState(Bundle outState)   当系统“未经你许可”时销毁了你的activity,则onSaveInstanceState会被系统调用

(1)在Activity被覆盖或退居后台之后,系统资源不足将其杀死,此方法会被调用;(2)在用户改变屏幕方向时,此方法会被调用;(3)在当前Activity跳转到其他Activity或者按Home键回到主屏,自身退居后台时,此方法会被调用。第一种情况我们无法保证什么时候发生,系统根据资源紧张程度去调度;第二种是屏幕翻转方向时,系统先销毁当前的Activity,然后再重建一个新的,调用此方法时,我们可以保存一些临时数据;第三种情况系统调用此方法是为了保存当前窗口各个View组件的状态。onSaveInstanceState的调用顺序是在onPause之前。
3.onRestoreInstanceState(Bundle savedInstanceState)

(1)在Activity被覆盖或退居后台之后,系统资源不足将其杀死,然后用户又回到了此Activity,此方法会被调用;(2)在用户改变屏幕方向时,重建的过程中,此方法会被调用。我们可以重写此方法,以便可以恢复一些临时数据。onRestoreInstanceState的调用顺序是在onStart之后。

4.getLoaderManager() 获取LoaderManager实例

LoaderManager:LoaderManager用来负责管理与Activity或者Fragment联系起来的一个或多个Loaders对象。每个Activity或者Fragment都有唯一的一个LoaderManager实例,用来启动、停止、保持、重启、关闭它的Loaders。LoaderManager与Activity或Fragment的生命周期相关联。Loader的作用:主要的作用在单独的线程中读取数据和监视数据的更新,以防止阻塞UI线。

5.isVoiceInteraction()确定你的activity是否触发了一个语音活动。如果是,你的应用程序可以使用类VoiceInteractor向用户请求语音确认,选择一系列选项,等等。

6.onNewIntent(Intent intent)

     Activity供多种方式调用启动的情况,多个调用希望只有一个Activity的实例存在,这就需要Activity的onNewIntent(Intent intent)方法了。Manifest中对Activity设置lanuchMode属性,则在必要的时候会执行onNewIntent()。在方法中调用setIntent(intent)得到新的intent。然后在其他方法中调用getintent().getExtra()得到启动这个activity的Intent putExtra传过来的值。

7.onUserLeaveHint()

      当该Activity即将由前台状态变成后台状态时会调用该方法,比如按下Home按键或是启动一个新的Activity。该方法的调用时间是在onPause之前的,此时还是前台状态,当由电话打断当前Activity时,并不会触发该方法。使用场景:Android主页键和最近应用键的处理onUserLeaveHint。

8.onUserInteraction()   当按键、触屏或轨迹球事件分发到该activity时就会回调该方法,在activity的dispatchKeyEvent方法中,首先就是调用该方法。

9. onCreateThumbnail(Bitmap outBitmap, Canvas canvas)  为这个Activity生成一个缩略图.

10.onConfigurationChanged(Configuration newConfig)

     在manifest中声明了configChanges属性时,activity在运行过程中,当设备的配置改变时会被调用。例如旋转屏幕时,打开或者隐藏键盘。从而避免重新来创建activity实例。
    getChangingConfigurations(): 主要是用于获取到底是哪种配置改变。

11.onLowMemory() 在系统内存不足,所有后台程序(优先级为background的进程,不是指后台运行的进程)都被杀死时,会调用OnLowMemory。

        onTrimMemory(int level)系统会根据不同的内存状态来回调。例如按Home键时就会调用。释放缓存:包括一些文件缓存,图片缓存等或一些动态生成动态添加的View,这些动态生成和添加的View且少数情况下才使用到的View,这时候可以被释放。
(1)OnLowMemory被回调时,已经没有后台进程;而onTrimMemory被回调时,还有后台进程。
(2)OnLowMemory是在最后一个后台进程被杀时调用,一般情况是low memory killer 杀进程后触发;而OnTrimMemory的触发更频繁,每次计算进程优先级时,只要满足条件,都会触发。
(3)通过一键清理后,OnLowMemory不会被触发,而OnTrimMemory会被触发一次。

12.setContentView(int layoutResID)  真正显示View的是Window。而这个ContentView是一个FrameLayout,是DecorView的Child的Child。
      addContentView(View view, ViewGroup.LayoutParams params)   往ContentView添加View
setContentView() 会导致先前添加的被移除, 即替换性的;而 addContentView() 不会移除先前添加的UI组件,即是累积性的

13.getContentTransitionManager()  setContentTransitionManager(TransitionManager tm)    getContentScene()   用于activity的转场动画相关的操作。

14.setFinishOnTouchOutside(boolean finish)    当activity设置为对话框样式时,通过该方法可以设置点击对话框外的区别触发是否销毁activity。该方法要在onCreate方法设置时才有效。

15.onAttachedToWindow()
   当与该activity相关联的主窗口添加到window manager时,会回调该方法。执行顺序为:onResume --> onAttachedToWindow --> onWindowFocusChanged
onDetachedFromWindow()
   当与该activity相关联的主窗口从window manager分离时,会回调该方法。执行顺序为:onWindowFocusChanged--> onStop --> onDestroy --> onDetachedFromWindow

16.onCreatePanelView(int featureId)  重写onCreatePanelView()方法,提供了一个完全自定义的OptionMenu视图,即自定义menu。

17.onSearchRequested()  用于浮动搜索的实现,即调用系统的searchUI组件。关键就是在该方法中启动search,即startSearch。

18.takeKeyEvents(boolean get)    在Activity中没有取得 焦点的View,也会处理此按键事件。

19.overridePendingTransition(int enterAnim, int exitAnim)   
用于设置从一个activity跳转到另外一个activity时的切换动画。一部分是第一个activity退出时的动画,另外一部分时第二个activity进入时的动画。

20.getCallingPackage() 获取调用者的包名,注意只有使用startActivityForResult这种方式,getCallingPackage的值才不会是null。
getCallingActivity().getClassName()     获取调用activity

21. releaseInstance()
释放activity实例以回收内存,返回true表示正在回收实例,false表示无法回收可能是因为该activity正在显示或者已经被destroyed/finished。

22. runOnUiThread(Runnable action)  使当前执行的方法在UI线程上执行。

23.startLockTask()
固定屏幕,使用该方法时用户不能切换其他app。实际上就是锁定当前的task。
stopLockTask()     关闭固定屏幕。

24.setVolumeControlStream(int streamType) 设置声音控制按钮控制的声音的类型的。这个方法有相应的getter

25.setProgressBarVisibility(boolean visible)  设置标题栏中ProgressBar的可见性

26. onBackPressed()  按back键时会被调用 ,默认情况下是结束当前Activity的生命,但是我们可以重写这个方法来实现我们想要的操作。

三、情景

情景一:有两个Activity(a和b),一开始显示a,然后由a启动b,然后在由b回到a,这时候a的生命过程应该是怎么样的呢(a被b完全遮盖)?
a经历的过程为onCreate->onStart->onResume->onPause->onStop->onRestart->onStart->onResume。这个过程说明了图中,如果Activity完全被其他界面遮挡时,进入后台,并没有完全销毁,而是停留在onStop状态,当再次进入a时,onRestart->onStart->onResume,又重新恢复。

情形二:同一,不过此时a被b部分遮盖(比如给b添加个对话框主题 android:theme="@android:style/Theme.Dialog")
a经历的过程是:onCreate->onStart->onResume->onPause->onResume所以当Activity被部分遮挡时,Activity进入onpause,并没有进入onStop,从Activity2返回后,执行了onResume。一般情况下网络请求放在onResume方法中,这样做的目的是负责在当前页面上的页面结束后,当前页面也能及时更新数据

情形三:打开程序,启动a,点击a,启动AlertDialog,按返回键从AlertDialog返回。

a经历的过程是:onCreate->onStart->onResume当启动和退出Dialog时,Activity的状态始终未变,可见,Dialog实际上属于Acitivity内部的界面,不会影响Acitivty的生命周期。

Android下拉通知栏不会影响Activity的生命周期方法

onResume是在启动activity启动之后才能执行的,也就是恢复执行。程序正常启动:onCreate()->onStart()->onResume();
正常退出:onPause()->onStop()->onDestory()
一个Activity启动另一个Activity: onPause()->onStop(), 再返回:onRestart()->onStart()->onResume()
程序按back 退出: onPause()->onStop()->onDestory(),再进入:onCreate()->onStart()->onResume();

程序按home 退出: onPause()->onStop(),再进入:onRestart()->onStart()->onResume();

 横竖屏切换涉及到的是Activity的android:configChanges属性,而与其android:launchMode属性没有关系;(各个安卓版本有所差异)
       android:configChanges可以设置的属性值有:
       (1)orientation:消除横竖屏的影响(2)keyboardHidden:消除键盘的影响(3)screenSize:消除屏幕大小的影响
1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,
切横屏时会执行一次,切竖屏时会执行两次
2、设置Activity的android:configChanges="orientation"时,切屏还是会重新调
用各个生命周期,切横、竖屏时只会执行一次
3.设置了orientation|screenSize属性之后,不会重新加载Activity的各个生命周期;在进行横竖屏切换的时候在调用onStop之前会调用onSaveInstanceState来进行Activity的状态保存,随后在重新显示该Activity的onResume方法之前会调用onRestoreInstanceState来恢复之前由onSaveInstanceState保存的Activity信息;
    android:screenOrientation="portrait" 始终以竖屏显示
        android:screenOrientation="landscape" 始终以横屏显示
     Activity.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);以竖屏显示
        Activity.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);以横屏显示
activity之间的通信方式
1.Intent(界面跳转时通过intent传值)
2.借助类的静态变量或静态方法  通过className.fileName访问和修改类的静态变量、写bean类提供get/set方法
3.使用接口回调回调    
4.借助外部工具
    – 借助SharedPreference  存放在data/data/应用包名/shared_prefs目录下后缀为.xml的文件
    读:
     //获取Application的SharedPreference对象  
        SharedPreferences sp = getApplication().getSharedPreferences("myInfo", 0);  
        //get方法获取值,如果没有存储对应的key-value则返回get方法给的默认值  
        String name = sp.getString("name", "null");  
    写:
    SharedPreferences.Editor editor = sp.edit();  
        editor.putString("name", "WangJie");      
      //put完成后一定要commit(),否则不会生效  
        editor.commit();  
    – 使用Android数据库SQLite  存放在data/data/应用包名/databases目录下的后缀为.db的文件
    – 赤裸裸的使用File
    – Android剪切板
5.借助Service
6.startActivityForResult
原Activity中:
1.创建Intent对象。
2.启动指定Activity并等待返回结果,其实请求码是用来标志该请求startActivityForResult(intent, REQUSET)。
3.重新onActivityResult(int requestCode, int resultCode, Intent data)接收指定Activity返回的结果。
在指定Activity中:
1.获取Intent的对象intent。
2.通过intent添加参数,或用Bundle包装需要返回的数据并put入intnet中。
3.设置该Activity的结果码,并设置结束之后要返回的Activity: setResult(RESULT_OK, intent)。
4.finish()掉该Activity。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值