,必然会把它序列化掉,那序列化后对应的都是什么对象?...从一个task迁移到另一个task的标签,这块后面在activity启动流程中会详细讲解,对应的manifest文件是android:allowTaskReparenting。...,可以通过AndroidManifest的"android:taskAffinity"属性得到,具体taskAffinity是怎么影响到Activity在task的启动,后面会在Activity启动模式中细讲...添加了这个属性,则该Activity被启动时永远会创建一个新的task。...该属性有4个值,用户在应用中打开的一个document会有不同的效果如下: public static final int DOCUMENT_LAUNCH_NONE = 0: Activity不会为
4种启动模式 standard:标准模式,也是系统默认的启动模式,如果一个 Activity 的启动模式是 standard,则该 Activity 可以被多次实例化,且可以在不同的任务栈中存在。...singleTop:栈顶复用模式,如果一个 Activity 的启动模式是 singleTop,则该 Activity 可以被多次实例化,且可以在不同的任务栈中存在,且一个任务栈可以存在多个 singleTop...在第一次启动这个 Activity 时,系统便会创建一个新的任务栈,并且初始化 Activity 的实例,放在新任务栈的底部。...还有一点: 无论 Activity 是在新任务栈中启动还是在相同的任务栈中启动,“返回”按钮始终会将用户带到上一个 Activity。...是一种单实例模式,在这种模式下,如果该Activity在栈中存在,那么多次启动此Activity都不会重新创建实例,而是销毁在它之上的所有Activity(不包括它本身),复用该Activity并调用它的
思路:实现一个双进程的监控服务,服务中写一个定时器 Timer 来重复进行检测是否正在运行,如果否就直接重新启动APP。...); ArrayList runningService = (ArrayList task = myManager.getRunningTasks(1); ComponentName componentInfo...= task.get(0).topActivity; if (componentInfo.getPackageName().equals(PackageName))...TextUtils.equals(task.topActivity.getClassName(), cls); } return false; } } 4.MainActivity中启动监控服务
本专题代码地址 在上一篇文章中,我们实现了,如何启动一个插件,和启动插件内的Activity和Service....启动插件到一个Activity(注意插件中的Activity必须是launchMode="standard",我们会在后续解决这个问题),其实就是启动宿主(app)中的一个空壳的Activity(ProxyActivity...插件中动态广播的实现: 启动插件中的动态广播其实和启动Activity和Service是一样的流程....真正的加载广播,是发生在系统启动时, 系统启动可以理解成 将所有app重新安装一遍到系统中,会重复上述过程....中只存放了ActivityInfo,继续点进去ActivityInfo中是否有我们想要的类名等信息 ActivityInfo extends ComponentInfo ComponentInfo extends
首页加载流程 在AndroidManifest.xml中可以看到,启动activity为Settings,Settings中包含大量的静态类继承于SettingsActivity。...在跳转时可以通过以下命令获取fragment: adb logcat -s "SubSettings" 这样就打印出了具体的启动fragment。...动态插入菜单 在Settings里的一些菜单,我们会发现一些菜单在xml和代码中并未添加,但实际上显示在页面上,这是为什么呢?原来是Settings支持动态插入菜单。...= 0; final ArrayList tiles = new ArrayList(); final UserManager userManager =...它定义在Settings的AndroidManifest.xml中。
首先我们创建一个程序,在入口Activity里的onCreate()方法里,我们来创建ActivityManager....ActivityManger对象.在官方文档中,并没有提供构造方法,所以我们不能通过new的方式创建该对象,由于ActivityManager是核心服务,所以android从系统服务里得到它的实例。...);//传入参数,将获得数据保存在memInfo对象中 long availMem = memInfo.availMem/1000000;//可用内存 boolean isLowMem = memInfo.lowMemory...上一次提交给进程的内饰水平 Log.i(TAG, "lastTrimLevel: "+lastTrimLevel); int lru = info.lru;//在一个特殊的进程中,提供更精细密度的衡量值...中处于最顶端的activity Log.i(TAG, "topActivity: " + topActivity); int content = info.describeContents();//描述文本
字符串拼接无法避免的创建StringBuilder对象 如果是循环情况下拼接,需要显式在循环外声明一个StringBuilder对象 不好的代码 1 2 3 4 5 6 7 public void...中Handler引起的内存泄露 详解 Android 中的 HandlerThread 网络数据返回先通知界面还是先更新数据库 通常境况下,可以选择先更新界面再更新数据库 如果数据很重要,建议先更新数据库在通知界面更新...内存泄露可以简单理解成:生命周期长的对象不正确持有了持有了生命周期短的对象,导致生命周期短的对象无法回收。...比如Activity实例被Application对象持有,Activity实例被静态变量持有。...关于Android中内存泄漏的文章 Android中Handler引起的内存泄露 避免Android中Context引起的内存泄露 Google为何这样设计OnSharedPreferenceChangeListener
SystemServer启动了系统的核心服务,除此之外,SystemServer还启动了很多其他服务,具体是在startOtherServices()方法中。我们要裁剪不需要的服务就可以从这里入手。...从全局属性读取配置, boolean disablePrinter = SystemProperties.getBoolean("config.disable_printer", false); 然后在启动服务的代码段添加对这个属性的判断...裁剪服务引发的问题 服务不是你不让它Start就完事儿了,系统那么大,总有一些地方会获取服务对象做一些调用处理。...通过阅读代码,了解到系统里有很多Loader类型的对象,其中一个子类就是PrintServicesLoader。然后这些Loader是由LoaderManager管理启动的。...frameworks/native/data/etc/handheld_core_hardware.xml:system/etc/permissions/handheld_core_hardware.xml 这个文件在源码中的位置是
在Activity间传递的数据一般比较简单,但是有时候实际开发中也会传一些比较复杂的数据,本节一起来学习更多Activity间数据的传递方法。...容我煮个栗子: 假设有 Activity1,Activity2 两个 Activity;如果要在 Activity1 中启动 Activity2,并传过去几个基本类型的数据,就可以这么写: Intent...2)Serializable 在序列化的时候会产生大量的临时变量,从而引起频繁的 GC。...还是以前面的两个 Activity 为例,传递不支持序列化的 Student 对象。...apply:立即刷新 In-memory 中的数据,然后启动异步任务将修改写到 Storage,无返回值。
问题1: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.xxx.xxx/com.xxx.xx.activity.login.XXXX...ComponentInfo{com.xxx.xxx/com.xxx.xx.activity.login.XXXX}: java.lang.NullPointerException: Attempt to...我们布局中如果是存在该View,但是仍然出现这个错误。 那么只有一种情况。就是viewBinding还没有来得及初始化之前,就调用了viewBinding的方法去获取PreviewView对象了。...而这个配置是在try/cathc包裹中。我们只需要主动捕获一下IllegalArgumentException 异常就可以避免崩溃了。...最好的方法就是在需要启动相机相关界面时,检测一下设备是否存在摄像头。效果会更好一些。
PackageManager会启动一个叫"package"的servcie服务,现在所有模糊的东西会发生在这个service中。 ?..."入口"Activity的Intent,例如,这是类似于在浏览包的"打开"按钮。...这个当前的安装启动第一步在category(CATEGORY_INFO)中寻找main Activity,然后在category(CATEGORY_LAUNCHER)寻找main Activity。...例如,类似于在浏览包的"打开"按钮。这个将找匹配CATEGORY_LEANBACK_LAUNCHER的Activity。如果没有找到则返回null。...ContactsList中的一个Activity类 入参params flags 附加选项的标志位,你可以理解为筛选条件,可以使用的标志位为: GET_META_DATA :ComponentInfo
,而事件处理中的初见处理器方法是由系统负责调用的 程序中实现监听器有以下几种方法 内部类形式 外部类形式 匿名内部类形式 Activity作为事件监听器类形式(activity本身实现监听器接口...Ui线程修改activity的ui组件,新的进程需要动态改变界面组件的属性值时,就需要用到Handler了 4.1Handler类简介 Handler类主要有两个作用:在新启动的线程中发送消息,...在主线程中获取和处理消息 只能通过回调的方法来实现-开发者只需要重写Handler类中处理的消息的方法即可,当新启动的线程发送消息时,消息会发送到与之关联的MessageQueue,而Handler...上面代码中的Timer类会启动一个新线程,由于不允许在线程中修改UI界面,所以该线程每隔1200毫秒会发送一个消息,该消息会传递到Activity中,再由Handler类进行处理,从而实现了动态切换的效果...,但是有两个缺点 1.造成程序的混乱,Activity的主要作用是完成初始化界面的工作,但是此时居然还要包含时间处理方法,可能会引起混乱 2.Activity实现监听器接口,那么他给开发者的感觉会比较奇怪
模式下依旧无法查询到报错, 全网搜索下, 依旧没有找到结果, 所以我描述下我的解决过程: 解决 adb命令在Android开发中有很大的作用, 在Mac上可以通过命令brew install android-platform-tools...00-00 00:00:00.000 7754 7754 E AndroidRuntime: java.lang.RuntimeException: Unable to instantiate activity...ComponentInfo{cn.timemail.xsot/cn.timemai.xsot.MainActivity}: java.lang.ClassNotFoundException: Didn't...ComponentInfo 查询过后, 发现是因为Flutter的默认包名 好像是 com.example.flutter还是什么,但是我讲其直接修改为了cn.timemail.xsot 但是在manifest.xml...中依然使用的旧的注册信息 android:name=".MainActivity" 我们只需要在AndroidManifest.xml中 将其改为 cn.timemail.xsot.MainActivity
从上图可知,JVM主要包括四个部分: 1.类加载器(ClassLoader):在JVM启动时或者在类运行时将需要的class加载到JVM中。...因为String已经在启动时就被引导类加载器(Bootstrcp ClassLoader)加载,所以用户自定义的ClassLoader永远也无法加载一个自己写的String,除非你改变JDK中ClassLoader...而ArrayList不是,这个可以从源码中看出,Vector类中的方法很多有synchronized进行修饰,这样就导致了Vector在效率上无法与ArrayList相比; 2).两个都是采用的线性连续空间存储元素...6、异常中使用泛型的问题 7、数组(这个不属于类型擦除引起的问题) 9、类型擦除后的冲突 10、泛型在静态方法和静态类中的问题 最近面试被怼了?...这里的对象是指Activity、ViewGroup、View. 2).Android中事件分发顺序:Activity(Window) -> ViewGroup -> View. 3).事件分发过程由
Activity 启动过程 | 静态代理 ) 使用了静态代理 , hook 了 Activity 的启动过程 ; 在 hook Android 的内部流程时 , 注意版本兼容 , 不同的 Android..., 在 Android 10.0 可能就无法使用了 ; Hook 插件化框架的 难点是版本兼容 , 需要逐个手动兼容 Android 低版本到最新版本 , 一旦系统更新 , 或者某厂商 ROM 更新...ActivityStack ( 任务栈 ) 中 ; 任务栈管理者 : ActivityStack 由 ActivityStackSupervisor 来管理 , ActivityStackSupervisor..., 列表中第一个 Activity 是最近最少使用的 ; ActivityRecord 就是 Activity 的信息 , 注意不是 Activity 的实例对象 , 是历史任务栈中的一个条目 , 可以代表一个...源码分析 在上一篇博客 【Android 插件化】Hook 插件化框架 ( Hook Activity 启动过程 | 静态代理 ) 一、分析 Activity 启动源码 章节中分析到 , 在 Activity
前言 内存管理的目的就是让我们在开发过程中有效避免我们的应用程序出现内存泄露的问题。内存泄露相信大家都不陌生,我们可以这样理解:「没有用的对象无法回收的现象就是内存泄露」。...,但是堆内存无法通过 GC 释放足够的空间,堆内存也无法再继续增长,从而完成对象创建请求的时候,OOM 发生很有可能是内存泄露导致的,但并非所有的 OOM 都是由内存泄露引起的,内存泄露也并不一定引起...Activity 中继承 AsyncTask 自定义了一个非静态内部类,在 doInbackground() 方法中做了耗时的操作,然后在 onCreate() 中启动 MyAsyncTask。...(null); 3、集合类 集合类添加元素后,仍引用着集合元素对象,导致该集合中的元素对象无法被回收,从而导致内存泄露,举个例子: static List objectList =...解决方法:在集合元素使用之后从集合中删除,等所有元素都使用完之后,将集合置空。
DEX 字节码中的 Activity 组件 ( DEX 文件准备 | 拷贝资源目录下的文件到内置存储区 | 配置清单文件 | 启动 DEX 文件中的组件 | 执行结果 ) 中 , 尝试启动 DEX 字节码文件中的...Activity 组件 , 出现如下报错信息 : 2021-12-12 01:02:01.431 25158-25158/?...ComponentInfo{com.example.classloader_demo/com.example.dex_demo.MainActivity2}: java.lang.ClassNotFoundException...组件类失败了 ; 其中的最主要原因是 , 类加载器的双亲委派机制 , 加载 Android 组件类需要使用系统指定的类加载器 , 这些类加载器设置在 LoadedApk 实例对象中 , 并且这些类加载器只能从特定位置加载字节码文件..., 在 组件类加载器 和 最顶层的启动类加载器之间插入自定义的 DexClassLoader 类加载器即可 ;
); } 到此,hook Activity 的三种方式已讲解完毕 ---- 启动一个没有在 AndroidManifest 声明的 Activity 我们知道,当我们启动一个没有在 AndroidManifest...而我们知道我们启动的 activity 信息都储存在 intent 中,那么我们若想要 启动一个没有在 AndroidManifest 声明的 Activity,那我们只需要在 某个时机,即调用 startActivity...amsField.set(gDefaultObj, amsObj); } 接着,我们在动态代理对象中,当调用 startActivity 方法的时候,我们把 intent 信息替换,校验的时候就可以绕过系统对...中的实现将收到的请求进行封装后送入 Handler -> 从 Handler 中取出这个消息,开始 app 本地的 Activity 初始化和启动逻辑。...小结 启动没有在 AndroidManifest 注册的 Activity 课改可以分为连个步骤 在 AMS 通过 intent 校验 activity 是否注册的时候,用已经在 AndroidManifet
以singleInstance模式启动的Activity在整个系统中是单例的,如果在启动这样的Activiyt时,已经存在了一个实例,那么会把它所在的任务调度到前台,重用这个实例。...Activity的启动过程 app启动的过程有两种情况,第一种是从桌面launcher上点击相应的应用图标,第二种是在activity中通过调用startActivity来启动一个新的activity。...这三个类虽然分别各种承担着不同的作用,但它们都属于Context的一种,而它们具体Context的功能则是由ContextImpl类去实现的,因此在绝大多数场景下,Activity、Service和Application...在这些资源不使用的时候,记得调用相应的类似close()、destroy()、recycler()、release()等方法释放 集合对象没有及时清理引起的内存泄漏 通常会把一些对象装入到集合中,当不使用的时候一定要记得及时清理集合...产生的原因: 5s内无法响应用户输入事件 广播在10s内无法结束 Service在20s内无法结束 总结 最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上相关的我搜集整理的
生成的View对象一定要添加到container中才可以正常显示。返回的Object对象是和此View关联的一个自定义对象(类似View.setTag),比如可以把一个对应View的数据对象返回。...根据前面的分析,在destroyItem中,我们把position处的page view从container移除即可,此处的object对象正是instantiateItem中add到container...经过我的实验,在pageCount非常大的时候,setCurrentItem方法如果引起ViewPager的页码切换跨度大于1时,就会引起明显的卡顿。...但是,如果代码中有逻辑setCurrentItem引起页码变化大于1,比如当前在第3页,直接切换到getCount() / 2页时,直接就ANR了。...有意思的是,在onCreate中setAdapter之后,第一次viewPager.setCurrentItem(adapter.getStartPageIndex())并不会引起ANR,应该是onCreate
领取专属 10元无门槛券
手把手带您无忧上云