欢迎来到皮皮网网首页

【乱世王者源码修改】【稀饭软件源码】【传奇改源码】activity官网下载源码_activity 下载

来源:昕淘画源码 时间:2024-11-23 15:39:47

1.Activity的基础知识(下)
2.Android Activity Deeplink启动来源获取源码分析
3.Android Framework源码面试——Activity启动流程
4.怎么在手机上查看APP的官网源码?
5.Android-Fragment源码分析

activity官网下载源码_activity 下载

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方法.

Android Activity Deeplink启动来源获取源码分析

       Deeplink在业务模块中作为外部应用的入口提供,不同跳转类型可能会导致应用提供不一致的下载下载服务,通常通过反射调用Activity中的源码mReferrer字段获取跳转来源的包名。然而,官网mReferrer存在被伪造的下载下载风险,可能导致业务逻辑出错或经济损失。源码乱世王者源码修改因此,官网我们需要深入分析mReferrer的下载下载来源,并寻找更为安全的源码获取方法。

       为了深入了解mReferrer的官网来源,我们首先使用搜索功能在Activity类中查找mReferrer,下载下载发现其在Attach方法中进行赋值。源码进一步通过断点调试跟踪调用栈,官网发现Attach方法是下载下载由ActivityThread.performLaunchActivity调用的。而performLaunchActivity在调用Attach时,源码传入的referrer参数实际上是一个ActivityClientRecord对象的referrer属性。深入分析后,发现referrer是在ActivityClientRecord的构造函数中被赋值的。通过进一步的调试发现,ActivityClientRecord的稀饭软件源码实例化来自于LaunchActivityItem的mReferrer属性。接着,我们分析了mReferrer的来源,发现它最终是由ActivityStarter的setCallingPackage方法注入的。而这个setCallingPackage方法的调用者是ActivityTaskManagerService的startActivity方法,进一步追踪调用链路,我们发现其源头是在App进程中的ActivityTaskManager.getService()方法调用。

       在分析了远程服务Binder调用的过程后,我们发现获取IActivityTaskManager.Stub的方法是ActivityTaskManager.getService()。这使得我们能够追踪到startActivity方法的调用,进而找到发起Deeplink的应用调用的具体位置。通过这个过程,我们确定了mReferrer实际上是通过Activity的getBasePackageName()方法获取的。

       为了防止包名被伪造,我们注意到ActivityRecord中还包含PID和Uid。通过使用Uid结合包管理器的方法来获取对应的包名,可以避免包名被伪造。通过验证Uid的来源,我们发现Uid实际上是通过Binder.getCallingUid方法获取的,且Binder进程是传奇改源码无法被应用层干涉的,因此Uid是相对安全的。接下来,我们可以通过Uid来置换包名,进一步提高安全性。

       总结,mReferrer容易被伪造,应谨慎使用。通过使用Uid来获取包名,可以提供一种更为安全的获取方式。此过程涉及对源代码的深入分析和调试,作者Chen Long为vivo互联网客户端团队成员。

Android Framework源码面试——Activity启动流程

       面试官常问关于Activity启动模式的问题,但这涉及的知识点远不止四种模式。默认启动模式会因Intent Flag的设置而发生变化,面试时仅凭流程描述往往难以全面理解。

       设置FLAG_ACTIVITY_NEW_TASK在Service中启动Activity时,Activity的启动行为会有所不同。不同场景下,Activity的安歌源码启动表现各不相同。以singleInstance属性为例,即使设置了,使用Intent.FLAG_ACTIVITY_CLEAR_TASK启动时,并非完全遵循只复用实例的原则。

       此外,不同Intent Flag的叠加使用也有各自的特性和表现。单一讨论启动模式的原理不易全面,理解需要结合实际项目、阅读源码或实验验证。

       面试中,面试官可能会提出深入的、场景化的关于Activity启动的问题。例如,在Service中启动Activity时,FLAG_ACTIVITY_NEW_TASK的作用是什么?设置singleInstance后,使用FLAG_ACTIVITY_CLEAR_TASK启动时的行为如何?不同Intent Flag的组合使用又会产生哪些不同的结果?

       理解这些知识点不仅需要对Android框架有深入的了解,还需要通过实践去验证和理解。比如,尝试在实际项目中使用不同的魔幻自由源码Intent Flag,观察Activity的启动行为,这样能更好地理解其背后的原理。

