《Android第一行代码》first reading 三

活动的生命周期

当你深入理解活动的生命周期之后,就可以写出更加连贯流畅的程序,并在如何合理管理应用资源方面发挥的游刃有余。

返回栈

首先它是一个栈(后进先出)。
Android中的活动是可以层叠的,每一个新建的活动都会覆盖在上一个活动上。销毁只会销毁最上层的活动。

活动状态

每个活动在其生命周期中最多会有4种状态

  1. 运行状态 当一个活动位于返回栈的栈顶
  2. 暂停状态 当一个活动不再位于栈顶,但仍然可见。
  3. 停止状态 当一个活动不再位于位于栈顶,并不可见。
  4. 销毁状态 当一个活动从返回栈中移除就变成了销毁状态。
活动的生命周期
《Android第一行代码》first reading 三_第1张图片
Android Developers上的图片.png
完整生存期:

活动在onCreate()和onDestory()之间所经历的。一般情况下,一个活动会在onCreate()方法中完成各种初始化操作,在onDestory()中完成释放内存的操作。
onCreate() 每个活动都重写了这个方法,它会在活动第一次被创建时调用。你应该在这个方法中完成活动的初始化操作。
onDestory() 这个方法在活动被销毁时调用,调用后活动变为销毁状态。

可见生存期

活动在onStart()和onStop()之间所经历的。在可见生存期内,活动对于用户中是可见的,即便有可能无法与用户进行交互。我们可以通过这两个方法合理地管理那些对用户可见的资源。比如在onStart()中对资源进行加载,在onStop() 中对资源进行释放。
onStart() 这个方法在活动由不可见变为可见时调用
onStop() 这个方法在活动由可见变为不可见时调用

前台生存期

活动在onResume()到onPause()之间所经历的。在前台生存期内,活动总是处于运行状态的,此时的活动是可以和用户进行交互的,我们平时看到和接触最多的也就是这个状态下的活动。
onResume() 这个方法在系统准备好和用户进行交互时调用。此时的活动已定位于返回栈的栈顶,并处于运行状态。
onPause() 这个方法在系统准备去启动或恢复另一个活动的时候调用。我们通常会在这个方法中将一些消耗CPU的资源释放掉,以及保存一些关键数据,但这个方法的执行速度一定要快,不然会影响到新的栈顶活动的调用。

活动的启动模式

在AndroidManifest.xml中设置其标签中的launchMode属性


活动的启动模式有四:

  • standard 默认的模式就是此模式。在此模式下,活动的创建并不会做什么检查,活动会重新创建一个。
  • singleTop 在此模式下,活动创建时会检测返回栈顶部是否为该活动,如果是的就不会再重新创建。但是如果该活动并不存在于返回栈顶部,则依然会再次创建。
  • singleTask 在此模式下,活动创建前会遍历返回栈,如果返回栈中存在该活动就不会再创建新的。
  • singleInstance 在此模式下,活动在创建之前会先创建一个额外的返回栈,然后再在该额外的返回栈中创建活动。销毁时,会先销毁默认的返回栈的活动并销毁该返回栈,再销毁额外的返回栈和其活动。

几个活动使用的技巧

知晓当前是在哪一个活动中

先写一个BaseActivity 基类继承AppCompatActivity,并在此类中重写onCreate()方法:

public class BaseActivity extends AppCompatActivity{
    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(saveInstanceState);
        Log.d("BaseActivity",getClass().getSimpleName());
    }
}

我们在写其他活动时都继承此基类。当我们进入某个活动时,就会在logcat中输出相应的活动。

随时随地退出活动

新建一个ActivityCollector类作为活动管理器,来对所有的活动进行管理。

public class ActivityCollector{
    public static List activities = new ArrayList<>();
    
    public static void addActivity(Activity){
        activitise.add(activity);
    }

    public static void removeActivity(Activity activity){
        activities.remove(activity);
    }

    public static void finishAll(){
        for(Activity activity : activities){
            if(!activity.isFinishing()){
                activity.finish();
            }
        }
    }
}

然后在BaseActivity中修改:

public class BaseActivity extends AppCompatActivity{
    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(saveInstanceState);
        Log.d("BaseActivity",getClass().getSimpleName());
        ActivityCollector.addActivity(this);
    }

    @Override
    protected void onDestroy(){
        super.onDestroy();
        ActivityCollector.removeActivity(this);
    }
}

之后,如果想退出程序只要调用ActivityCollector.finishAll();
当然还可以在销毁所有活动的代码后面再加上杀掉当前进程的代码,以保证程序完全退出,杀掉进程的代码如下:
android.os.Process.killProcess(android.os.Process.myPid());
killPeocess()方法用于杀掉一个进程,它接收一个进程的id参数,我们可以通过myPid()方法来获得当前程序的进程id。需要注意的是,killProcess()方法只能用于杀掉当前程序的进程,我们不能使用这个方法去杀掉其他程序。

启动活动的最佳写法
public class SecondActivity extends BaseActivity {
    public static void actionStart(Context context , String data1 , String data2){
        Intent intent = new Intent(context , SecondActivity.class);
        intent.putExtra("param1",data1);
        intent.putExtra("param2",data2);
        context.startActivity(intent);
    }
}

我们在SecondActivity 中添加了一个actionStart()方法,在这个方法中完成了Intent的构建,另外所有SecondActivity 中需要的数据都是通过actionStart()方法的参数传递。
SecondActivity.actionStart(FirstActivity.this , "data1" , "data2");

你可能感兴趣的:(《Android第一行代码》first reading 三)