Android Activity

Activity是一个应用程序组件,提供用户与程序交互的界面。

 

Android 4大组件:
1. Activity  2. Service  3. BroadcastReceiver  4. Content Provider

 

Activity使用:

1.继承 Android 的 Activity类 ;

2. 重写 onCreate() 方法;

3.调用 setContentView() 方法 设置显示布局;

4.在 AndroiMainfest 文件中,注册 Activity

 

Activity的生命周期

从创建到销毁的过程

onCreate();  创建

onStart();  运行

onResume();  获取焦点

onPause();  失去焦点

onStop();  暂停

onDestroy();  销毁

onRestart();  

 

Activity的四种状态:

活动状态:(Activity/Runing)Activity处于界面最顶端,获取焦点

暂停状态:(Paused)Activity失去焦点,但对用户可见

停止状态:(Stopped)Activity被完全遮挡,但保留所有状态和成员信息

非活动状态:(Killed)Activity被停止

 

Activity从创建到销毁的生命周期:

onCreate() --> onStart --> onResume() --> onPause() --> onStop() --> onDestroy()

 

Activity从启动到后台,再到前台的生命周期:

onCreate() --> onStart --> onResume() --> onPause() --> onStop() --> onRestart() --> onStart() --> onResume()

 

Activity从启动到失去焦点,再到获取到焦点的生命周期:

onCreate() --> onStart --> onResume() --> onPause() --> onResume()

 

返回栈

Android使用任务(Task)来管理活动,一个任务就是一组存放在栈里的活动的集合,这也被称为返回栈(Back Stack)。

栈是这一种先入后出的数据结构,在默认情况下,每当启动了一个新的活动,它就会在返回栈中入栈,并处于栈顶的位置。而每次按下Back键或调用finish()方法去销毁一个活动时,处于栈顶的活动就会出栈,前一个入栈的活动就会重新处于栈顶的位置。系统总是会显示处于栈顶的活动给用户。

 

活动被回收了怎么办

用户A在活动A的基础上启动了活动B,活动A进入了停止状态,这个时候由于系统内存不足,将活动A回收掉了,然后用户按Back键返回活动A,此时会执行活动A的onCreate()方法,重新创建一次活动A。如果活动A中存在临时数据和状态需要保留,Activity提供了一个onSaveInstanceState()回调方法,这个方法保证在活动被回收之前一定会被调用,来解决活动被回收时临时数据得不到保存的问题。

onSaveInstanceState()方法携带一个Bundle类型的参数,Bundle提供了一系列的方法用于保存数据,比如可以使用putString()方法保存字符串,使用putInt()方法保存整型数据。每个保存方法需要传入两个参数:第一个是键,用于后面从Bundle取值,第二个是真正要保存的内容。

如果之前有做数据保存的话,取出数据在onCreate()中调用所保存对象的saveInstanceState.getString(key)方法。

 

活动的启动模式

活动的启动模式有四种:standard、singleTop、singleTask、singleInstance,在AndroidManifest.xml中通过给<activity>标签指定android:launchMode属性来选择启动模式。

1、standard

默认的启动模式,每次启动都会创建该活动的一个新的实例。

2、singleTop

启动活动时,如发现返回栈栈顶已经是该活动,则直接使用它,不再创建新的活动实例。

不过当要启动的活动并未处于栈顶位置时,这使再启动该活动,还是会创建新的实例。

3、singleTask

当活动的启动模式指定为singleTask,每次启动活动时系统首先会在返回栈中检查是否存在该活动的实例,并把在这个活动之上的所有活动统统出栈,如果没有发现就会创建一个新的活动实例。

4、singleInstance

指定为singelInstance的活动会启用一个新的返回栈来管理这个活动,不管哪个应用程序来访问这个活动,都共用一个返回栈,解决了共享活动实例的问题。

在按Back键时,直到所有的栈都已退出,才会退出程序。

 

知晓当前对应的活动

getClass().getSimpleName()

 

随时退出程序

用一个专门的集合类对所有的活动进行管理

新建一个ActivityCollector类作为活动管理器:

public class ActivityCollector{

  public static List<Activity> activities = new ArrayList<>();

  public static void addActivity(Activity activity){

    activities.add(acitvity);

  }

  public static void removeActivity(){

    activities.remove(activity);

  }

  public static void finishAll(){

    for (Activity activity : activities){

      if (!acitvity.isFinishing()){

        activity.finish();

      }

    }

  }

}

在活动管理器中,通过一个list来暂存活动,然后提供一个addActivity()方法用于向List中添加一个活动,提供一个moveAcitvity()方法用于从List移除一个活动,最后提供一个finishAll()方法将List中存储的活动全部销毁。

BaseActivity:

public class BaseActivity extends AppcompatActivity {

  @override

  protected void onCreate(Bundle saveInstanceState) {

    super.onCreate(saveInstanceState);

    Log.d("BaseActivity", getClass().getSimpleName());

    ActivityCollector.addActivity(this);

  }

  @override

  protected void onDestory(){

    super.onDestory();

    ActivityCollectory.removeAcitvity(this);

  }

}

 

以后,不管想在什么地方退出程序,只需调用ActivityCollector.finishAll()方法就可以了。

还可以在销毁所有活动的代码后面加上杀掉当前进程的代码,以保证程序完全退出:

android.os.Process.killProcess(android.os.Process.myPid());

其中,killPrecess()方法用于杀掉一个进程,它接收一个进程id参数,可以通过myPid()方法来获得当前的进程id。

 

posted @ 2017-04-07 13:31  sinpi  阅读(190)  评论(0)    收藏  举报