android应用程序基本原理

android应用程序是用Java语言编写的。编译过后的字节码,以及应用程序要求的其他数据和资源文件,通过aapt工具被绑定在一起,称为 Android包,这是一个带.apk后缀的档案文件。这个文件也是用户下载到他们设备上的文件。所有的代码在一个单一的.apk文件中,组成一个“应用程序”。

从许多方面来说,每个Android应用程序存活在它们自己的世界中:

  • 默认地,每一个应用程序运行在它自己的Linux进程中。当应用程序的任何代码需要被执行时,Android启动进程;当不再需要时,或者系统资源被其他应用程序所要求时,关闭进程。
  • 每一个进程有它自己的Java虚拟机(JVM),因此应用程序代码独立与所有其他应用程序代码而运行。
  • 默认地,每一个应用程序被分配一个唯一的Linux用户ID。通过设置权限许可,应用程序的文件只对该用户可见,只对应用程序本身可见—虽然有办法将其导出到其他应用程序。

有可能安排两个应用程序共享同一用户ID,在这种情况下,它们可以彼此看见对方的文件。要保全系统资源,具有相同ID的应用程序也可以被组织起来运行在同一Linux进程中,共享同一VM。


激活组件:intents

当一个请求来自一个ContentResolver时,内容提供器被激活。其他三个组件----activities,services和 broadcast receivers----被名为intents的异步消息所激活。一个intent是一个Intent对象,持有消息的内容。对于activities 和services来说,它意味着位于其他事物中被请求的动作和指定要操作的数据的URI。例如,它可能会为一个activity传送一个请求以代表给用户的一个图片,或者让用户编辑一些文本。对于broadcast receivers,Intent对象意味着被公告/通知的动作。例如,它可能会通告有兴趣的相关方,相机的按钮被按下了。
有各自的方法来用于激活每一类组件:


通过传递一个Intent对象到Context.startActivity()或 Activity.startActivityForResult(),来启动一个activity(或者让做一些新的东西)。进行响应的 activity可以通过调用其getIntent()方法来查看引起它被启动的原始内容(intent)。Android调用该activity的 onNewIntent()方法来向其传递任何后续的intent。
一个activity经常启动下一个activity。如果它期望从它所启动的activity获得一个返回的结果,那么它就要调用 startActivityForResult()而不是startActivity()。例如,如果它启动一个让用户挑选照片的activity,那么它可能期望返回被选中的照片。结果在一个Intent对象中被返回,而该Intent对象被传递给进行调用的activity的 onActivityResult()方法中。


通过传递一个Intent对象给Context.startService(),一个service被启动(或者一个新的指令传达给正在运行的 service)。Android调用该service的onStart()方法并将Intent对象传递给它。相似地,将一个intent传递给 Context.bindService(),能够在进行调用的组件和目标service之间建立一个持续的连接。该service在一个 onBind()调用中接收该Intent对象。(如果该service还没有运行,bindService()能有选择地启动它。)例如,一个 activity可能会与音乐播放服务建立一个连接,这样它就能向用户提供控制播放的方式(一个用户接口)。该activity将调用 bindService()来建立这个连接,然后调用service所定义的方法来影响播放。(在稍后“远程过程调用RPC”一节会专门讲述 service)


应用程序能通过传递一个Intent对象到诸如 Context.sendBroadcast(),Context.sendOrderedBroadcast(),和 Context.sendStickyBroadcast()这些方法中来创建一个广播。Android通过调用它们的onReceive()方法发布该 Intent到所有感兴趣的broadcast receivers。(更多有关Intent的信息,在稍后一节“Intents and Intent Filters”中会专门讲述)


停止组件

一个内容提供器只有当它在响应来自一个ContentResolver的请求时是活动的。一个广播接收器只有当它在响应一个广播消息时是活动的。因此没有必要显式地关闭这些组件。
另一方面,activities提供用户接口。它们与用户处于一个长时间运行的会话中,并且可能保存有active,甚至在空闲时,只要会话在继续。相似地,services也可能持续运行很长时间。因此Android有方法以一种有序的方式来关闭activities和services。


