手把手创建Android应用程序·案例程序分析

目录

1. Activity 组件 MainActivity 类

2.布局文件activity_main. xml

3.应用程序配置文件 AndroidManifest.xml

4.  Android的应用程序组件

4.1  Activity——活动

4.2  Service——服务

4.3  Broadcast receiver——广播接收器

4.4  Content provider——内容提供者


        在之前的文章中我们创建了一个Android项目Android_Demo01,实现了界面上显示一行文本信息“Hello world!”。下面我们将对这个项目中生成的代码及主要配置文件进行分析讲解,了解一个简单的Android应用程序的原理。

文章链接:手把手创建第一个 Android 项目-CSDN博客        

        Android_Demo01项目中主要包括1个布局文件(activity_main.xml),用于设计用户界面; 1个Activity组件(MainActivity类) ,用于实现用户界面交互功能及配置文件AndroidManifest.xml.

1. Activity 组件 MainActivity 类

代码如下:

package com.example.android_demo01;
import android.app.Activity; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.Menultem;

public class MainActivity extends Activity{
    @Override
    protected void oncreate (Bundle savedInstanceState) {
    super.onCreate (savedInstancestate);
    setContentView (R.layout.activity_main);
    }

@Override
    public boolean oncreateoptionsMenu (Menu menu){
    // Inflate the menu; this adds items to the action bar if it is present.             getMenuInflater().inflate (R.menu.main, menu)
    return true;
}

@Override
public boolean onOptionsItemSelected (MenuItem item){
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int iditem.getItemId();
    if (id == R.id.action_settings) 
     {
    return true;
    }
  return super.onoptionsItemSelected(item);
    }
}

        上面代码中的 MainActivity 类继承于 Activity 类, Activity 类是专门负责控制视图View与用户进行交互的活动类,可以理解为一个与用户交互的界面。当MainActivity启动时会调用该类的onCreate方法,从上面代码可以看出,在onCreate方法中,首先调用了父类的onCreate 方法,然 后使用 setContentView 方法可以加 载布局文件 activity_main.onCreateOptionsMenu 方法可以初始化 Activity 中的菜单,即加载菜单布局文件 main.xml:当用户点击菜单项时,会调用onOptionsitemSelected方法,在此方法中可以处理用户的点击事件。

2.布局文件activity_main. xml

代码如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent" android:layout_height-"match_parent" 
android:paddingBottom="@dimen/activity_vertical_margin" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="edimen/activity_vertical_margin" 
tools:context="com.example.android_demo2_1.MainActivity" >

<TextView
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:text="@string/hello_world" />

</RelativeLavout>

        上面代码中<RelativeLayout>标签表示界面顶层布局方式是相对布局,其属性"xmlns:android”指定命名空间,顶级元素必须指定命名空间。顶层布局内的<TextView>标签表示一个文本框控件,用来显示文本信息,其属性"layout_width"指定该元素的宽度,其中“match_parent”代表填满其父元素,对于顶级元素来说,其父元素就是整个手机屏幕。"wrap_content"代表该元素的大小仅包裹其自身内容;属性"android:text"表示文本框控件显示的内容。

3.应用程序配置文件 AndroidManifest.xml

代码如下:

<?xml version-"1.0" encoding-"utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.android_demo2_1"
    android:versionCode="1"
    android:versionName="1.0" >

<uses-sdk
    android:minsdkVersion="17"
    android:targetSdkVersion="17" />

<application
    android:allowBackup="true"
    android:icon-"@drawable/ic_launcher" android-lahel="Getring/app_name"
    android:theme="@style/AppTheme" 
    <activity
        android:name=".MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" /> 
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>
</manifest>

        AndroidManifest.xml 是每个 Android 程序中必须的文件,它位于整个项目的根目录,描述了应用程序包中暴露的组件(Activity、 Service等),它们各自的实现类,各种能被处理的数据和启动位置.AndroidManifest.xml除了能声明程序中的Activity、 Service、ContentProviders和Intent Receivers之外,还能指定permissions(声明权限)和instrumentation(安全控制和测试)。

