记android学习之路----Activity(3)

Activity生命周期

activity的状态

1:activity的状态:
 1:运行状态:当activity处于屏幕可见状态,并且可以响应用户的操作;此时处于运行状态
 2:暂停状态:当activity处于屏幕可见状态,但是不能响应用户的操作,比如在当前activity上面弹出一个对话框;此时的acti就处于这个状态;
 3:停止状态:当activity处于完全不可见,但是该应用并未关闭,此时处于停止状态;
 4:销毁状态:当内存不够,或者调用了finish()方法的时候就会销毁该activity,之后该activity将会处于销毁状态;
2:Activity有独立的生命周期;在不同的生命周期会调用不同的函数;


Activity在生命周期不同阶段调用的函数

onCreat():
一个Activity在第一次启动的时候会调用该方法创建Activity;
一般多在该方法中实现对界面的初始化操作;
在一个生命周期里面该方法只会执行一次;

onStart():
在一个新的生命周期里执行完onCreat()方法之后就会执行该方法;
执行完该方法Activity将会启动;

onResume():
onStart()方法执行完成之后将会执行该方法;
该方法执行完成之后Activity将会获取到用户的焦点;对用户可见,可以响应用户的操作;
也就是在屏幕上看到的activity的状态;

onPause():
当前Activity上弹出弹窗之后将会调用该方法,此时Activity将会失去焦点,对用户可见,但是不能操作;
当弹窗响应完成之后竟会再次调用onResume()方法重新获取焦点;

onStop():
当该应用被挂起到后台的时候Activity将会调用onStop()方法;
执行完该方法之后该Activity将会隐藏在后台,
对用户不可见,用户也无法操作;更不会响应用户的操作
当该页面被从新加载至页面顶端的时候又会依次调用onReStart()和onResume();

onDestory():
当一个应用彻底被终止的时候将会调用该方法;一般会在该方法中处理释放资源的操作

上述方法中onCreat()是必须要重写的,其他方法可根据需要选择性重写;

activity生命周期图

这里写图片描述


系统对activity的管理:

  1:系统是通过栈来管理activity的;
  2:新启动的activity将会被添加至栈顶,此时处于运行状态,具备运行状态的特征;之前处于栈顶的activity将会被压入第二层;
  3:按下返回键之后当前处于栈顶的activity就会被弹出栈,第二层的activity上浮至第一层,将会在屏幕显示;
  4:activity栈中处于第二层及以下的activity对象在内存不足的时候都有可能被回收;越处于栈底的activity对象越有可能被回收;
  管理模型如下:
这里写图片描述


activity的启动:

  启动方式:startActivity()/startActivityForResult();

  启动模式:有四种分别是:standard,singleTop,singleTask,singleInstance;

  模式详解:
    standard:标准默认的启动模式:
     这种启动模式将无视Activity实例在栈中的存在,只要启动一次activity就会将创建该activity的实例并添加进栈中,并处于栈顶;

    singleTop:
     1:当activity的实例已经存在,并且处于栈顶的时候,则再次启动该activity的时候并不会重新创建该activity的实例,而是直接调用已存在的activity;
     2:当activity实例存在但是并未处于栈顶或者不存在的时候,则会重新创建activity的实例;并将其放置于栈顶;

    singleTask:
     当栈中已经存在该activity的实例,则再次启动该activity的时候会先检查在栈中是否存在指定activity的实例;若存在将不会重新创建;而是直接将该activity以上的其他activity出栈将指定activity置于栈顶;

    singleInstance:
     使用该方式启动的时候会为该activity创建一个单独的栈,该栈可以实现不同应用对该activity的共享;那么其他三种为什么不可以呢?原因在于:每一个应用程序都会有自己的返回栈,同一个activity在不同的返回栈中必然会创建新的实例,自然就无法获取到指定的activity实例;但是在singleInstance模式下该activity会有自己独立的栈来管理,不同的应用访问的时候始终访问的是同一个返回栈的activity实例;

  模式设置:
   在AndroidManifest.xml中通过给activity标签添加android:launchMode=”指定模式”属性来设置activity的启动方式;
   
  对四种启动模式的测试:
   1:标准启动模式:
   测试目的:测试多次启动同一个activity是否会创建多个该activity的实例;
   测试原理:
   这里写图片描述
   测试代码:
   因为standard是默认的启动模式,所以不必在AndroidManifest.xml注明启动模式;
   MainActivity:
    main_layout.xml   

<?xml version="1.0" encoding="utf-8"?>
<manifest package="com.example.lk.activityforstudy"
          xmlns:android="http://schemas.android.com/apk/res/android">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
        <activity
            android:name=".TwoActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.TwoActivity"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>
    </application>

</manifest>

 MainActivity.java:

package com.example.lk.activityforstudy;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity {
    Button button;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_layout);

        button = (Button) findViewById(R.id.button);
        //点击button2之后将会启动一个新的activity
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //通过该按钮启动TwoActivity
                Intent intent = new Intent(MainActivity.this, TwoActivity.class);
                startActivity(intent);
            }
        });
    }
}

