首页 > 编程知识 正文

安卓生命周期方法,安卓activity的生命周期

时间:2023-05-06 08:20:32 阅读:110224 作者:3994

Activity生命周期Activity作为安卓的四个组件之一,是非常重要、最常用的四个组件。 使用Activity必须注册AndroidManifest,作为Android的基础,是否完全掌握了Activity的生命周期呢? 一起回顾一下Activity的生命周期吧。

首先,您必须知道Activity的生命周期分为两种。

典型情况下的生命周期(我们开发中常用的)、异常情况下的生命周期(也用于开发,但并不是所有项目都去回调异常生命周期的方法) ),所以先介绍前者因为后者会出现特殊情况。

典型情况下的生命周期说明

oncreate :在第一次创建activity时调用。 包含Activity最后一个状态的Bundle对象将传递给此方法。 但是,前提是捕获该状态并调用onStart方法。 使用此方法可以执行所有常规静态设置,例如创建视图或将数据绑定到列表。 ) onstart :在activity被用户识别之前调用。 然后,当Activity移动到前台时,调用onResume方法。 此时,如果直接画面消失或用户按home键,就会直接调用onStop方法,当然这很极端。 on resume :在activity即将开始与用户交互之前调用。 此时,Activity位于Activity堆栈的顶部,并且具有用户输入焦点。 跳到另一个Activity或退出当前Activity时,将调用onPause方法。 onPause :在系统即将开始另一个Activity之前调用。 此方法通常用于检查对永久数据的未保存更改、停止动画以及可能占用CPU的其他内容。 所需的操作必须非常迅速地执行。 无法执行耗时的操作,因为返回后将继续下一个Activity。 然后通常调用onStop方法。 但是,在极端的情况下,如果此时将当前Activity快速放回前台,则会调用onResume方法。 onstop :在activity对用户不再可见时调用。 如果Activity被销毁,或者另一个Activity (现有的Activity或新的Activity )将继续运行并被复盖,则调用此方法。 随后,当Activity恢复与用户的交互时,将调用onRestart方法,而当Activity被丢弃时,将调用onDestroy方法。 onStart :在activity停止后重新启动时调用onStart方法。 也就是说,画面消失后再次返回app,按home键后再次返回app。 on destroy :在活动被销毁之前调用。 这是activity收到的最后一个调用。 有时在Activity结束、对Activity调用finish方法,或者为了节省空间而临时丢弃Activity实例时调用。 可以用isFinishing方法区分这两种情况。 示例String TAG='myTag '; @ overrideprotectedvoidoncreate (bundlesavedinstancestate ) super.oncreate ) savedinstancestate; setcontentview (r.layout.content _ main; log.d(tag,' onCreate:' ); }@Overrideprotected void onStart () { super.onStart ); log.d(tag,' onStart:' ); } @ overrideprotectedvoidonresume () { super.onResume ); log.d(tag,' onResume:' ); }@Overrideprotected void onPause () { super.onPause ); log.d(tag,' onPause;' ); }@Overrideprotected void onStop () { super.onStop ); log.d(tag,' onStop:' ); } @ overrideprotectedvoidonrestart () { super.onRestart ); log.d(tag,' onRestart ' ); } @ overrideprotectedvoidondestroy () { super.onDestroy ); log.d(tag,' onDestroy:' ); }启动后,您将看到以下内容:

返回手机主界面:

再次返回到APP应用程序:

要结束虚拟机应用/翻转,请:

生命周期(使组件识别生命周期并进一步去耦Activity )定时小的情况publicclassmainactivityextendsappcompatactivity (专用) private long elapsedTime; @Override protected

void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); meter = findViewById(R.id.meter); //SystemClock.elapsedRealtime()就是从软件启动开始计时,退出结束,后台依然计时 meter.setBase(SystemClock.elapsedRealtime()); } @Override protected void onResume() { super.onResume(); //将 当前运行时间-此前计时时间 设置为base时间; //也就是说base时间与此时的已运行时间相差elapsedTime,也就是此前的已运行时间,然后接着计时 meter.setBase(SystemClock.elapsedRealtime() - elapsedTime); meter.start(); } @Override protected void onPause() { super.onPause(); //获取此时已经计时的时间 elapsedTime = SystemClock.elapsedRealtime() - meter.getBase(); //并不会真的停止计时,后台其实还在计时 meter.stop(); }}

调用start(); 函数定时器开始计时,调用stop(); 函数当然就应该是停止(字面理解),但是stop() 的停止是停止视图计时(变动),但是后台其实还是在计时,毕竟依赖的是系统开机时间来计时的,stop() 方法是不可能把开机时间停止下来的

LifeCycles

在上面的例子中,有一个问题:如果我们相似的组件太多,就会使activity中过于耦合。这时使用LifeCycles,让组件自身去感知生命周期的变化,可以使组件的独立性更高。

创建一个我们自定义组件

public class MyChronometer extends Chronometer implements LifecycleObserver { private Long elapsedTime; public MyChronometer(Context context, AttributeSet attrs) { super(context, attrs); } @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) private void pauseMeter(){ elapsedTime = SystemClock.elapsedRealtime() - getBase(); stop(); } @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) private void resumeMeter(){ setBase(SystemClock.elapsedRealtime() - elapsedTime); start(); }}

添加观察者

private Chronometer meter = null;@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); meter = findViewById(R.id.meter); getLifecycle().addObserver((LifecycleObserver) meter);}

使用该组件

效果与上面的效果一样,但是如果我们的屏幕翻转,就会重新计时。一个简单的方法,elapsedTime设置为静态的就可以了

private static Long elapsedTime = 0L;

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。