上面AndroidManifest.xml文件中各个标签的含义如下:

(1)第一层<Manifest>(属性)

xmlns:android

        定义Android命名空间,一般为"http://schemas.android.com/apk/res/android" ,这样使得Android中各种标准属性能在文件中使用,提供了大部分元素中的数据。

package

        指定本应用内 Java 主程序包的包名,也是一个应用进程的默认名称。

versionCode

        用于设备程序识别版本(升级),必须是一个int类型的值,代表程序更新过多少次。

versionName

        这个名称是给用户看的,你可以将你的应用程序版本号设置为 1.1 版,后续更新版本设置为 1.2、2.0 版本等。

(2)第二层<Application>属性

        一个AndroidManifest.xml中必须含有一个<Application>标签,这个标签声明了每一个应用程序的组件及其属性(如icon、label、 permission等)。

android:description/android:label

        此两个属性都是为许可提供的.均为字符串资源,当用户夫看许可列表(andrnid-lahel)或者某个许可的详细信息(android:description)时,这些字符串资源就可以显示给用户。

android:ico

        声明整个应用程序的图标。

android:name

        为应用程序所实现的Application子类的全名。当应用程序进程开始时,该类在所有应用程序组件之前被实例化。

android:theme

        一个资源的风格,它定义了一个默认的土题风格给所有的 Activity,类似 style。

(3)第三层<Activity>属性

android:label

Activity 的名称

android:name

表示该Activity 显示的标题

(4)第四层<intent-filter>属性

<intent-filter>内会设定的内容包括 action、 data与 catcgory二种。

action 属性

        只有“android:name”这个属性。常见的“android:name”值“android.intent.action.MAIN”,表明此 Activity 是作为应用程序的入口。

category 属性

        常见的“android:name”值为"android.inent.category.LAUNCHER” ,决定应用程序是否显示在程序列表里。

(5)第二层<uses-sdk />属性

描述应用所需的API Level,即版本,在比属性中可以指定支持的最小版本, 目标版本以及最大版本。

4.  Android的应用程序组件

        Android 的一个核心特性就是一个应用程序可作为其他程序中的元素(那些允许这样的应用程序提供)。例如,如果你的程序需要用某些控件来编辑一些图片,另一个程序已经开发出了此项功能,且可供其他程序使用,你就可以直接调用那个程序的功能,而不是自己再开发一个。为了能够实现这样的功能, Android系统必须能够当在需要应用程序中任何一部分的时候启动它的进程,并且实例化那部分的Java 对象。为此,不像大多数其他系统中的程序, Android程序不是只有单一的进入点(如没有main方法),而是它们拥有系统实例化和运行必须的组件。

        在之前文章我们学习了如何创建一个 Android 应用程序,并了解了 Android 的应用程序结构,接下来我们要学习Android应用程序中的四个重要组成部分,也就是我们一般所说的“应用组件” ,即Android的四大应用程序组件。

4.1  Activity——活动

        Activity为用户提供了 个可视的用户界面。比如, 个短信程序可能有 个activity用来显示可以发送信息的联系人,第二个 activity 用来向选中的联系人写消息,其他的 activity用来查看以前的消息,或者更改设置。虽然应用程序中的各个activity所提供的用户界面聚合性很强,但是每个activity都独立于其他的activity,每一个实例化的activity都是Activity的子炎。

        一个应用程序由一个或多个 activity 组成,需要多少个,取决于应用程序和它的设计。典型的,当应用程序启动的时候,activity 中的一个要首先、显示给用户。从一个activity移动到另一个,是用过当前的 activity 启动下一个来完成的。

        每个activity都有一个默认的窗口。一般的情况是,这个窗口填满屏幕,但是他也可以小十屏幕和浮动到其他窗口的上面。窗口中的可视内容被一系列层次的视图(view,派生目View 类的对象)提供。每个视图都控制了窗口中的 一个矩形区域。父视图包含和组织子视图的布局。Android 提供了很多现成的视图供我们使用,包括按钮,文本框,滚动条,菜单项,复选框还有更多。整个视图层次通过 Activity.setContentView()方法放到 activity 的窗口上。