TwoActivity
two_layout.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:weightSum="1"
              android:orientation="vertical">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="继续启动TwoActivity"
        android:id="@+id/button2"
        android:layout_gravity="bottom"/>

    <TextView
        android:layout_width="377dp"
        android:layout_height="300dp"
        android:text="这是TwoActivity"
        android:textSize="60dp"
        android:id="@+id/textView"
        />
</LinearLayout>

 TwoActivity.java:

package com.example.lk.activityforstudy;

import android.app.Activity;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;


public class TwoActivity extends Activity{
    Button button2;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.two_layout);
        //每启动一个activity都去打印一下该对象的基本信息
        Log.i("TwoActivity", this.toString());

        //初始化button2
        button2 = (Button) findViewById(R.id.button2);
        System.out.print(button2);

        //点击button2之后将会启动一个新的activity
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(TwoActivity.this,TwoActivity.class);
                startActivity(intent);
            }
        });
    }

}

OK别忘了在AndroidManifest.xml中注册这两个Activity;
那么在点击启动TwoActivity的按钮之后将会发现以下现象:
这里写图片描述 

2:SingleTop启动模式:
   测试目的:测试多次启动同一个activity是否会创建多个该activity的实例,以及在启动指定activity之后再启动别的activity,之后再启动指定activity查看是否会创建该activity的实例;
   测试原理:
   第一条测试
这里写图片描述
第二条测试
这里写图片描述
   准备完毕,撸起袖管开干:
   首先测试第一种情况
   测试代码:
   和上述代码组织结构一致,只需要在AndroidManifest.xml中将TwoActivity的launchMode设置为SingleTop的启动模式;
   结果如下:
   这里写图片描述
   
   再测试第二种情况:
   测试代码:
   1:首先创建三个Activity;在上述代码的基础上再创建一个ThreeActivity;具体代码和上面一至;不同点在于ThreeActivity中启动TwoActivity;
    2:TwoActivity中启动目标改为ThreeActivity;
   3:接着在AndroidManifest.xml中将TwoActivity的launchMode设置为SingleTop的启动模式;

   结果如下:
   这里写图片描述
   和上面的预期结果一致,结论就不重复了!
   
3:SingleTask启动模式:
   测试目的:通过MainActivity启动TwoActivity,接着启动ThreeActivity,再启动MainActivity,从MainActivity中启动TwoActivity是否会创建新的实例,以及ThreeActivity是否会被移除;
   测试原理:
   这里写图片描述
   测试代码:
    1:和SingleTop第二条测试代码完全一样,只是需要在AndroidManifest.xml中将TwoActivity的launchMode设置为SingleTask的启动模式即可,在ThreeActivity中改成启动MainActivity;
     2:另外还需要在ThreeActivity中重写onDestory()方法,来监测ThreeActivity是否被从栈中移除!     

    protected void onDestory(){
        super.onDestroy();
        Log.i("ThreeActivity","ThreeActivity被从栈中弹出!!");
    }

   测试结果:
这里写图片描述
结果发现ThreeActivity的实例只创建了一次;充分说明SingleTask启动模式的特征;

4:SingleInstance:
   测试目的:通过MainActivity启动TwoActivity,接着启动ThreeActivity,查看activity栈的id是否发生变化;
   测试原理:
   如果以SingleInstance方式启动一个activity,那么该activity将会单独启动一个栈,也就是说启动该activity之后打印该activity的栈id;该栈id和其他activity所在的栈id不同;
   这里写图片描述
   测试代码:
   和上述代码一致;主要做以下这几个调整:
   1:启动顺序调整为MainActivity启动TwoActivity,从TwoActivity启动ThreeActivity;
   2:在每个activity的onCreat()中通过getTaskId()打印栈所在的id;
   测试结果:
这里写图片描述
很明显TwoActivity中在单独的一个栈里面!

至此,activity的四种启动模式已经测试完毕,所测结果也很明显,在实际中应该根据需要选择合适的启动模式!


activity的销毁:

  销毁方式:
    1:调用finish()方法看可以销毁,
    2:在系统内存严重不足的时候会主动销毁未处于栈顶的activity;
  
  销毁后activity的状态:
    在activi被销毁后,activity页面上的任何内容都不会得到保存;下次启动,将会再按照activity的生命周期流程进行新一轮加载;
  
  activity销毁后页面数据的保存;
    在activity的onCreat(Bundle savedInstanceState)方法中有一个bundle参数,通过这个参数即可在activity创建的时候恢复被销毁之前的数据;
    具体方法如下:

            public void onSaveInstanceState(Bundle outState){
                super.onSaveInstanceState(outState);
                String temp_data = "temp_data";
                outState.putString("data_key",temp_data);
            }

            public void onCreat(Bundle savedInstanceState){
                if(savedInstanceState != null){
                    String temp_data = savedInstanceState.getString("data_key");
                }
            }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值