Activity

一 什么是Activity?

activity是android四大组件之一,它供给屏幕进行交互。每个activity都会取得一个用于制作其他界面的窗口。

一个运用一般由一个或多个activity组成,一般会指定一个activity作为主界面,activity有自己的什么周期,不同的状况会调用不同的生命周期办法。

二 Activity的生命周期?

  1. onCreate():表明Activity 正在被创立,每个activity中咱们都重写了这个办法,它会在活动第一次被创立的时分调用。在这个办法中咱们能够完结活动的初始化操作,比如说加载布局、绑定事情等
  2. onRestart():表明Activity 正在重新发动。一般状况下,当当时Activity 从不行见变为可见时,onRestart 会被调用。这种情形一般是用户行为所导致的,比如用户按 Home 键切换到桌面或许用户打开了一个新的 Activity,此刻当时的Activity 就会暂停,即onPause 和 onStop 被调用,接着用户重新回到了这个Activity,此刻onRestart 就会被调用
  3. onStart():表明Activity 正在被发动,行将开始,此刻Activity 现已可见了,但还没有出现在前台,即还无法与用户进行交互。能够理解为Activity 现已显现出来了,但是咱们还看不到
  4. onResume():表明Activity 现已可见了,而且出现在前台并开始活动,此刻能够与用户进行交互。此刻的活动一定坐落回来栈的栈顶,而且处于运转状况
  5. onPause():表明Activity 正在中止,正常状况下onStop 会紧接着被调用。这个办法在体系准备去发动或许恢复另一个活动的时分调用。咱们一般会在这个办法中将一些耗费CPU的资源释放掉(比如动画),以及保存一些关键数据,但不能太耗时,不然会影响到新的栈顶活动的运用,onPause 有必要先履行完,新 Activity 的onResume 才会履行
  6. onStop():表明Activity行将中止,在活动完全不行见的时分调用。它和onPause()办法的首要差异在于,假如发动的新活动是一个对话框式的活动,那么onPause()办法会得到履行,而onStop()办法并不会履行,能够做一些略微重量级的收回作业,同样不能太耗时。
  7. onDestory():表明Activity 行将被毁掉,这个办法在活动被毁掉之前调用,之后活动的状况将变为毁掉状况,这是Activity 生命周期中的最终一个回调,在这里咱们能够做一些收回作业和终究的资源释放

2.1onStart 和 onResume、onPause 和onStop 从描绘上来看差不多,对咱们来说有什么实质上的不同?

这两个配对的回调分别表明不同的含义,onStart 和onStop 是从Activity 是否可见的角度来回调的,而onResume和 onPause 是从Activity 是否坐落前台这个角度来回调的,除了这种差异,在实际运用中没有其他显着的差异

2.2onSaveInstanceState 和 onRestoreInstanceState 的效果

Activity的 onSaveInstanceState() 和 onRestoreInstanceState()并不是生命周期办法,它们不同于 onCreate()、onPause()等生命周期办法,它们并不一定会被触发。当运用遇到意外状况(如:内存不足、用户直接按Home键)由体系毁掉一个Activity时,onSaveInstanceState() 会被调用。

一般onSaveInstanceState()只适合用于保存一些临时性的状况,而onPause()适合用于数据的持久化保存.

2.3 onSaveInstanceState() 什么时分调用?

(1)、当用户按下HOME键时。 这是清楚明了的,体系不知道你按下HOME后要运转多少其他的程序,天然也不知道activity 是否会被毁掉,因而体系会调用onSaveInstanceState(),让用户有时机保存某些非永久性的数据。以下几种状况的剖析都遵从该原则

(2)、长按HOME键,挑选运转其他的程序时。

(3)、按下电源按键(关闭屏幕显现)时。

(4)、从activity A中发动一个新的activity时。

(5)、屏幕方向切换时,例如从竖屏切换到横屏时。

(6)、引发activity毁掉和重建的其它状况,除了体系处于内存不足的原因会炸毁activity之外, 某些体系设置的改动也会导致activity的炸毁和重建. 例如改动屏幕方向, 改动设备言语设定, 键盘弹出等

三一个ActivityA跳转到ActivityB,然后ActivityB在回来到ActivityA,这个进程两个Activity的生命周期是什么样的?

默许发动办法下:

在A跳转B会履行:A onPause -> B onCreate -> B onStart -> B onResume->A onStop

