Android艺术探究二次学习笔记

1.引言

android基本功不扎实,二刷艺术探究,记录下学习过程中在我看来很重的知识点笔记

2.正题

2.1 Activity 异常重启生命周期

程序异常崩溃,重启的生命周期:onCreate, onStart ,OnResum ,OnPause,OnSaveInstanceState ,Onstop ,onDestroy ,OnCreate,OnStart,onRestroeInstanceState,OnResume

OnSaveInstanceState 方法的调用是在onPause 或者onStop 之前调用。

崩溃重启的时候,OnSaveInstanceState 会在onStart 和onResum 之间调用。

改变系统Configuration,会导致Activity的重启,会回调onConfigurationChanged方法,通过在xml中配置 android:configChanges="" 可以避免Activity的重启

2.2 Activity 启动过程

  • activity.startActivity
  • activity.startActivityForResult
  • Instrumentation.execStartActivity
  • AMS.startActivity
  • ApplicationThreadProxy.scheduleLaunchActivity
  • ActivityThread.handleLaunchActivity
    ApplicationThread 是ActivityThread 的内部类,是framwork层 与app应用层的桥梁。App 与AMS通信 会携带一个ApplicationProxy 传入到AMS,AMS初始化完毕之后,又会通过ApplicationProxy回调scheduleLaunchActivty,进而执行ActivityThread的handleLaunchActivity 方法。ApplicationProxy 再继续调用scheduleStartActivity,进一步调用ActivityThread.handleStartActivity

2.3 Activity启动模式 和标志位

Context 家族:

Android艺术探究二次学习笔记_第1张图片
image.png

问题:为什么只能用activity 启动界面,而不能用application去启动界面?

答案:界面A 启动界面B,B存在于A所在的栈中。而Application 启动因为没有栈所以报错,为了能启动,可以添加一个Flag

singTop:当栈顶存在当前的Activity,此界面不会重新创建。会回调onNewIntent().假如当前栈顶不存在此Activity,将会走正常的创建过程,但是不会走onNewIntent()

singTask:当启动一个singleTask 标记的Activity的时候,先检查此Activity 是否存在于栈中,假如存在会回调onNewIntent() 。假如不存在将会创建一个栈,将此Activity 压入栈中。

应用A,启动应用B 中用singTask 修饰的Activity。启动完毕之后。B中 singTask修饰的Activity 单独的放进一个栈。那么当再次启动应用B时,打开的第一个界面就是此Activity。

应用A,启动应用B 中用stanard 修饰的Activity。这个Activity中将被放进应用A 的栈中。再次启动应用B。B应用如正常启动打开第一个界面是MainActivity 而不是我们启动的那个


android:excludeFromRecents="true" 可以让此界面,不在多任务列表中显示。所谓的多任务列表就是这个状态:

Android艺术探究二次学习笔记_第2张图片
image.png

设置了这个属性之后,就无法在多任务背景下,看到这个界面


TaskAffinity叫做归属,可以把它理解成把Activity分组的意思,它会把TaskAffinity value值相同的Activity 划分到同一个任务栈

2.4 action, category data 理解

action:标志当前Activity,在隐式启动Activity过程中,通过设置Action 就可以启动某个Activity。某种意义上说action 是Activity的唯一标志。例如下面代码

Intent intent = new Intent(Intent.ACTION_CALL);
Uri data = Uri.parse("tel:"+phoneNumber);
intent.setData(data);
startActivity(intent);

Intent.ACTION_CALL 是打电话界面的Action,设置了这个action之后,intent就会跳转到打电话界面

category:英文意思是种类,描述启动Activity的环境。有以下几个环境

Android艺术探究二次学习笔记_第3张图片

data:假如一个Activity的 intentFilter中定义了data,那么隐式启动的时候就必须要给Intent设置data。例如上面的调用通话界面。data数据有俩部分组成mimeTypeUri。 mimeType 包括image/jpeg/video/audio

Uri由:scheme://host:port/path 组成

例如:content://sms/outbox 发送箱中的短信URI

你可能感兴趣的:(Android艺术探究二次学习笔记)