通过调用其finish()方法来关闭一个activity。一个activity可以通过调用finishActivity()来关闭另一个activity(它使用startActivityForResult()方法启动的activity)。
通过调用其stopSelf()方法来停止一个service,或者通过调用Context.stopService()。
当组件不再被使用时,或者当Android必须为更多活动的组件而收回内存时,它们有可能被系统所关闭。在后面“组件的生命周期”一节中,将讨论这种可能性及更多地细节。


manifest文件

在Android能启动一个应用程序组件之前,它必须知道组件的存在。因此,应用程序在一个manifest文件中声明它们的组件。manifest文件被绑定在一个Android包中。Android包是一个.apk文件,它还持有应用程序的代码、文件和资源。


manifest是结构化的XML文件,并且对所有的应用程序来说,它总是被命名为AndroidManifest.xml。除了声明应用程序的组件之外,它还做很多事情,如命名应用程序需要链接到的库(除了默认的Android库之外),以及应用程序所期望被授权的任何权限验证。


但是manifest的首要任务是告知Android关于应用程序的组件。例如,一个activity可能被声明如下的内容:
<?xml version="1.0" encoding="utf-8"?>

<manifest  >
    <application >
        <activity android:name="com.example.project.FreneticActivity"
                  android:icon="@drawable/small_pic.png"
                  android:label="@string/freneticLabel"
                    >
        </activity>
    </application>

</manifest>
在这个manifest文件中,元素<activity>的name属性命名实现了activity的Activity类的子类。而icon和label属性则指向包含有一个图标和标签的资源文件,这些图标和标签可以被显示给用户以代表这个activity。

另一个组件以相似的方式被声明--<service>元素声明services,<receiver>元素声明 broadcast receivers,以及<provider>元素声明内容提供器(content providers)。不在manifest文件中声明的activities,services和content providers对系统是不可见的,相应地永远不会运行。然而,broadcast receivers既可以在manifest文件中声明,也可以在代码中(如BroadcastReceiver对象)动态地创建并通过调用 Context.registerReceiver()向系统注册。(更多详细内容,请参见后面的”AndroidManifest.xml文件”一节)



Intent过滤器(Intent filters)

一个Intent对象能显式地命名一个目标组件。如果这样的话,Android会查找那个组件(基于在manifest文件中的声明)并激活它。但是如果一个目标组件没有被显式地命名,Android必须定位最合适的组件来响应该Intent。它通过对Intent对象和潜在目标的intent filters的比较来完成这种定位。一个组件的intent过滤器告知Android该组件能够处理的intent种类。象其他组件的基本信息一样,它们是在manifest文件中声明的。下面是前面示例代码的一个扩展,为activity添加了两个intent过滤器。

<?xml version="1.0" encoding="utf-8"?>

<manifest  >
    <application >
        <activity android:name="com.example.project.FreneticActivity"
                  android:icon="@drawable/small_pic.png"
                  android:label="@string/freneticLabel"
                   >
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <intent-filter  >
               <action android:name="com.example.project.BOUNCE" />
                <data android:mimeType="image/jpeg" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
     </activity>    </application>

</manifest>

上面示例代码中的第一个过滤器—action“android.intent.action.MAIN”和 category“android.intent.category.LAUNCHER”—是一个通用的过滤器。它使得activity成为在应用程序启动器中显示出来的应用程序之一。应用程序启动器指的是显示(列出)用户可以在设备上启动的应用程序的屏幕。换句话说,这个activity是应用程序的入口,是用户在启动器中选择应用程序时看得见的最初的一个。
第二个过滤器声明一个该activity可以在一个特定类型的数据上执行的动作。
一个组件可以拥有任何数量的intent过滤器,每一个都声明一套不同的功能。如果没有任何过滤器,那么它只能被组件作为目标显式命名的intents所激活。
对于在代码中创建和注册的一个broadcst receiver,intent过滤器是直接作为一个IntentFilter对象创建的。所有其他过滤器都是在manifest中建立的。
【实战项目开发技术分享】如何设置机器人禁行区/虚拟墙 在现代机器人技术的日益发展中,路径规划是使机器人在复杂环境中安全、高效移动的关键部分。其中一个重要的问题是如何划定机器人的禁行区,以确保机器人不会进入危险区域或无法到达的地方。在本文中,我们将探讨一些关键策略,帮助机器人算法工程师更好地划定禁行区。代价地图可以通过多层叠加来实现,一般包括以下几个层级:静态地图层(Static Map Layer):由SLAM(Simultaneous Localization and Mapping)构建的静态地图。该层包含了环境中固定不变的地物信息,如墙壁、家具等。 阅读详情