在B按下回来键会履行:B onPause -> A onRestart -> A onStart -> A onResume-> B onStop -> B onDestroy

当 B Activity 的 launchMode 为 singleInstance,singleTask 且对应的 B Activity 有可复用的实例时:

A.onPause -> B.onNewIntent -> B.onRestart -> B.onStart -> B.onResume -> A.onStop -> ( 假如 A 被移出栈的话还有一个 A.onDestory)

当 B Activity 的 launchMode 为 singleTop且 B Activity 现已在栈顶时(一些特殊状况如通知栏点击、连点),此刻只需 B 页面自己有生命周期改变:B.onPause -> B.onNewIntent -> B.onResume

四Activity在横竖屏切换时分的生命周期是怎样的?

1、不设置Activity的configChanges特色,或设置configChanges=”orientation”,或设置configChanges=”orientation|keyboardHidden”,切屏会重新调用各个生命周期,切横屏时会履行一次,切竖屏时会履行一次。

2、装备 android:configChanges=”orientation|keyboardHidden|screenSize”,才不会毁掉 activity,且只调用 onConfigurationChanged办法。

竖屏:发动:onCreat->onStart->onResume.

切换横屏时:onPause-> onSaveInstanceState ->onStop->onDestoryonCreat->onStart->onSaveInstanceState->onResume.

假如装备这个特色:androidconfigChanges=”orientation|keyboardHidden|screenSize”就不会在调用Activity的生命周期,只会调用onConfigurationChanged办法

五 Activity的发动办法和运用场景

  • Standard:默许办法,每次发动Activity都会创立一个新的Activity实例
  • SingleTop:通知音讯打开的页面,假如要发动的Activity现已在栈顶,则不会重新创立Activity,只会调用该该Activity的onNewIntent()办法,假如要发动的Activity不在栈顶,则会重新创立该Activity的实例,能够有用减少activity重复创立对资源的耗费
  • SingleTask:假如要发动的Activity现已存在于它想要归属的栈中,那么不会创立该Activity实例,将栈中坐落该Activity上的一切的Activity出栈,一同该Activity的onNewIntent()办法会被调用
  • SingleInstance:创立在一个新栈,然后创立该Activity实例并压入新栈中,新栈中只会存在这一个Activity实例,整个手机操作体系里边只需一个实例存在便是内存单例,一般用于其他运用发动当时运用中的activity,能够确保其他运用和自己自身运用发动此activity都是同一实例

留意:

singleTask的使命栈指定特色android:taskAffinity特色

六谈谈你对Activity中onNewIntent()办法的知道?

在singleTop、singleTask、singleInstance 中假如在运用内存在Activity实例,而且再次发生startActivity(Intent intent)回到Activity后,由于并不是重新创立Activity而是复用栈中的实例,因而Activity再获取焦点后并没调用onCreate、onStart,而是直接调用了onNewIntent(Intent intent)函数

onNewIntent的效果:当调用到onNewIntent(intent)的时分,需求在onNewIntent() 中运用setIntent(intent)赋值给Activity的Intent.不然,后续的getIntent()都是得到老的Intent

七什么状况下Activity会独自履行onPause?

当 Activity 被另一个通明或许 Dialog 款式的 Activity 掩盖时的状况。此刻它依然与窗口管理器坚持连接,体系持续维护其内部状况,所以它仍然可见,但它现已失去了焦点故不行与用户交互,所以被掩盖的Activity并不会履行onStop()办法

八Activity之间如何通讯 & Activity和Fragment之间通讯 & Activity和Service之间通讯?

1、Activity向Fragment传递数据?

  • 在Activity中创立Bundle,将数据以putString(key,value)办法放入bundle中,最终经过setArguments(bundle)办法,将其关联,在Fragment与Activity依靠的Fragment中直接经过getArguments().getString()来获取。
  • 直接经过强转将其强转为Activity,即调用Fragment所依靠的Activity中的办法

2、Fragment将数据传递给Activity?

接口回调:

(1)、在fragment界说一个内部回调接口,再让包括这个Fragment的Activity完结这个回调接口,fragment就能够调用这个接口中的办法,将数据传递给Activity。

(2)Activity完结完接口后,又怎样把数据传递给Fragment,运用Fragment刚增加到Activity时的时分调用的生命周期办法的onAttch()办法,咱们就在该办法中检查相应的Activity是否完结了Fragment傍边界说的内部接口。便是对它进行了类型转换,然后赋值给咱们Fragment中界说的接口

