【学习】Android四大组件启动流程(4)——ContentProvider的工作过程

Android13 ActivityThread handleBindApplication流程分析 ActivityThread的handleBindApplication方法是Android应用程序启动过程中的一个重要方法。它负责处理应用程序绑定到ActivityThread的过程。具体来说,handleBindApplication方法执行以下操作:创建Application对象:handleBindApplication方法首先通过LoadedApk.makeApplication方法创建Application对象。 阅读详情

ContentProvider的工作过程

ContentProvider启动的大致流程

在这里插入图片描述

当ContentProvider所在的进程启动时,ContentProvider会同时启动并被发布到AMS,这个时候ContentProvider的onCreate要先于Application的onCreate而执行

当一个应用启动时,入口方法为ActivityThread的main方法,它是一个静态方法,在main方法中会创建ActivityThread的实例并创建主线程的消息队列,然后在ActivityThread的attach方法中会远程调用AMS的attachApplication方法并将ApplicationThread对象提供给AMS。ApplicationThread是一个Binder对象,它的Binder接口是IApplicationThread,它主要用于ActivityThread和AMS之间的通信。

在AMS的attachApplication方法中,会调用ApplicationThread的bindApplication方法,注意这个过程同样是跨进程完成的,bindApplication方法的逻辑会经过ActivityThread中的mH Handler切换到ActivityThread中去执行,具体方法是handleBindApplication。在handleBindApplication方法中,ActivityThread会创建Application对象并加载ContentProvider。要注意ActivityThread会先加载ContentProvider然后再调用Application的onCreate方法
在这里插入图片描述

外界不能直接访问ContentProvider,它只能通过AMS根据Uri来获取对应的ContentProvider的Binder接口IContentProvider,然后再通过IContentProvider来访问ContentProvider的数据源。

一般来说ContentProvider都应该是单实例的,但它到底是不是单实例有android:multiprocess属性来决定的,当为false时是单实例,也是默认值。为true时,在每个调用者的进程中都存在一个ContentProvider对象。在实际的开发中并未发现多实例的使用场景,官方文档解释说可以避免进程间通信的开销,但仍缺少使用价值。

访问ContentProvider需要通过ContentResolver,ContentResolver是一个抽象类,通过Context的getContentResolver获取的实际上是ApplicationContentResolver对象,ApplicationContentResolver类继承了ContentResolver并实现了其中的抽象方法。当ContentProvider所在的进程未启动时,第一次访问它时就会触发ContentProvider的创建,当然这也伴随着ContentProvider所在进程的启动。增删改查任意一个都可以触发ContentProvider的启动过程。

这里选择query方法
首先会获取IContentProvider对象,不管是通过acquireUnstableProvider方法还是直接通过acquireProvider方法,它们本质都一样,最终都是通过acquireUnstableProvider方法来获取ContentProvider。

在这里插入图片描述

它直接调用了ActivityThread的acquireProvider方法

在这里插入图片描述

首先会从ActivityThread中查找师傅已经存在目标ContentProvider,如果存在就直接返回。ActivityThread中通过mProviderMap来存储已经启动的ContentProvider对象

在这里插入图片描述

如果目前ContentProvider没有启动,那么就发送一个进程间请求给AMS让其启动目标ContentProvider,最后再通过installProvider方法来修改引用计数。

在AMS中,首先会启动ContentProvider所在的进程,然后再启动ContentProvider。启动进程是由AMS的startProcessLocked方法来完成的,其内部主要是通过Process的start方法来完成一个新进程的启动,新进程启动后其入口方法是ActivityThread的main方法
在这里插入图片描述

它是一个静态方法,在它内部首先会创建ActivityThread的实例并调用attach方法来进行一系列初始化,接着开始进行消息循环。attach方法会将ApplicationThread对象通过AMS的attachApplication方法跨进程传递给AMS,最终AMS会完成ContentProvider的创建过程
在这里插入图片描述

AMS的attachApplication方法调用了addtachApplicationLocked方法,attachApplicationLocked又调用了ApplicationThread的bindApplication,这也是进程间调用
在这里插入图片描述

它会发送一个BIND_APPLICATION类型的消息给mH,mH是一个Handler,它收到消息后会调用ActivityThread的handleBindApplication方法

bindApplication方法发送消息过程

在这里插入图片描述

ActivityThread的handleBindApplication则完成了Application的创建以及ContentProvider的创建,分四大步骤

1.创建ContextImpl和Instrumentation