怎么在手机上查看APP的源码?

       要在手机上查看APP的源码,您可以按照以下步骤操作:

       1. 首先,确保您已下载并安装了相应的APP开发工具。这里以Android开发常用的Android Studio为例。

       2. 打开Android Studio,并创建一个新的项目。输入您的APP名称、项目名称、包名,然后点击“下一步”。

       3. 选择合适版本的SDK(软件开发工具包),通常选择默认配置即可,然后点击“下一步”。

       4. 选择或上传您的APP图标,然后点击“下一步”。

       5. 选择一个界面模版作为您的APP启动界面。如果没有特别需求,可以选择“Blank Activity”作为起点,然后点击“下一步”。

       6. 输入主活动的名称,通常默认即可,完成后点击“完成”创建项目。

       7. 项目创建完成后,您会看到项目结构。在Android Studio中,您可以找到APP的源码文件,它们通常以`.java`或`.xml`为扩展名。

       8. 打开源码文件,您就可以在Android Studio中查看和编辑APP的源码了。

       此外,还有一些专门的工具和APP可以帮助您在手机上查看和管理APP源码,例如"Android Code Reader"等。这类工具通常具备代码高亮、文件管理等特性,方便用户在移动设备上阅读和理解源码。

Android-Fragment源码分析

       Fragment是Android系统为了提高应用性能和降低资源消耗而引入的一种更轻量级的组件,它允许开发者在同一个Activity中加载多个UI组件,实现页面的切换与回退。Fragment可以看作是Activity的一个子部分,它有自己的生命周期和内容视图。

       在实际应用中,Fragment可以用于构建动态、可复用的UI组件,例如聊天应用中,左右两边的布局(联系人列表和聊天框)可以分别通过Fragment来实现,通过动态地更换Fragment,达到页面的切换效果,而无需整个页面的刷新或重新加载。

       在实现上,v4.Fragment与app.Fragment主要区别在于兼容性。app.Fragment主要面向Android 3.0及以上版本,而v4.Fragment(即支持包Fragment)则旨在提供向下兼容性,支持Android 1.6及更高版本。使用v4.Fragment时,需要继承FragmentActivity并使用getSupportFragmentManager()方法获取FragmentManager对象。尽管从API层面看,两者差异不大,但官方倾向于推荐使用v4.Fragment,以确保更好的兼容性和性能优化。

       下面的示例展示了如何使用v4.Fragment实现页面的加载与切换。通过创建Fragment和FragmentActivity,我们可以加载特定的Fragment,并在不同Fragment间进行切换。

       在FragmentDemo的布局文件中,定义了Fragment容器。

       在Fragment代码中,定义了具体的业务逻辑和视图渲染,如初始化界面数据、响应用户事件等。

       在Activity代码中,通过FragmentManager的beginTransaction方法,加载指定的Fragment实例,并在需要时切换到不同Fragment,实现页面的动态更新。

       从官方的建议来看,v4.Fragment已经成为推荐的使用方式,因为它在兼容性、性能和功能方面都更优于app.Fragment。随着Android系统的迭代,使用v4.Fragment能确保应用在不同版本的Android设备上均能获得良好的运行效果。

       在Fragment的生命周期管理中,Fragment与Activity的生命周期紧密关联。通过FragmentManager的操作,如commit、replace等,可以将Fragment加入到Activity的堆栈中,实现页面的加载与切换。当用户需要返回时,系统会自动将当前Fragment从堆栈中移除,从而实现页面的回退。

       深入Fragment源码分析,我们可以了解其如何在底层实现这些功能。Fragment的初始化、加载、切换等过程涉及到多个关键类和方法,如FragmentManager、FragmentTransaction、BackStackRecord等。通过这些组件的协作,Fragment能够实现与Activity的生命周期同步,确保用户界面的流畅性和高效性。

       在实际开发中,使用Fragment可以显著提高应用的响应速度和用户体验。通过动态加载和切换不同的Fragment,开发者可以构建出更加灵活、高效的应用架构,同时减少资源的消耗,提高应用的性能。