4.2  Service——服务

        service没有用户界面,但它会在后台一直运行。例如, service可能在用户处理其它事情的时候播放背景音乐,或从网络上获取数据。每个 service 都扩展自类 Serivce。

        多媒体播放器播放音乐是应用 service 的一个非常好的例子。多媒体播放器程序可能含有一个或多个 activity,用户通过这些 activity 选择并播放音乐。然而,音乐回放并不需要一个 activity 来处理,因为用户可能会希望音乐一直播放下去,即使退出了播放器去执行其它程序。为了让音乐一直播放,多媒体播放器 activity 可能会启动一个 service 在后台播放音乐。 Android系统会使音乐回放service一直运行,即使在启动这个service的activity退出之后。

        应用程序可以连接到一个正在运行中的service。当连接到一个service后,可以使用这个service向外暴露的接口与这个 service 进行通信。对于上面提到的播放音乐的service,这个接口可能允许用户暂停,停止或重新播放音乐。与activity以及其它组件一样, service同样运行在应用程序进程的主线程中。所以它们不能阻塞其它组件或用户界面,通常需要为这些 service派生一个线程执行耗时的任务。

4.3  Broadcast receiver——广播接收器

        broadcast receiver不执行任何任务,仅仅是接受并响应广播通知的一类组件。大部分广播通知是由系统产生的,例如改变时区,电池电量低,用户选择了一幅图片或者用户改变了语言首选项。应用程序同样也可以发送广播通知,例如通知其他应用程序某些数据已经被下载到设备上可以使用。

        一个应用程序可以包含任意数量的boradcast reveiver来响应它认为很重要的通知。所有的 bvadcast icucivei 都扩展白类 DuadcastReucivei.

        broadcast receiver不包含任何用户界面。然而它们可以启动一个 activity以响应接受到的信息,或者通过 NotificationManager 通知用户。可以通过多种方式使用户知道有新的通知产生,如闪动背景灯、震动设备、发出声音等。通常程序会在状态栏上放置一个持久的图标,用户可以打开这个图标并读取通知信息。

4.4  Content provider——内容提供者

        应用程序可以通过content provider访问其它应用程序的一些私有数据,这是Android提供的一种标准的共享数据的机制。共享的数据可以是存储在文件系统中、SQLite 数据库中或其它的一些媒体中。content provider扩展自ContentProvider类,通过实现此类的一组标准的接口可以使其它应用程序存取由它控制的数据。然而应用程序开个会直接调用ContentProvider中的方法,而是通过类ContentResolver. ContentResolver能够与任何一个ContentProvider通信,它与ContentProvider合作管理进程间的通信。

        任何时候当Android系统收到一个需要某个组件进行处理的请求的时候, Android会确保处理此请求的组件的宿主进程是否已经在运行,如果没有,则立即启动这个进程,当请求的组件的宿主进程已经在运行,它会继续查看清求的组件是否可以使用,如果不能立即使用,它会创建一个请求的组件的实例来响应请求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/115759.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

React 项目结构小结

React 项目结构小结 简单的记录一下目前 React 项目用的依赖和实现 摸索了大半年了大概构建一套用起来还算轻松的体系……&#xff1f;基本上应该是说可以应对大部分的项目了 使用的依赖 目前项目还在 refactoring 的阶段&#xff0c;所以乱得很&#xff0c;这里是新建一个…

【使用Python编写游戏辅助工具】第一篇:概述