在handleBindApplication方法中会调用initInstrumentation方法
在这里插入图片描述

2.创建Application对象

在这里插入图片描述

3.启动当前进程的ContentProvider并调用其onCreate方法

在这里插入图片描述

installContentProviders完成了ContentProvider的启动工作,它的实现如下所示。
在这里插入图片描述

首先会遍历当前进程的ProviderInfo列表并一一调用installProvider方法来启动他们,接着将已经启动的ContentProvider发布到AMS中,AMS会把他们存储在ProviderMap中,这样一来外部调用者就可以直接从AMS中获取ContentProvider了。

在installProvide方法中通过类加载器完成了ContentProvider对象的创建,还会通过ContentProvider的attachInfo方法来调用它的onCreate方法

在这里插入图片描述

在这里插入图片描述

到此为止ContentProvider已经被创建并且onCreate已经被调用,意味着ContentProvider已经被创建完成了

4.调用Application的onCreate方法

在这里插入图片描述

经过上面四个步骤,ContentProvider已经成功启动,并且其所在进程的Application也已经启动,这意味着ContentProvider所在的进程已经完成了整个的启动过程,然后其他应用就可以通过AMS来访问这个ContentProvider了。拿到了ContentProvider以后,就可以通过它所提供的接口方法来访问它了。需要注意的是,这里的ContentProvider是ContentProvider的Binder类型的对象IContentProvider,IContentProvider的具体实现是ContentProviderNative和ContentProvider.Transport,后者继承了ContentProviderNative。

仍然选择query方法,首先其他应用会通过AMS获取到ContentProvider的Binder对象IContentProvider,而IContentProvider的实现者实际上是ContentProvider.Transport。因此其他应用调用IContentProvider的query方法时最终会以进程间通信的方式调用到ContentProvider.Transport的query方法。
在这里插入图片描述

ContentProvider.Transport的query方法调用了ContentProvider的query方法,它的执行结果再通过Binder返回给调用者。

