欢迎来到皮皮网网首页

【apk转换源码】【秀源码、】【源码报文】onnewintent 源码分析

来源:7447的源码 时间:2024-11-24 22:44:30

1.onStart()和onResume()/onPause()和onStop()的区别?
2.Activity的基础知识(下)
3.一文分析Binder机制和AIDL的码分理解

onnewintent 源码分析

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源码,这些核心原理都将是你不可或缺的指南。