(3)、当一个Fragment从Activity傍边剥离时,就会走到生命周期的onDetach()办法,在此要将传递进来的Activity目标释放掉,不然会影响Acitvity毁掉,产生内存走漏。

3、Activity与Service数据通讯?

1、绑定服务,运用ServiceConnection类,一同让Activity完结该类,重写该类中的两个办法,即绑定成功()和绑定失利()。

  • 让咱们的ServiceActivity去完结ServiceConnection接口,完结接口之后,重写onServiceConnected()和onServiceDisconnected()两个办法。
  • 首要咱们要创立好一个Binder目标,接下来在OnServiceConnected傍边获取到该Binder目标。最终运用Binder傍边setData()办法来向Service传递数据。

2、简单通讯,运用Intent进行传值(Intent组件在activity之间、activity与fragment之间数据通讯都会用到),该办法简单,但是也只能传递较简单的数据。

3、运用callback接口,将Handler来监听服务中的进程的改变(会有子线程到主线程的切换,因而用到了Handler)。

九Activity常用的符号位Flags?

  • FLAG_ACTIVITY_NEW_TASK:这个符号位的效果是为Activity指定”singleTask”发动办法,其效果和在XML中指定该发动办法相同
  • FLAG_ACTIVITY_SINGLE_TOP:这个符号位的效果是为Activity指定”singleTop”发动办法,其效果和在XML中指定该发动办法相同
  • FLAG_ACTIVITY_CLEAR_TOP:具有此符号位的Activity,当它发动时,在同一个使命栈中一切坐落它上面的Activity都要出栈,这个符号位一般会和singleTask发动办法一同出现。在这种状况下,被发动Activity的实例假如现已存在,那么体系就会调用它的onNewIntent。假如被发动的Activity选用standrad发动办法,那么它连同它之上的Activity都要出栈,体系会创立新的Activity实例并放入栈顶,singleTask发动办法默许就具有此符号位的效果
  • FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:具有这个符号的Activity不会出现在历史Activity的列表中

十Activity之间传递数据的办法Intent是否有巨细约束,假如传递的数据量偏大,有哪些方案?

当运用Intent来传递数据时,用到了Binder机制,数据就存放在了Binder的业务缓冲区里边,而业务缓冲区是有巨细约束的。一般的由Zygote孵化而来的用户进程,映射的Binder内存巨细是不到1M的Binder 自身便是为了进程间频频-灵敏的通讯所规划的, 并不是为了复制大量数据

假如非 ipc:单例,eventBus,Application,sqlite、shared preference、file 都能够

假如是 ipc:同享内存功能还不错,Socket或许管道功能不太好,涉及到至少两次复制

十一显现发动和隐式发动

显现发动:直接告知Android的kernel,要发动哪个activity!在发动同一运用程序时占优!效率会高很多!

隐式发动:不直接告知Android的kernel发动哪个activity,要让Android的kernel自己挑选最适合的activity!

隐式Intent是经过在AndroidManifest文件中设置action、data、category,让体系来筛选出合适的Activity

action的匹配规矩:

Intent-filter action能够设置多条intent中的action只需与intent-filter其间的一条匹配成功即可,且intent中action最多只需一条Intent-filter内有必要至少包括一个action

category的匹配规矩:

Intent-filter内有必要至少包括一个category,android:name为android.intent.category.DEFAULT。intent-filter中,category能够有多条intent中,category也能够有多条intent中一切的category都能够在intent-filter中找到一样的(包括巨细写)才算匹配成功

data的匹配规矩:

intent-filter中能够设置多个dataintent中只能设置一个dataintent-filter中指定了data,intent中就要指定其间的一个data

十二用Intent传递数据和Bundle传递数据的差异?为什么不必HashMap呢?

1,Bundle内部是由ArrayMap完结的,ArrayMap的内部完结是两个数组,一个int数组是存储目标数据对应下标,一个目标数组保存key和value,内部运用二分法对key进行排序,所以在增加、删除、查找数据的时分,都会运用二分法查找,只适合于小数据量操作,假如在数据量比较大的状况下,那么它的功能将退化。而HashMap内部则是数组+链表结构,所以在数据量较少的时分,HashMap的Entry Array比ArrayMap占用更多的内存。由于运用Bundle的场景大多数为小数据量,我没见过在两个Activity之间传递10个以上数据的场景,所以相比之下,在这种状况下运用ArrayMap保存数据,在操作速度和内存占用上都具有优势,因而运用Bundle来传递数据,能够确保更快的速度和更少的内存占用。