相关推荐

数字IC后端设计实战:从floorplan到powerplan的优化策略

本文深入探讨了数字IC后端设计中从Floorplan到Powerplan的核心优化策略。文章强调了Floorplan作为布局基础的重要性,并详细解析了Powerplan规划,特别是针对低功耗设计中MTCMOS的应用与IR Drop分析。通过实战经验分享,提供了从模块摆放到电源网络构建、再到IR Drop问题层层递进的解决方案,旨在帮助后端工程师构建稳健高效的芯片物理设计。

weixin_28338005的博客 346

加壳原理

一、APP启动流程(结合源码分析) 当我们点击APP图标,到APP运行启动,中间经历了怎样的过程?可以用一张图来概括: 首先启动Activity/Service,(Activity、Service是什么?四大组件:Activity、Service、BroadCast Recevicer、Content provider),通知system_server进程,然后以Binder的方式通知Zygote进程,最终进入ActivityThread.main(),开始进入APP世界的大门。 我们打开http://

nini_boom的博客 1573

(OSTrack)Joint Feature Learning and Relation Modeling for Tracking A One-Stream Framework

Joint Feature Learning and Relation Modeling for Tracking A One-Stream Framework (OSTrack)

小火山的博客 1653

Android 系统基础

Android应用程序是用Java语言写的,通过aapt工具把应用程序所需要的任何数据、资源文件打包成apk文件,这个文件是一个将应用安装到手机上的一个载体。      有很多方式,每个Android应用程序存在于不同的世界:      (1)默认的,每个应用在他自己的linux进程中运行,当应用中的任何代码需要执行时Android就启动相应的进程,当不需要执行时并且系统资源被其他应用请求时a

lg878398509的专栏 1032

uniapp实战:mui-player插件如何完美适配m3u8/flv直播流(附完整代码)

本文详细介绍了如何在Uniapp中使用mui-player插件完美适配m3u8和flv直播流,提供从基础配置到高级优化的全流程解决方案。通过动态加载策略、响应式布局和内存管理,实现跨平台稳定播放,适用于企业级直播应用开发。

weixin_29001655的博客 235

光学薄膜设计入门:Essential Macleod中文版从安装到实战全攻略

本文为光学薄膜设计初学者提供Essential Macleod软件从安装部署到实战应用的全流程中文指南。详细解析了软件核心界面、材料管理及工作流程,并通过一个完整的宽带增透膜设计实例,手把手演示膜系构建、优化与分析方法,帮助用户快速掌握这一业界标杆工具,跨越理论与实操的门槛。

weixin_29309475的博客 981

android程序运行原理,Android应用的构成及应用原理

根据自己的浅学,及相关资料的查阅而进行的概括,也算自己的一点小体会吧!在学习任何语言或技术时,如果不去了解它的发展历史,及其运作原理是不会把这门技术掌握的,学习Java是这样,学习Android亦是这样,开始阶段要对每段代码进行研究,逐一分析每段代码表示什么意思,为什么要这么用,还可以怎样用,这样才能在以后的项目中对每一个技术点应用的游刃有余!Android应用采用java语言开发,但并不是直接将...

weixin_29669899的博客 742

Zigbee智能开关和单火取电技术

ZigBee智能开关(单火线)是在ZigBee协议基础上开发由单火线供电的开关,它可以控制各种类型负载的开关,如LED灯,白炽灯,荧光灯和钨丝灯等。配合相应的主机用户可以使用手机远程控制它,进而达到控制灯光开关的目的。它具有自组网功能,使用简单方便,给你的居家生活带来无线享受。可应用于家庭,办公,医院和酒店等场合。

danhuoxian的博客 1万+

android API 之应用程序的基本原理