引言 欢迎阅读本系列文章&#xff0c;本系列将带领读者朋友们使用Python来实现一个简单而有趣的游戏辅助工具。 写这个系列的缘由源自笔者玩了一款游戏。正巧&#xff0c;笔者对Python编程算是有一定的熟悉&#xff0c;且Python语言具备实现各种有趣功能的能力&#xff0c;因…

基于单片机的可穿戴个人健康监测仪-智能手环

收藏和点赞&#xff0c;您的关注是我创作的动力 文章目录 概要 一、方案的设计与论证2.1设计任务及要求2.2 模块技术和方法综述2.3 设计可能遇到的困难 二、 系统总体框架3.1 硬件设计 三 软件部分4.1 主程序流程框 四、 结论五、 文章目录 概要 近几年智能化的不断发展&#…

3000 台 Apache ActiveMQ 服务器易受 RCE 攻击

超过三千个暴露在互联网上的 Apache ActiveMQ 服务器容易受到最近披露的关键远程代码执行 (RCE) 漏洞的影响。 Apache ActiveMQ 是一个可扩展的开源消息代理&#xff0c;可促进客户端和服务器之间的通信&#xff0c;支持 Java 和各种跨语言客户端以及许多协议&#xff0c;包括…

HiveSQL中last_value函数的应用

一、背景 在以下数据中如何实现对每一个列按照更新时间取最新的非null值&#xff1f; 1 a a null 202301 202301 1 b b null null 202302 1 null c null null 202303 1 d null null null 202304如何实现…

Nginx的location优先级和重定向

Nginx的location有优先级级和匹配方式&#xff1a; 在http模块有server,在server模块才有location,location匹配的是uri /test /image 在一个server当中有多个location,如何来确定匹配哪个location。 Nginx的正则表达式&#xff1a; ^:字符串的起始位置 $:字符串的结束位…

Spring Boot 常见面试题

目录 1.Spring Boot 快速入门什么是 Spring Boot&#xff1f;有什么优点&#xff1f;Spring Boot 与 Spring MVC 有什么区别&#xff1f;Spring 与 Spring Boot 有什么关系&#xff1f;✨什么是 Spring Boot Starters?Spring Boot 支持哪些内嵌 Servlet 容器&#xff1f;如何设…

【Excel密码】四个方法,设置excel表格只读模式

Excel文件想要设置成只读模式&#xff0c;其实很简单&#xff0c;今天给大家分享四个excel设置只读模式的方法。 方法一&#xff1a;文件属性 右键点击文件&#xff0c;查看文件属性&#xff0c;在属性界面&#xff0c;勾选上只读属性就可以了。 方法二&#xff1a;始终以只读…

微信-Native支付(扫二维码支付)工具类 2023最新保姆教程

0、照着微信开发文档 取到证书、秘钥等 好几个key 1、获取商户号merchantId 账户中心->商户信息->微信支付商户号 3、获取商户证书序列号merchantSerialNumber 账户中心->API安全->API证书管理 5、获取appID 产品中心->AppID账号管理 1、这个链接教你获取各…

基于卷积神经网络的抗压强度预测,基于卷积神经网络的抗折强度预测