Android四大组件系列11 Application创建流程 一 概述 system_server 进程和 app 进程都运行着一个或多个 app,每个 app 都会有一个对应的 Application 对象(该对象跟 LoadedApk 一一对应)。下面分别分析这两种进程创建 Application 的过程: system_server进程 app进程 二 system_server进程 2.1 SystemServer.run public final class SystemServer { private static final String 阅读详情

相关推荐

ContentProvider的启动流程分析

ContentProvider是Android系统的四大组件之一,主要用于向外部提供数据。不仅可以向自己应用进程提供数据,也可以向其他进程的提供数据。所以在分析ContentProvider的时候我们首先分析本进程的ContentProvider的启动过程,然后再分析调用其他进程的ContentProvider的时候ContentProvider的安装启动过程。 本进程ContentProv

zhenjie.Chang的专栏 4560

Android 12系统源码_SystemUI(一)SystemUI的启动流程

通过Android12系统源码分析SystemUI的启动流程

AfinalStone的专栏 1万+

半导体AMHS天车振动控制:从0.5G到超低振动的技术演进与工程实战

在先进晶圆厂中,自动化物料搬运系统(AMHS)的天车如同空中出租车,承担着晶圆盒(FOUP)在洁净室各工艺区间的转运任务。然而,当天车加减速、过弯或抓取时产生的机械振动通过轨道梁和建筑结构传递至光刻机等敏感设备,便可能直接威胁套刻精度与良率。传统被动减振方案依靠橡胶垫和弹簧,在0.5G指标时代曾行之有效,但在EUV光刻和先进制程面前已力不从心。主动振动控制技术通过传感器、控制器与作动器构成的闭环系统,在轨道吊点和机械手端实时输出反向力抵消振动,配合磁悬浮走行、轻量化结构及调度系统的路径优化,将振动从0.5G

weixin_29188043的博客 345

Android性能优化之启动速度优化

Android性能优化之启动速度优化: 1.讲解APP启动原理完整流程 2.讲解如何去排查启动问题 3.给出启动优化的解决方案

分享+记录 8384

逆向分析踩坑记:当Frida在x86模拟器上‘看不见’ARM的so文件时,我们该如何手动定位与验证?

本文探讨了在x86模拟器上使用Frida进行逆向分析时,无法检测到ARM架构so文件的解决方案。通过分析内存映射、Frida的视觉盲区及手动定位技术,提供了兼容层、混合调试和原生ARM环境三种实用方案,帮助逆向工程师突破工具限制,实现精准定位与验证。

weixin_27697385的博客 222

Unity游戏开发实战:用Flow Field实现RTS百人军团流畅寻路(附完整代码)

本文深入探讨了在Unity中利用流场寻路技术解决RTS游戏大规模单位移动性能瓶颈的实战方案。通过解析从Dijkstra算法生成成本场、积分场到最终向量场的核心原理,并结合分块、缓存及与DOTS/ECS架构集成的优化策略,实现了百人军团的流畅群体寻路。文章提供了完整的代码示例,助力开发者构建高性能的RTS寻路系统。

weixin_28363123的博客 587

App启动(一)Application的创建

大家都知道Java程序的入口是 main 方法,但在Android中我们只知道App启动从Application开始,而Android是基于Java的,本身也是从main方法开始的,而这个 main方法是在ActivityThread类的。下面我们就看下ActivityThread的main方法是如何工作的。 1. ActivityThread #main public static void main(String[] args){ ... //初始化Looper Looper.p

只影的博客 4990

计算机视觉三大顶会(ICCV/CVPR/ECCV)投稿指南与趋势解析

本文详细解析计算机视觉三大顶会(ICCV/CVPR/ECCV)的投稿指南与最新趋势。从基础认知到实战经验,涵盖时间线管理、选题策略、论文写作技巧及实验设计要点,帮助研究者提升投稿成功率。特别关注2024年技术融合、评估维度和伦理要求等前沿趋势,为计算机视觉领域的研究者提供实用建议。

weixin_29165725的博客 1843

四大组件的工作过程

Android系统中的四大组件是构成Android应用程序的基础。包括Activity、Service、BroadcastReceiver、ContentProvider。Android开发中无时无刻不在使用这四大组件。因此了解它们的工作过程能让我们对四大组件的理解更加深刻,同时对Android系统的认识更加清晰。

八归少年 1289

LoRa模块选型指南:正点原子ATK-LORA-01与SX1278芯片深度评测(含实测距离/功耗数据)

本文深度评测了正点原子ATK-LORA-01与SX1278芯片的性能表现,通过实测数据展示其在复杂环境中的通信距离与功耗表现。特别适合智慧农业、工业监测等物联网应用场景,提供详细的配置指南和优化技巧,帮助开发者实现高效、低功耗的LoRa通信解决方案。

weixin_29191081的博客 290

串并装换器的设计及仿真结果

串/并转换是高速数据流处理的重要技巧之一。串/并转换的实现方法多种多样,根据数据的的顺序和数量要求,可以选用寄存器,双扣RAM,SRAM,FIFO,等实现。对于 数量比较小的设计可以采用移位寄存器完成串/并转换。       在工程中,如何体现串/并转换的设计思想呢? 怎样才能提高系统的处理速度呢 ?       一个简单的串/并转换框架如下图所示,串行输入的数据通过FPGA内部的 n 个移

stubben_bear的专栏 2273

Android中的四大组件详解

Android中的四大组件详解 我们都知道Android系统应用层框架中,为开发者提供了四大组件来便于应用的开发,它们是Activity、Service、BroadcastReceiver、ContentProvider。 它们用于在应用开发过程中,不同场景的功能实现。 Activity:Activity是开发中最常用的,也是最复杂的一个组件。它是用户可以专注做一些事情的东西。它的主要功能就是可以和用户进行交互操作,所以几乎所有的Activity都会负责创建一个显示窗口,然后通过setContentView

joye123的博客 7562

告别‘火龙’:实测BES2800/RK2108等主流芯片,聊聊AI眼镜的功耗与散热‘内卷’实战

本文深入探讨了AI智能眼镜在功耗与散热方面的挑战,重点分析了恒玄BES2800和瑞芯微RK2108等主控芯片的能效表现。通过实测数据和优化策略,揭示了在6nm工艺、异构计算和系统级散热方案下的实战经验,为AI眼镜的功耗管理提供了实用解决方案。

weixin_30839881的博客 946

【学习】Android四大组件启动流程——ContentProvider的工作过程

ContentProvider的工作过程 ContentProvider启动的大致流程 当ContentProvider所在的进程启动时,ContentProvider会同时启动并被发布到AMS,这个时候ContentProvider的onCreate要先于Application的onCreate而执行 当一个应用启动时,入口方法为ActivityThread的main方法,它是一个静态方法,在main方法中会创建ActivityThread的实例并创建主线程的消息队列,然后在ActivityThread

m0_59162559的博客 805

WindowsServer2022蓝牙音频开启方法

为Windowsserver 2022 添加蓝牙音频驱动的方法和工具

thebestismin的专栏 2705

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Android进阶 四大组件的工作过程(四):ContentProvider的工作过程

本篇是介绍四大组件的最后一篇文章,前三篇文章里我们已经介绍了Activity,Service以及Broadcast的工作流程,那么这篇文章我们就来介绍内容提供器ContentProvider的工作流程。 前几篇文章: 1. [Android进阶 四大组件的工作过程(一):Activity的工作过程](https://blog.youkuaiyun.com/Tai_Monster/article/details/131146284?spm=1001.2014.3001.5502) 2. [Android进阶 四大组件的

Tai_Monster的博客 1135

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Android 11 ContentProvider启动流程分析

Android 11 ContentProvider启动流程分析 这一篇主要介绍一下ContentProvider的启动流程,并通过query方法为代表看一下整个操作方法的执行流程。ContentProvider的主要作用是实现数据共享的,它一般是配合ContentResolver 来使用的,我们通过ContentResolver配合URI就可以轻松访问ContentProvider暴露的数据了。ContentProvider作为四大组件之一,在平时开发中并没有其他三大组件使用的那么频繁。在开发过程中我们大

guojingbu的博客 1695

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Android四大组件的工作过程

Android四大组件的工作过程概述Activity的启动过程ServiceService的启动过程Service绑定过程ContentProviderContentProvider的启动过程ContentProvider的query过程BroadcastReceiver广播注册过程广播接收/发送过程 概述 这里只分析一般过程,不涉及具体的源码分析。 Activity的启动过程 很明显,Act...

Nigel_Zhou的博客 504

安卓开发-03-四大组件

Android开发的四大组件

ning_xiao_xuan的博客 4798

Android ContentProvider启动流程

概述 ContentProvider的启动其实是在App启动时就自动启动的,还不知道APP启动流程的,推荐看一下Android App启动过程,我们知道当一个App启动时,经历了以下步骤 首先是点击App图标,此时是运行在Launcher进程,通过ActivityManagerServiceBinder IPC的形式向system_server进程发起startActivity的请求 syste...

R.先森的博客 1397

从源码的角度理解四大组件的工作过程——Android开发艺术探索笔记

系统对四大组件的过程进行了很大程度的封装,日常开发中并不需要了解底层的工作原理,那么研究这些原理的意义在哪里呢? 如果你想在技术上更进一步,那么了解一些系统的工作原理是十分必要的,也是开发人员日后成长为高级工程师所必备的技术能力。 Android作为一个优秀的基于Linux操作系统,其内部一定

SparkYuan 2851

Android四大组件

仅供自己学习使用-转载请注明文中内容出自哪里(我已不知道哪里复制的) 目录 一、活动(Activity) 1.概念 2.生命周期 3.Intent 4.Activity启动模式和任务栈 二、服务(Service) 1.概念 2.生命周期 3.启动方式 三、广播接收者(Broadcast Receive) 1.概念 2.注册方式 四、内容提供者(Content Provider) 1.概念 2.用途 Android 系统的四大组件分别是:活动(activit...

小小怪大人物de博客 4896

【学习】Android四大组件启动流程(1)——Acticity的启动流程

学习于《Android开发艺术探索》,本文讲解了Activity的启动流程并给出了Activity的启动流程图

PanicLin的博客 531

【学习】Android四大组件启动流程——Acticity的启动流程

四大组件的运行状态 四大组件中除了BroadcastReceiver以外,其他三种组件都必须要在AndroidManifest注册,对于它来说,它既可以在AndroidManifest由可以代码动态注册。 在调用方式上,Activity、Service、BroadcastReceiver都需要借助Intent,而ContentProvider无需借助Intent Activity是展示型组件,扮演着一个前台界面的角色,用于向用户直接地展示一个界面,并且接受用户的输入信息从而进行交互。它是最重要的一种组件,对

m0_59162559的博客 689

android四大组件启动流程-ContentProvider启动流程(基于android 6.0)

前面已经介绍了Activity、Service、BroadcastReceiver的启动流程 Activity的启动流程:http://blog.youkuaiyun.com/newhope1106/article/details/53355189 Service启动流程:http://blog.youkuaiyun.com/newhope1106/article/details/53843809 Broadcas

newhope1106的博客 1489
上一篇: 【学习】Android四大组件启动流程(3)——BroadcastReceiver的工作过程
下一篇: 【Kotlin学习】Kotlin基础知识
Panic  Lin
博客等级 码龄6年 81粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值