关键字: isolation  隔离 Fundamentals 基本原理‘ sandbox 沙箱 安卓应用程序使用JAVA语言编写,使用Android SDK工具编译你的代码,并将数据与资源文件打包成能够在Android操作系统上安装的压缩包apk。应用程序一旦在系统上安卓成功,便运行在一个安全的并且属于自己的的沙箱中。安卓操作系统是一个多用户的linux系统,在这个系统中,一个APP对应

变 858

硬件电路设计采集电路

摘要:采集电路是硬件设计中连接物理世界与数字系统的关键环节,主要用于将温度、压力等物理量转换为电信号。常见的采集电路包括模拟量采集(如温度、电压)、数字量采集(如开关状态)和特殊信号采集(如光、声音)。设计时需重点关注传感器选型、信号调理、电源接地、抗干扰和ADC配置等核心要素,确保信号链路的完整性和稳定性。合理的电路设计需结合具体应用场景,通过仿真和测试验证性能,最终实现精确可靠的数据采集。

qq_37999850的博客 1797

直流母线电压采集与缓冲调理电路

本文介绍了一种直流母线电压采集与缓冲调理电路的设计与应用。该电路通过电阻分压网络将高压直流母线电压降至适合ADC采样的范围,并采用运放电压跟随器实现高输入阻抗和低输出阻抗的缓冲功能,有效提高采样精度和抗干扰能力。文章重点阐述了低输出阻抗对驱动负载、抗干扰和电压稳定的重要性,并列举了该电路在工业电源监测、电动汽车BMS、通信电源和储能系统等领域的典型应用场景。

qq_37999850的博客 316

Android 显示原理简介

转载文章,原文地址:http://djt.qq.com/article/view/987 作者:yearzhu,2011年进入腾讯公司,从事过Web端及移动端的测试工作,喜爱新鲜事物及新技术,目前在SNG开放平台测试组负责的移动互联SDK的测试工作。 现在越来越多的应用开始重视流畅度方面的测试,了解Android应用程序是如何在屏幕上显示的则是基础中的基础,就让我们一起看看小小屏幕中大大...

weixin_30663391的博客 512

AI Agent开发第85课-DeepSeek-OCR 安装全指南:从 Transformers 到 vLLM,手把手教你跑通企业级 OCR

本文系统讲解 DeepSeek-OCR 的两种部署方式——基于 Hugging Face Transformers 的标准推理与基于 vLLM 的高性能加速推理。详细说明 CUDA 与 PyTorch 版本匹配、环境验证、依赖安装等关键细节,并提供可直接运行的完整代码示例。无论你是单卡调试还是高并发服务部署,都能在这里找到清晰路径。

打造全国最全的AI Agent开发知识领域的博客 2541

【苦读官方文档】2.Android应用程序基本原理概述

官方文档原文地址应用程序原理Android应用程序是通过Java编程语言来写。Android软件开发工具把你的代码和其他数据、资源文件一起编译、打包成一个APK文件,这个文档以.apk为后缀,保存了一个Android应用程序所有的内容,Android设备通过它来安装对应的应用。一旦安装到设备上,每个Android应用程序就运行在各自独立的安全沙盒中: Android系统是一个多用户的Linux系统,

张拭心的博客 shixinzhang 3306

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

00-android app之 Application Fundamentals(应用程序基本原理)

自从工作以来一直做得都是android较为底层的东西,虽有时需要看看framework和app的东西,但是至今没有系统的学习一下android app的知识。反正闲着也是闲着,不如熟悉一下。不废话了,今天开始系统的学习app。     也没有什么现成的资料,就看着官方文档来吧! Building Your First App PreviousNextGet startedFirs

kaikai5545的专栏 525

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Android官网学习笔记002:应用程序基本原理(01)

###################  声明部分  ##################### 主要内容与来源:Google官网www.android.com 本人博客地址:http://blog.youkuaiyun.com/DrRiverZhu 声明:由于本文档为阅读Google官网www.android.com的Dev. Guide内容,并结合个人理解与总结所形成的。因此,很多内容均受个人能力与

River Zhu (朱川)'s Space 1162

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

深度探索Android应用程序的基本原理