2,别的一个原因,则是在Android中假如运用Intent来携带数据的话,需求数据是基本类型或许是可序列化类型,HashMap运用Serializable进行序列化,而Bundle则是运用Parcelable进行序列化。而在Android渠道中,更推荐运用Parcelable完结序列化,尽管写法杂乱,但是开支更小,所以为了更加快速的进行数据的序列化和反序列化,体系封装了Bundle类,方便咱们进行数据的传输

十三了解scheme跳转协议吗?谈一谈

Scheme 是一种页面内跳转协议

运用场景:

1 APP根据URL跳转到别的一个APP指定页面

2 能够经过h5页面跳转app原生页面

3 服务器能够定制化跳转app页面

Scheme链接格式款式:

Uri.parse(“bs://test:8080/abc/cbd?name=111&value=222”);

能够相似的理解为一个http的地址。

bs: 便是Scheme的协议称号,能够随意界说,相似于http

test:代表Scheme协议的效果域

8080:代表Scheme协议的端口号

/abc/cbd :代表制定的页面(路径)

name =111&value=222 :表明传递的参数

Service

一 什么是service?

Service是Android体系供给的四大组件之一,它的位置和Activity的并列的,只不过没有Activity的运用频率高。望文生义Service便是运转在后台的一种服务程序,一般状况下,很少和用户交互,最大的特色便是没有可视化界面

二说说Service的生命周期,两种发动办法的差异

startService : onCreate() -> onStartCommand() -> onDestroy()

bindService : onCreate() -> onbind() -> onUnbind()-> onDestroy()

差异:

发动

假如服务现已敞开,屡次履行startService不会重复的履行onCreate(), 而是会调用onStart()和onStartCommand()

假如服务现已敞开,屡次履行bindService时,onCreate和onBind办法并不会被屡次调用

毁掉

当履行stopService时,直接调用onDestroy办法

调用者调用unbindService办法或许调用者Context不存在了(如Activity被finish了),Service就会调用onUnbind->onDestroy

运用startService()办法启用服务,调用者与服务之间没有关连,即使调用者退出了,服 务仍然运转

运用bindService()办法启用服务,调用者与服务绑定在了一同,调用者一旦退出,服务也就中止

1、独自运用startService & stopService

(1)第一次调用startService会履行onCreate、onStartCommand

(2)之后再屡次调用startService只履行onStartCommand,不再履行onCreate

(3)调用stopService会履行onDestroy

2、独自运用bindService & unbindService

(1)第一次调用bindService会履行onCreate、onBind

(2)之后再屡次调用bindService不会再履行onCreate和onBind

(3)调用unbindService会履行onUnbind、onDestroy

三 service发动流程

Android四大组件相关知识点

1.Process A进程选用Binder IPC向system_server进程建议startService恳求;

2.system_server进程接收到恳求后,向zygote进程发送创立进程的恳求;

3.zygote进程fork出新的子进程Remote Service进程;

4.Remote Service进程,经过Binder IPC向sytem_server进程建议attachApplication恳求;5.system_server进程在收到恳求后,进行一系列准备作业后,再经过binder IPC向remote Service进程发送scheduleCreateService恳求;

6.Remote Service进程的binder线程在收到恳求后,经过handler向主线程发送CREATE_SERVICE音讯;

7.主线程在收到Message后,经过发射机制创立目标Service,并回调Service.onCreate()办法。到此,服务便正式发动完结。

当创立的是本地服务或许服务所属进程已创立时,则无需经过上述过程2、3,直接创立服务即可。

四Service与Activity怎样完结通讯

经过Binder目标

1.Service中增加一个继承Binder的内部类,并增加相应的逻辑办法

2.Service中重写Service的onBind办法,回来咱们刚刚界说的那个内部类实例

3.Activity中绑定服务,重写ServiceConnection,onServiceConnected时回来的IBinder(Service中的binder)调用逻辑办法

Service经过BroadCast播送与Activity通讯

五IntentService是什么,IntentService原理,运用场景及其与Service的差异

What:

IntentService 是 Service 的子类,默许敞开了一个作业线程HandlerThread,运用这个作业线程逐个处理一切发动恳求,在使命履行完毕后会主动中止服务。只需完结一个办法 onHandleIntent,该办法会接收每个发动恳求的 Intent,能够履行后台作业和耗时操作

能够发动 IntentService 屡次,而每一个耗时操作会以行列的办法在 IntentService 的 onHandlerIntent 回调办法中履行,而且,每一次只会履行一个作业线程,履行完第一个再履行第二个。而且等待一切音讯都履行完后才中止服务

How:

1.创立一个名叫 ServiceHandler 的内部 Handler

2.把内部Handler与HandlerThread所对应的子线程进行绑定

3.HandlerThread敞开线程 创立自己的looper

4.经过 onStartCommand() intent,顺次插入到作业行列中,并发送给 onHandleIntent()逐个处理能够用作后台下载使命 静默上传

Why:

IntentService会创立独立的worker线程来处理一切的Intent恳求 ,Service主线程不能处理耗时操作,IntentService不会堵塞UI线程,而一般Serveice会导致ANR反常

为Service的onBind()供给默许完结,回来null;onStartCommand供给默许完结,将恳求Intent增加到行列中。一切恳求处理完结后,IntentService会主动中止,无需调用stopSelf()办法中止Service

BroadcastReceiver

一播送是什么?

BroadcastReceiver,“播送接收者”的意思,望文生义,它便是用来接收来自体系和运用中的播送

二 播送的特性是什么?

1.播送接收者的生命周期是十分短暂的,在接收到播送的时分创立,onReceive()办法完毕之后毁掉

2.播送接收者中不要做一些耗时的作业,不然会弹出Application No Response错误对话框

3.最好也不要在播送接收者中创立子线程做耗时的作业,由于播送接收者被毁掉后进程就成为了空进程,很容易被体系杀掉

4.耗时的较长的作业最好放在服务中完结

三 播送的分类是什么?及运用场景

Android 播送分为两个角色:播送发送者、播送接受者

播送接收器的注册分为两种:静态注册、动态注册。

静态播送接收者:经过AndroidManifest.xml的标签来申明的BroadcastReceiver。

动态播送接收者:经过AMS.registerReceiver()办法注册的BroadcastReceiver,动态注册更为灵敏,可在不需求时经过unregisterReceiver()取消注册。

播送类型:根据播送的发送办法

  1. 一般播送 :经过Context.sendBroadcast()发送,可并行处理
  2. 体系播送 :当运用体系播送时,只需在注册播送接收者时界说相关的action即可,不需求手动发送播送
  3. 有序播送 :指的是发送出去的播送被 BroadcastReceiver 按照先后顺序进行接收 发送办法变为:sendOrderedBroadcast(intent);
  4. App运用内播送(本地播送):可理解为一种部分播送,播送的发送者和接收者都同属于一个App。相比于大局播送(一般播送),App运用内播送优势体现在:安全性高效率高

四播送的两种注册办法的差异

静态注册:常驻体系,不受组件生命周期影响,即便运用退出,播送仍是能够被接收,耗电、占内存。

动态注册:十分驻,跟从组件的生命改变,组件完毕,播送完毕。在组件完毕前,需求先移除播送,不然容易构成内存走漏。

五如何完结阻拦一条短信?

①.首要增加接收短信的权限:

留意android 6.0及以上需求运转时权限处理。

②.在AndroidManifest中注册播送接收器,优先级尽量设置高些。

③.在播送接收器中接收到播送的处理后然后设置阻拦器abortBroadcast()。

重视公众号:Android老皮
解锁 《Android十大板块文档》 ,让学习更贴近未来实战。已构成PDF版

内容如下

1.Android车载运用开发体系学习指南(附项目实战)
2.Android Framework学习指南,助力成为体系级开发高手
3.2023最新Android中高级面试题汇总+解析,告别零offer
4.企业级Android音视频开发学习道路+项目实战(附源码)
5.Android Jetpack从入门到通晓,构建高质量UI界面
6.Flutter技能解析与实战,跨渠道首要之选
7.Kotlin从入门到实战,全方面提高架构基础
8.高级Android插件化与组件化(含实战教程和源码)
9.Android 功能优化实战+360全方面功能调优
10.Android零基础入门到通晓,高手进阶之路

敲代码不易,重视一下吧。ღ( ・ᴗ・` )