Activity生命周期管理之一——Starting一个Activity

Activity的生命周期完全由Android系统进行管理,周期中有几个主要的状态,下面介绍一下

理解生命周期回调函数

下面一张图说的很清晰:

 

根据app的复杂性,不一定实现所有生命周期函数,但理解他们并知道什么时候该实现是很重要的,实现周期函数要保证一下几点:

  • 接电话或转移到另一个app的时候不要产生冲突
  • 用户不用时不要消耗可观的系统资源
  • 在用户暂时离开时不要丢失用户数据和进展
  • 屏幕方向改变时不要丢失用户数据

有三个状态时可以保持的:

Resumed
此状态下,activity在前台,可以和用户交互,也叫运行状态
Paused
此状态下,本activity被另一个前台activity隐藏,这个前台activity是半透明的或只占据部分屏幕,paused状态下activity不接受用户输入,也不执行任何代码
Stopped
此状态下,activity完全不可见,也就是在后台,所有实例对象和成员变量等都被保存,但不执行任何代码

其他状态都是瞬时的,调用onCreate后立即调用onStart后立即调用onResume

这些是基本的周期状态,下面看看一些特殊的生命周期表现

指定app启动Activity

用户触点你的app icon时,系统调用被你声明为launcher activity的onCreate()函数,这个activity提供程序用户界面的主入口

可以在Android manifest文件中定义

launcher activity必须以<intent-filter>定义,包含 MAIN action 和LAUNCHER category 标签,例如:

<activity android:name=".MainActivity" android:label="@string/app_name">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

 

Note: 使用Android SDK tools建立项目时,以上声明自动包含,如果没有 MAIN action 或 LAUNCHER category,app icon不会出现在Home屏幕列表里

创建一个新实例

所有的新Activity实例产生都调用onCreate()函数

必须实现onCreate()函数做一些基本的初始化工作,例如用户界面初始化,成员变量初始化,或者UI的配置等等,例如下面例子:

TextView mTextView; // Member variable for text view in the layout

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Set the user interface layout for this Activity
    // The layout file is defined in the project res/layout/main_activity.xml file
    setContentView(R.layout.main_activity);
    
    // Initialize member TextView so we can manipulate it later
    mTextView = (TextView) findViewById(R.id.text_message);
    
    // Make sure we're running on Honeycomb or higher to use ActionBar APIs
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        // For the main activity, make sure the app icon in the action bar
        // does not behave as a button
        ActionBar actionBar = getActionBar();
        actionBar.setHomeButtonEnabled(false);
    }
}


Caution: 用SDK_INT以兼容Android2.0一下的版本,否则会出现运行时异常

技术上说,onStart()函数之后,界面可见,但onResume()函数调用紧随其后,所以看不出来

如下几种情况可以使activity脱离resumed状态:

1.来电话

2.用户转向另一个activity

3.屏幕被关掉

以后再说onStart()和onResume()函数何时使用,他们也是很有用的,特别对于经常从Paused和Stopped状态转换为Resumed状态的activity

Note: onCreate()的参数savedInstanceState后面再说

Destroy一个Activity


当app被完全移出内存之前,最后调用onDestroy()函数

大多数app不需要实现,因为大多清理工作会在onPause()和onStop()函数中做,然而,若果activity有后台线程或者其他不正确关闭会产生内存泄露的资源,要在onDestroy()函数中处理他们

@Override
public void onDestroy() {
    super.onDestroy();  // Always call the superclass
    
    // Stop method tracing that the activity started during onCreate()
    android.os.Debug.stopMethodTracing();
}


Note: 系统总是在onPause()和onStop()之后调用onDestroy(),但一种情况除外,就是在onCreate()中调用finish()之后,直接调用onDestroy()并且不调用任何其他周期函数

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值