Activity

1. activity的描述

(1) An activity provides the window in which the app draws its UI
(2) one activity implements one screen in an app (Activity 表示应用中的一个屏幕)

2. 启动activity

(1) 显式:直接指定类名

private void showDeliveryReport(long messageId, String type) {
  Intent intent = new Intent(this, DeliveryReportActivity.class);
  intent.putExtra("message_id", messageId);
  intent.putExtra("message_type", type);

  startActivity(intent);
}

(2)隐式:通过action

public static void capturePicture(Activity activity, int requestCode) {
  Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
  intent.putExtra(MediaStore.EXTRA_OUTPUT, TempFileProvider.SCRAP_CONTENT_URI);
  activity.startActivityForResult(intent, requestCode);
}

参考:Intent 和 Intent 过滤器

3. configChanges

android:configChanges="orientation|screenSize"

如果不添加上面两个配置项,在屏幕横竖屏切换时,会执行完整的界面destory过程,再重新创建

onPause
onStop
onDestroy

onCreate

4.启动模式

(1) standard

每次启动都会启动一个新的页面

(2) singleTop(顶端只有一个)
  • 如果在任务栈的栈顶已经存在该activity,那么再次启动该activity,不会新创建该activity,而是会调用该activity的onPause和onNewIntent方法,复用栈顶的这个activity。

  • 如果已经存在的activity不在任务栈的栈顶,则会新建一个

(3) singleTask(整个task只有一个)
  • 如果在任务栈的栈顶已经存在该activity,那么再次启动该activity,不会新创建该activity,而是会调用该activity的onPause和onNewIntent方法,复用栈顶的这个activity。

  • 如果已经存在的activity不在任务栈的栈顶,
    在它之上的所有activity被销毁:
    onPause
    onStop
    onDestory

  • 它自己被推到栈顶:
    onNewIntent
    onRestart
    onStart

(4) singleInstance(整个系统只有一个)
  • 首次启动它时,会新建一个任务栈,并且这个任务栈只有它一个Activity。

  • 再次启动它时,会复用之前启动的activity。
    如果直接在该activity上再启动该activity,会执行下面方法

onPause
onNewIntent

如果别的activity在最上面,然后启动它,会执行下面方法

onNewIntent
onRestart
onStart
  • 通过adb shell dumpsys activity activities打印任务栈
    启动MainActivity后,堆栈情况:
Task id #16978
     * Hist #0: ActivityRecord{45f06ce u0 com.test.demo/.MainActivity t16978}

在MainActivity上面,启动TestActivity

Task id #16979
    * Hist #0: ActivityRecord{32dc763 u0 com.test.demo/.TestActivity t16979}

Task id #16978
    * Hist #0: ActivityRecord{45f06ce u0 com.test.demo/.MainActivity t16978}

5.intent-filter


  
                     //1.action
       //2.category
                  //3.data
  

(1) action

必须参数

(2) category

如果acitivty需要通过隐式调用调起的话,一定需要设置
Note: In order to receive implicit intents, you must include the CATEGORY_DEFAULT category in the intent filter. The methods startActivity() and startActivityForResult() treat all intents as if they declared the CATEGORY_DEFAULT category. If you do not declare it in your intent filter, no implicit intents will resolve to your activity.

(3) data

非必须参数

你可能感兴趣的:(Activity)