1.onStart()åonResume()/onPause()åonStop()çåºå«ï¼
2.Activityçåºç¡ç¥è¯(ä¸)
3.一文分析Binder机制和AIDL的码分理解
onStart()åonResume()/onPause()åonStop()çåºå«ï¼
onStart()åonResume()/onPause()åonStop()çåºå«ï¼
å çä¸ä¸å®æ¹å£°æå¨æå¾
è¿éåºç¨åºæ¯ï¼ä¸è¬å¯å¨app:
onCreate -onStart() - onResume
æä¸ä¸home é®ï¼onPause-onStop
åä»å ¶ä»é¡µé¢è¿åå°LoginActivtiyï¼
-onNewIntent- onRestart -onStart -onResume
2.onCeate vs onStart vs onResume
çstackoverflowä¸åçï¼
/questions//difference-between-oncreate-and-onstart
onCreate :
called when the actiivty first createdï¼do create views bind data to list etc.
åæ°Bunldelä¸æ¬¡è¢«å¼å¸¸æ åµéæ¯æ¶ä¿åçç¶æä¿¡æ¯
3.onStart()åonResume()/onPause()åonStop()çåºå«ï¼
onStart /onStop ä»å¯è§çè§åº¦åè°çï¼ èonResume/onPasue ä»æ¯å¦ä½äºåå°çè§åº¦åè°çï¼èå¨å®é åºç¨ä¸æ²¡ä»ä¹åºå«ã
æ»ä¹ï¼è®°ä½
onStart å¯è§ä¸å¯ç¹å» onResume å¯è§å¯ç¹å»ï¼
onPause å¯è§ä¸å¯ç¹å»ï¼æ¯å¦å¼¹åºå¯¹è¯æ¡ï¼
onStop ä¸å¯è§
4.Activity Aå¯å¨å¦ä¸ä¸ªActivity Bä¼åè°åªäºæ¹æ³ï¼
å¦æActivity Bæ¯å®å ¨éæå¢ï¼å¦æå¯å¨çæ¯ä¸ä¸ªDialogå¢ï¼
ä¸è¬æ åµï¼å½ç¨æ·æå¼ä¸ä¸ªæ°ççé¢ææ¯åå°æ¡é¢ï¼åè°ï¼
onPause -->onStop();
å¦æéæï¼onStop()ä¸åè°ç¨(å¯å¨ä¸ä¸ªéæ主é¢çActivityB,å 为ActivityAè¿æ¯å¯è§çï¼ä½ä¸å¨åå°ï¼)
å½å次åå°ActivityAæ¶ï¼ä¼åè° onRestart () -->onStart()--->onResume();
5.backé®ï¼
onPause -->onStop -->onDestory;
6.å½åActiivtyæ¯Aï¼å¦æç¨æ·æå¼ä¸ä¸ªæ°çActivityBï¼é£ä¹B.onRsume() åA.onPause()åªä¸ªå åè°ï¼
è¿ä¸ªé®é¢ï¼è¦ä»æºç åæãæä¸è¯¦ç»è¯´äºï¼æ»ä¹ï¼æºç éæä¸æ®µè¯âwe need to start pasuing the curent activity ,so the top one can be resumed"
å³å A.onPause() ,ç¶åB.onResume()
Activityçåºç¡ç¥è¯(ä¸)
ä¸ç¯æ»ç»äºActivityçä¸äºç¥è¯,ç°å¨ç»§ç»å¯¹Activityçç¥è¯è¿è¡æ¢³ç,å æ¬Activityç´æ¥ä¼ éæ°æ®,Activityççå½å¨æ,Activityçå¯å¨æ¨¡å¼ç.
1.intentä¼ éæ°æ®:
使ç¨startActivityæ¹æ³,intentçputExtra()æ¹æ³,以é®å¼å¯¹çå½¢å¼ä¼ éæ°æ®,该æ¹æ³æå¾å¤éè½½æ¹æ³,å¯ä»¥æ ¹æ®ä¼ éæ°æ®çä¸åç±»åéæ©åéçæ¹æ³.é¤äºæputExtra()æ¹æ³å¤,è¿æputExtras()æ¹æ³,ä¼ éçåæ°æ¯Bundle.
å¦æä¼ éçæ¯å¯¹è±¡,è¿ä¸ªå¯¹è±¡è¦å®ç°åºåå,ä¹å°±æ¯å®ç°Parcelableæè Serializableæ¥å£.
å¦æå¸æ被å¯å¨ç页é¢è¿åæ°æ®,éè¦ä½¿ç¨startActivityForResult()æ¹æ³,è¿ä¸ªæ¹æ³ä¸éè¦è®¾ç½®è®¿é®å·,ç¨æ¥åºåä¸åç访é®è .并ä¸å¨å¯å¨é¡µéåonActivityResultæ¹æ³ç¨æ¥æ¥æ¶è¿åçæ°æ®,
2.两ç§æ åµä¸çActivityççå½å¨æ.
æ£å¸¸æ åµä¸ççå½å¨æ,æ£å¸¸æ åµæ¯æç¨æ·çæ£å¸¸æä½ä¸çActivityççå½å¨æ.åé¢ä¼åæå¼å¸¸æ åµä¸ççå½å¨æ.
onCreate: Activity第ä¸æ¬¡å建æ¶åçåè°,主è¦æ¯å¨è¿ä¸ªæ¹æ³è¿è¡åå§åå·¥ä½,æ¯å¦åå§åæ§ä»¶åäºä»¶ç»å®å·¥ä½.
onStart:Activityä»ä¸å¯è§ç¶æåæå¯è§ç¶æ.
onResume:Activityåæåå°,å¯ä»¥åç¨æ·äº¤äº.
onPause:Activityå¯è§ä½æ¯ä¸è½åç¨æ·äº¤äº.
onStop:Activityä»å¯è§åå¾ä¸å¯è§,æ为åå°Activity.
onDestroy:Activityéæ¯æ¶è°ç¨.
onRestart:Activityä»åå°åæåå°Activity.
å¨å¯å¨Activityå两个Activityä¹é´è·³è½¬æ¶,å¯ä»¥ç¥éActivityççå½å¨æååè¿ç¨,æ两个说æ:(1)å¨ä¸¤ä¸ªActivity跳转æ¶,第ä¸ä¸ªActivtyçonPause,onStopæ¹æ³å第äºä¸ªActivityççå½å¨ææ¹æ³è°ç¨æ¶æº.
第ä¸ä¸ªActivityå æ§è¡onPauseæ¹æ³,第äºä¸ªActivityæè½å建.è¿ä¹å°±æå³çå¨onPauseæ¹æ³ä¸ä¸è½æ§è¡å¤ªèæ¶çæä½,å¦åä¼å½±å第äºä¸ªActivityçå建.å¨æºç (ActivityStack)ä¸æè¿æ ·ç注é:
(2)onStartåonResume,onPauseåonStopè¿ä¸¤å¯¹æ¹æ³çå®è´¨ä¸åå¤:onStartåonStopè¿ä¸¤ä¸ªæ¹æ³æ¯ä»Activityçå¯è§æ§æ¥åºåç,onResumeåonPauseæ¯ä»Activityæ¯å¦å¤äºåå°,æ¯å¦å¯ä»¥åç¨æ·äº¤äºæ¥åºåç,注æå¨onPauseè°ç¨æ¶Activityè¿æ¯å¯è§ç,è°ç¨æ¶æºæ¯å¦å¼¹åºdialogæ¶,ä¸é¢çActivityæ¯å¯è§ç.è¿ä¸ªæ¶åè°ç¨çæ¯onPauseæ¹æ³.
å¼å¸¸æ åµä¸Activityççå½å¨æ:å¼å¸¸æ åµä¸æ¯æèµæºç¸å ³é ç½®åçååæåå°Activity被系ç»åæ¶æ¶Activityççå½å¨æ.åå°Activity被系ç»åæ¶çæ åµæ¯è¾é¾å¤ç°,å¨èµæºç¸å ³é ç½®åçååæ¶ååå°Activity被åæ¶æ¶ççå½å¨ææ§è¡è¿ç¨æ¯ä¸æ ·ç,æ¯è¾å®¹æå¤ç°çå°±æ¯æ¨ªç«å±åæ¢æ¶ççå½å¨ææ§è¡è¿ç¨.å¨ AndroidManifestçActivityç»ä»¶ä¸é ç½®android:screenOrientationæ ç¾,å½è®¾ç½®å¯ä»¥æ¨ªç«æ¹åéçæ¹åæåºå¨æ¥è°èæ¶,å¨åæ¢æ¶ä¼åºç°å éæ¯Activityåå建çè¿ç¨.
è¿ç¨:
å¨è¿ç§æ åµä¸æå¯è½ä¼ææ°æ®ç丢失,ç³»ç»æä¾ç¨æ¥ä¿åæ°æ®åè¿åæ°æ®çæ¹æ³:onSaveInstanceStateåonRestoreInstanceState.ç¨æ¹æ³åæ°Bundleå¯ä»¥ä¿ååè¿åæ°æ®.
å¯ä»¥æ ¹æ®éè¦è®¾ç½®android:screenOrientationæ ç¾,设å®activityçæ¹å,å¦æactivityçæ¹åæ¯éè¦æ¨ªç«å±åæ¢,ä½æ¯ä¸å®¹è®¸éæ¯Activity,å¯ä»¥è®¾ç½®å¦ä¸æ ç¾,å½è¿äºæ åµ(常ç¨ç)åçååæ¯ä¸ä¼éæ°èµ°Activityççå½å¨ææ¹æ³,åªä¼è°ç¨onConfigurationChanged,å¯ä»¥æ ¹æ®æ åµå¨è¿ä¸ªæ¹æ³éæ´æ°æä½.
åæ¢æ¶çlogè¾åº
3.Activityçåç§å¯å¨æ¨¡å¼
æ å:æ¯Activityçé»è®¤å¯å¨æ¨¡å¼,对äºAndroidManifestçActivityèç¹ä¸çandroid:launchMode="standard"æ ç¾.
ç¹å®:æ¯æ¬¡å¯å¨é½ä¼éæ°å建æ°çActivity.
singleTop:对åºçAndroidManifesçActivityèç¹ä¸çandroid:launchMode="singleTop"æ ç¾
ç¹ç¹:å½æ¤æ¨¡å¼çActivityå¤äºæ 顶æ¶,ä¸ä¼éæ°å建æ°çActivity,ä¼è°ç¨onNewIntentæ¹æ³,å¦ææ´æ°Activityçintent,éè¦è°ç¨ setIntent()æ¹æ³,å ·ä½ççå½å¨æè¿ç¨
singleTask:å¨activityæ ä¸å·²ç»æéè¦åå¯å¨çactivityæ¶,ä¼å æ¸ é¤ä½äºéè¦å¯å¨activityä¹ä¸çactivity,ä¾å¦:å¯å¨é¡ºåºmainActivity-activityA -activityB-activityA,å ¶ä¸activityAæ¯singleTaskçå¯å¨æ¨¡å¼:
singleInstance:å¨ä¸ä¸ªæ ä¸åç¬åå¨çactivity.
å ³äºactivityæ :æ¯æç¨æ¥ç®¡çactivityä¸ç§"å è¿å åº"çéåç»æ,æ¥çactivity对åºæ çæ¹æ³:ActivityçgetTaskId()æ¹æ³,åä¸ä¸ªæ çidå¼æ¯ç¸åç.adb shell dumpsys activityå¨ç»ç«¯æ¥çæ ç»æ,æ¯å¦è¿æ¯ä¸é¢çactivityå¯å¨é¡ºåº,ä¸åæ¯ActivityAè¿æ¯è®¾ç½®æsingleInstance,è¿æ¯çæ ç»æ:æ两个TaskRecord,å ¶ä¸ActivityBåMainActivityä½äºåä¸ä¸ªæ ä¸.
4.Activityå¼åä¸ä½¿ç¨æå·§:
<1>å®ä¹ä¸ä¸ªç¶Activity,å¨å建æ°çActivityæ¶ç»§æ¿è¿ä¸ªactivityå³å¯,å°ä¸äºactivityçå ¬å ±è®¾ç½®å¯ä»¥è®¾ç½®å¨ç¶activityä¸,æ¯å¦è·åæ¯ä¸ªActivityçåå,设置activityççªä½å±æ§,åä¸ç®¡çactivityççå½å¨æç,
<2>å¨å¯å¨çactivityä¸å®ä¹éææ¹æ³,å¯å¨æ¡ä»¶ä¼æ¾èæè§:
<3>管çactivityç±»,ç¨æ¥ä¸é®éåºapp.å¨ç¶ç±»Activityçå建åéæ¯æ¶ç¨æ¥æ·»å å移é¤Activity,å¨éè¦ä¸é®éåºçå°æ¹è°ç¨éæfinishAllActivityæ¹æ³.
一文分析Binder机制和AIDL的理解
深入了解Android进程间通信机制,如同破解系统奥秘的码分钥匙,它在源码探索和问题解决中扮演着核心角色。码分Binder机制,码分源自OpenBinder,码分正是码分apk转换源码这个领域的主角,它弥补了Linux原生通信方式在性能和安全性的码分短板。它的码分运作涉及驱动层与应用层的无缝对接,包括与系统服务如Activity Manager Service (AMS) 的码分深度协作。 Binder,码分作为Java编写的码分通信工具包,是码分Android多进程通信的基石。尽管AIDL(Android Interface Definition Language)常用于简化这一过程,码分但并非不可或缺。码分让我们通过一个实例,码分秀源码、不依赖AIDL,来揭示Binder通信的内在机制。想象一个简单的场景:一个客户端(ClientBinder)与服务端(ServerBinder,继承自Binder并实现onTransact方法)之间的字符串传递,透彻理解Binder通信的运作原理。 项目框架中,服务端在Service的源码报文onBind方法中返回一个ServerBinder实例。对比手动实现与AIDL生成的代码,AIDL的便捷性便一目了然。客户端通过ServiceConnection,如下面这段代码,与远程服务建立连接:1. 创建ServiceConnection,获取远程服务的IBinder
2. intent设置服务类名:"com.binder.server.RemoteService"
3. bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE)
4. 若未连接,尝试bindService
5. 传递数据:通过IBinder调用mStingEditText的camchat源码文本,如data.writeString(text)
6. 成功连接后,调用transact方法传递请求
接收数据的环节,服务端将数据展示在tvShowMessage上,通过新线程处理,如`new Handler().post(() -> ServerMainActivity.tvShowMessage.setText(message));`。当连接断开时,serviceConnection的swidc源码onServiceDisconnected方法会被触发。 关键在于客户端如何通过IBinder获取服务端对象并调用transact进行跨进程通信。AIDL的引入让这个过程更加优雅,例如在ClientMainActivityUseAidl中,服务连接成功后,通过IBinder代理mServer,调用自定义接口IShowMessageAidlInterface的showMessage方法。 在交互过程中,客户端通过IShowMessageAidlInterface的Stub内部类,将本地的IBinder转换为接口,这样数据的发送就通过showMessage方法进行。AIDL的asInterface方法负责封装本地或远程处理,Proxy类则负责数据的打包和跨进程传输,确保数据的无缝传递。 总结来说,客户端利用AIDL的asInterface处理远程IBinder,而Proxy类则是这一切的幕后功臣。服务端的onBind方法返回AIDL生成的Stub,它在客户端调用transact时负责接收和处理请求,执行showMessage方法。这样,AIDL生成的Stub和Proxy成为客户端发送数据的桥梁,而在服务端,它们则是数据处理的核心所在。 掌握Binder机制和AIDL的精髓,你将解锁Android进程间通信的无尽可能,为你的应用开发增添无限力量。无论何时,当你深入探索Android源码,这些核心原理都将是你不可或缺的指南。