目录 背影 卷积神经网络CNN的原理 卷积神经网络CNN的定义 卷积神经网络CNN的神经元 卷积神经网络CNN的激活函数 卷积神经网络CNN的传递函数 卷积神经网络CNN抗压强度预测 完整代码:基于卷积神经网络的抗压强度和抗折强度预测,基于CNN的抗压强度和抗折强度预测(代码完整,数据…

CAN报文的信号和信号组传递的意义

CAN将数据发送到COM层&#xff0c;在这个过程中报文是如何传递的&#xff1f; 0x105指的是一帧CAN报文&#xff0c;信号组指的是一帧CAN报文里的所有数据&#xff0c;信号指的是一帧CAN报文里的每一个信号&#xff0c;PDU代表了一帧CAN报文&#xff0c;它由报文ID&#xff08;I…

MySQL(7):单行函数

不同DBMS函数的差异 内置函数&#xff1a; 系统内置的通用函数。 自定义函数&#xff1a; 根据自己的需要编写的函数。 大多数 DBMS 使用&#xff08;||&#xff09;或者&#xff08;&#xff09;来做拼接符&#xff0c;而在 MySQL 中的字符串拼接函数为concat()。 大部分 D…

Kafka(二)消息系统设计

文章目录 前言整体设计时序图时序图解释 最后 前言 当多个系统之间通过Kafka来解耦时&#xff0c;在系统设计初期&#xff0c;基本的要求都是相似的&#xff0c;只不过是消费消息时的业务逻辑可能不同。 本文以业务系统和邮件系统解耦作为示例。业务系统需要发送邮件时&#…

后端接口接收对象和文件集合,formdata传递数组对象

0 问题 后端接口需要接收前端传递过来的对象和文件集合&#xff1b;对象中存在数组对象 1 前端和后端 前端只能使用formdata来传递参数&#xff0c;后端不使用RequestBody注解 2 formdata传递数组对象 2.1 多个参数对象数组 addForm: {contactInfo: [{contactPerson: ,…

黑客入门 15 个必杀技能!

互联网新兴技术不断涌现&#xff0c;在给人类带来巨大财富和便捷的同时&#xff0c;也带来了非常严峻的网络安全问题。 侵害个人隐私、侵犯知识产权、网络犯罪等时有发生&#xff0c;网络监听、网络攻击、网络恐怖主义活动等成为**全球公害。 习主席在全国网络安全和信息化工…

[Docker]四.Docker部署nodejs项目,部署Mysql,部署Redis,部署Mongodb

一.部署nodejs项目,映射端口,挂载数据卷 可以到https://hub.docker.com/去搜索node镜像,然后下载,也可以直接通过docker pull node下载镜像,然后用这个node镜像启动容器node,这样系统就集成了node服务了,在这里挂载www/node目录到容器中,并指定端口映射,运行nodejs程序,安装npm…

PMIC、电源管理MAX77646ANP、MAX77647AANP、MAX77675AEWE、MAX77847AEWL DC-DC 开关稳压器

一、MAX77646ANP、MAX77647AANP 低IQ SIMO PMIC支持原电池应用的1.8V工作电压 MAX77646/MAX77647为尺寸和效率至关重要的低功耗应用提供电源解决方案。该IC集成单电感多输出(SIMO)降压/升压稳压器&#xff0c;可通过单个电感提供三个可独立编程的电源轨&#xff0c;尽可能地减…

原地封神!一个只用套模板即可制作电子相册的网站

对于忙碌的年轻人来说&#xff0c;一键操作的模板意味着无需复杂的操作步骤&#xff0c;就能轻松制作出精美的电子相册。 但是一个好的工具也是事关重要&#xff0c;最近发现了一款非常适合年轻人的模板---FLBOOK在线制作电子杂志平台&#xff0c;只需要找到合适的模板即可制作…

计算虚拟化2——内存虚拟化

目录 物理机内存访问过程 虚拟地址VA和物理地址PA概念 MUU实现VA到PA所使用的映射表 内存虚拟化类型 内存软件辅助虚拟化 内存硬件辅助虚拟化 内存虚拟化-内存超分配 内存共享 内存置换 内存气泡 物理机内存访问过程 内存的基本知识 内存都是从物理地址0开始的&…

2023腾讯云双11优惠3年轻量2核2G4M服务器366.6元,三年价哦!

腾讯云3年轻量应用服务器配置为2核2G4M带宽、50GB SSD系统盘双11优惠价格366.6元三年、108元一年&#xff0c;只是限制月流量&#xff0c;套餐自带300GB月流量。腾讯云百科txybk.com分享2023腾讯云双11优惠活动3年轻量2核2G4M带宽优惠价格、购买条件&#xff1a; 3年轻量2核2G…