4.3 Activity的停止和重新启动

合理安排Activity生命周期中停止和重新启动的时机,能够使得让用户意识到应用软件始终处于运行状态,并维持着他们的进程。下面列举了若干Activity停止和重新启动场景:

  • 用户通过“最近使用的应用软件”窗口从本应用软件切换到其他应用软件,运行在前台的Activity被停止。当用户通过HOME屏幕启动图标或者“最近使用的应用软件”窗口返回本应用软件,Activity被重新启动。
  • 用户通过应用软件的某个动作启动另一个Activity,当前Activity在新的Activity被创建时被停止。当用户点击Back按钮,被停止的Activity被重新启动。
  • 当用户在使用应用软件时接听电话。

Activity类提供了OnStop()和OnRestart()两个生命周期方法,用来处理停止和重新启动的事件。与paused状态下Activity被部分遮挡不同,stopped状态下的activity完全不可见,用户焦点转到其他Activity或者其他的应用软件。

注意:由于系统在停止Activity时会自动在系统内存中保持Activity实例,OnStop()和OnRestart()(甚至是OnStart())并不总是需要开发者来具体实现。对于大部分相对简单的Activity,不实现OnStop()和OnRestart(),它们也能工作正常,开发者仅需实现OnPause()方法来暂停当前运行的动作和释放系统资源。

停止Activity

当Activity接收到对其OnStop()方法的调用,它将变为不可见,并释放不再需要的资源。Activity一旦处于Stopped状态,系统有可能会为了恢复系统内存而将其实例销毁。在极端的情况下,系统将忽略对OnDestroy()方法的调用而直接结束应用软件,所以在OnStop()方法中释放各种资源能够有效地确保内存泄露的情况发生。

尽管OnStop()之前会有OnPause()方法执行,但是复杂的、CPU占用率高的操作都应该放在OnStop()中实现,如向数据库写信息。

下面的OnStop()展示了将一个便签草稿保存到永久存储器的实现。

@Override 
protected void onStop(){ 
   
super.onStop();  // Always call the superclass method first 
 
   
// Save the note's current draft, because the activity is stopping 
   
// and we want to be sure the current note progress isn't lost. 
   
ContentValues values = newContentValues(); 
    values
.put(NotePad.Notes.COLUMN_NAME_NOTE, getCurrentNoteText()); 
    values
.put(NotePad.Notes.COLUMN_NAME_TITLE, getCurrentNoteTitle()); 
 
    getContentResolver
().update( 
            mUri
,    // The URI for the note to update. 
            values
,  // The map of column names and new values to apply to them. 
           
null,    // No SELECT criteria are used. 
           
null     // No WHERE columns are used. 
           
); 
}

当Activity处于Stopped状态,Acitivity对象仍位于系统内存,当Activity重新开始时能够被重新调用。在Resumed状态的前置回调方法中创建的部件都不需要开发者额外地重新初始化。Android系统同时还会跟踪界面布局中所有View的当前状态,因此当用户向一个EditText部件输入文字,其内容由系统自动保持而不用开发者进行保存和恢复。

注意:即使系统销毁了处于Stopped状态的Activity,View对象的状态(如EditText中的文字)也会通过Bundle对象(键值对集)保持,并且在用户通过导航重新返回到该Activity同一实例时由系统恢复(下一课程将详细介绍使用Bundle保存数据以防Activity被销毁或者重建)。

启动/重新启动Activity

当Activity从Stopped状态重新返回到前台运行,它将收到OnRestart()的调用。系统会在Activity转为可见(重新启动或者第一次创建)时调用OnStart()方法,而OnRestart()方法仅会在Activity从Stopped状态恢复时被调用。因此OnRestart()可以被用来完成仅当Activity是从Stopped状态恢复而不是销毁后所需要执行一些特殊的恢复工作。

使用OnRestart()方法来恢复Activity状态的做法并不常用,因此在此没有提供通过OnRestart()来控制应用软件状态变更的指导。但是,由于OnStop()方法清理了Activity的所有资源,当Activity重新启动时需要将这些资源重新实例化。此外,当Activity在初次创建时也需要执行相同的操作。所以,OnStart()方法常常用来作为OnStop()的配对操作,因为在Activity初次创建和从Stopped状态恢复运行时Android系统都会调用OnStart()方法。

例如,由于用户有可能离开应用软件很长一段时间后再返回,OnStart()非常适合用来验证应用软件所要求的系统特性都处于使能状态。

@Override 
protected void onStart(){ 
   
super.onStart();  // Always call the superclass method first 
     
   
// The activity is either being restarted or started for the first time 
   
// so this is where we should make sure that GPS is enabled 
   
LocationManager locationManager=  
           
(LocationManager) getSystemService(Context.LOCATION_SERVICE); 
   
boolean gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); 
     
   
if (!gpsEnabled){ 
       
// Create a dialog here that requests the user to enable GPS, and use an intent 
       
// with the android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS action 
       
// to take the user to the Settings screen to enable GPS when they click "OK" 
   
} 
} 
 
@Override 
protected void onRestart(){ 
   
super.onRestart();  // Always call the superclass method first 
     
   
// Activity being restarted from stopped state     
}

当系统销毁一个Activity时,会调用其OnDestroy()方法。因为在OnStop()方法中已经释放了大部分资源,大部分的应用软件的OnDestroy()所需要的工作并不多。OnDestroy()方法是清理资源防止内存泄露的最后屏障,因此在这里必须确保所有附属线程被销毁,所有长期运行的动作如追溯被关闭。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值