Android应用程序是用Java语言编写的。编译过后的字节码,以及应用程序要求的其他数据和资源文件,通过aapt工具被绑定在一起,称为Android包,这是一个带.apk后缀的档案文件。这个文件也是用户下载到他们设备上的文件。所有的代码在一个单一的.apk文件中,组成一个“应用程序”。 从许多方面来说,每个Android应用程序存活在它们自己的世界中: q      默认地,每一个应用程序运

白璐 | 产品经理 2398

Android自学笔记:应用程序基本原理

1.Android应用程序是要用Java来开发的。Android使用 SDK中的appt工具将编译好的Java代码([b]这里要注意,Android程序执行的是转换后.dex格式的文件[/b])、应用程序所需要的数据、资源文件一起打成一个包,形成一个归档文件,这个归档文件后缀名为.apk。所谓归档文件就是说将不同种类的文件放在一起,并将它们“捆绑”起来,对它们进行统一的使用和管理。...

深夜未眠的专栏 224

Android API 学习日记----《应用程序的基本原理》

Application Fundamentals Android的应用程序是用java语言来编写的。Android的工具包的工具编写你的代码和任何数据和资源文件一起组成一个APK文件:一个以.apk为后缀的存档文件组成安卓包。一个APK文件包含所有的安卓应用程序的所有内容并且这个文件是安卓设备用来安装应用程序的文件。 一旦安装在设备上,每个应用程序都活动在自己的安全沙箱内: 这个

u010345160的专栏 1001

Android帮助文档翻译——开发指南(一)应用程序基本原理

Android应用程序是由JAVA编写的。Android的SDK工具把编写好的应用程序代码连同一些数据和资源编译成一个.apk后缀的Android应用程序包。包含在同一个apk文件里面的所有代码就当成是一个应用程序安装包,并可以在Android设备上进行安装。安装在Android设备上的每一个应用程序都运行于自己的安全砂箱中:Android操作系统是一个多用户Linux系统,每一个应用程序就相当于一个不同的用户;默认情况下,系统会为每一个应用程序分配一个只对系统可见而对程序不可见的Linux用户ID。系统为

3799

Android官网学习笔记003:应用程序基本原理(02)

###################  声明部分  ##################### 主要内容与来源:Google官网www.android.com 本人博客地址:http://blog.youkuaiyun.com/riverzhu 声明:由于本文档为阅读Google官网www.android.com的Dev. Guide内容,并结合个人理解与总结所形成的。因此,很多内容均受个人能力与水平

River Zhu (朱川)'s Space 1098

Android官网学习笔记004:应用程序基本原理(03)

###################  声明部分  ##################### 主要内容与来源:Google官网www.android.com 本人博客地址:http://blog.youkuaiyun.com/riverzhu 声明:由于本文档为阅读Google官网www.android.com的Dev. Guide内容,并结合个人理解与总结所形成的。因此,很多内容均受个人能力与水平

River Zhu (朱川)'s Space 1354

Android应用程序基本原理(3:进程与线程)

<br />2.3  进程与线程<br />当应用程序的第一个组件需要运行时,Android为它启动一个单线程执行的Linux进程。默认地,应用程序的所有组件运行在该进行和线程中。<br />不过,可以安排组件运行在其他的进程中,并且你可以为任何进程创建额外的线程。<br />2.3.1  进程<br />一个组件所运行在的进程是由manifest文件所控制的。组件元素--<activity>,<service>,<receiver>和<provider>--每个元素都有一个process属性用来指定组件应

zeng622peng的专栏 1189

一、Android应用程序的基本原理(Fundamentals [,fʌndə'mentlz])

  Android 应用程序以java作为编程语言。Android SDK工具把代码连同数据、资源文件一起编译成一个以.apk为后缀(suffix)的android 程序存档(archive)文件包。在一个单独的.apk文件中的所有代码被认为是一个应用程序,android 设备就是用.apk文件来安装应用的。   一旦在设备上安装了应用,应用程序就会驻留在它自己的安全沙箱中: androi...

weixin_30877755的博客 80
上一篇: 博客排版要注意的五个问题
下一篇: Android手机内存的运行机制
SleepInDelphi
博客等级 码龄19年 32粉丝 388原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值