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

news2025/1/8 2:35:32

目录

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会确保处理此请求的组件的宿主进程是否已经在运行,如果没有,则立即启动这个进程,当请求的组件的宿主进程已经在运行,它会继续查看清求的组件是否可以使用,如果不能立即使用,它会创建一个请求的组件的实例来响应请求。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VulnHub DC-4

一、信息收集 1.nmap扫描 ┌──(root&#x1f480;kali)-[~/routing] └─# nmap -sS -A 192.168.103.194/24发现开放了22、80端口 ┌──(root&#x1f480;kali)-[~/routing] └─# nmap --scriptvuln -p22,80 192.168.103.194--scriptvuln 是nmap中script模块&#xff0…

CoT进阶:Self Consistency, Least-to-most

CoT进阶 一&#xff1a;Self Consistency1.1 方法简介1.2 实验1.3 结果 二&#xff1a;Least-to-most2.1 方法简介2.2 示例2.3 结果 一&#xff1a;Self Consistency 题目: SELF-CONSISTENCY IMPROVES CHAIN OF THOUGHT REASONING IN LANGUAGE MODELS 机构&#xff1a;Google …

GitLab CI/CD 持续集成/部署 SpringBoot 项目

一、GitLab CI/CD 介绍 GitLab CI/CD&#xff08;Continuous Integration/Continuous Deployment&#xff09;是 GitLab 提供的一种持续集成和持续部署的解决方案。它可以自动化软件的构建、测试和部署过程&#xff0c;以便开发者更快地、更频繁地发布可靠的产品。 整体过程如…

检查AirPods的电量至少有六种方法,难易明细的都有

本文提供了六种方法,包括使用iPhone或iPad、询问Siri以及检查AirPods手机壳本身的多种选项。 如何使用保护壳检查AirPods的电池 一个简单的方法是查看AirPods保护壳上的指示灯,以获取电池电量信息;这个选项没有其他选项那么详细。 把耳塞放进盒子里,然后检查一下灯的颜色…

混合整数非线性规划求解器SCIP初探

简介 SCIP是目前最快的混合整数线性规划(mixed integer programming,MIP)和混合整数非线性规划(mixed integer nonlinear programing, MINLP)的求解器之一。到本文记录时&#xff0c;SCIP的版本已经到了8.0.4。 SCIP可以使用不同的编程语言来访问&#xff0c;对于Python有官方…

【多线程】线程的创建

创建线程如下几个方法&#xff1a; 目录 继承Thread类 调用start方法启动线程 调用run方法 实现Runnable接口 实现Callable接口 继承Thread类 调用start方法启动线程 public class TestThread extends Thread{//继承Thread类//重写run方法public void run(){for(int i0…

C#文件操作从入门到精通(3)——Txt文件读写操作

前言: 我们在开发c#程序时,经常需要对txt文本文件进行操作,有时候是读取txt文本中的内容,有时候是将程序运行过程中的一些数据写入到txt文本中做记录,为了帮助大家学习txt文本的操作,我特意开发了一个“txt文件操作学习”winform小软件,该软件调用了我封装的txt文件操作…

[尚硅谷React笔记]——第9章 ReactRouter6

目录&#xff1a; 课程说明一级路由重定向NavLink高亮useRoutes路由表嵌套路由路由的params参数路由的search参数路由的state参数编程式路由导航useRouterContextuseNavigationTypeuseOutletuseResolvedPath()总结项目地址 1.课程说明 概述 React Router以三个不同的包发布…

【C++】红黑树模拟实现STL中的map与set

红黑树里面具体存的是什么类型的元素&#xff0c;是由模板参数 T 来决定&#xff1a; 如果 T 是 Key 那么就是 set。 如果 T 是 pair<const Key, V>&#xff0c;那么就是 map。 1、定义红黑树的节点结构 // 定义红黑颜色 enum Colour {RED,BLACK };template<class …

memcpy()之小端模式

函数原型 void memcpy(voiddestin, const void *src, size_t n); 功能 由src指向地址为起始地址的连续n个字节的数据复制到以destin指向地址为起始地址的空间内。 头文件 #include<string.h> 返回值 函数返回一个指向dest的指针。 例1&#xff1a;如果用来复制字…

wordpress版本识别

wordpress版本识别 1.通过RSS Feed识别 RSS Feed参考 访问网站/feed或者?feedrss 例如 默认结构&#xff1a;https://www.example.com/?feedrss2 其他结构&#xff1a;https://www.example.com/feed/ 返回结果中搜索 generator 可以看到直接是5.9.7版本 2.wpscan等工具扫一…

Java8 Stream API全面解析——高效流式编程的秘诀

文章目录 什么是 Stream Api?快速入门流的操作创建流中间操作filter 过滤map 数据转换flatMap 合并流distinct 去重sorted 排序limit 限流skip 跳过peek 操作 终结操作forEach 遍历forEachOrdered 有序遍历count 统计数量min 最小值max 最大值reduce 聚合collect 收集anyMatch…

用WebStorm运行VUE项目

提示&#xff1a;原来用VS Code开Vue&#xff0c;可是VS Code用Ctrl打不开国际化&#xff0c;下载推荐插件也不好使 文章目录 下载WebStorm运行WebStorm实用插件 下载WebStorm 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; https://www.jetbrains.com/webs…

国家管网集团古浪—河口天然气联络管道工程实现投产

10月26日&#xff0c;国家管网集团古浪—河口天然气联络管道工程实现“绿色”投产&#xff0c;进一步完善西北地区多通道供气网络&#xff0c;对于推动甘肃省“一核三带”新发展格局构建、提高“全国一张网”在甘青地区的供应保障能力具有重要意义。 古浪—河口天然气联络管道…

SpringBoot条件注解底层原理

一、简介 相信大家在学springBoot自动装配的时候会遇到下面这些条件注解&#xff0c;当存在其指定的条件&#xff0c;才会把对应的bean注入到IOC容器中。本博客旨在揭开其神秘的面纱&#xff01; 其实说白了&#xff0c;springBoot的这些注解只是针对普通spring框架中Conditi…

JSP 学生成绩查询管理系统eclipse开发sql数据库serlvet框架bs模式java编程MVC结构

一、源码特点 JSP 学生成绩查询管理系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;比较流行的servlet框架系统具有完整的源代码和数据库&#xff0c;eclipse开发系统主要采用B/S模式 开发。 java 学生成绩查询管理系统 代码下载链接…

CorelDRAW2023最新版本号24.5.0.731

CDR2023是一款近年来备受瞩目的工具软件&#xff0c;它提供了数据存储、分析以及处理的能力。但是&#xff0c;对于许多用户来说&#xff0c;CDR2023到底好用不好用还需要进行深入的分析和探讨。在本文中&#xff0c;我们将从多个角度分析CDR2023这款软件。 CorelDRAW2023版win…

【JMeter参数化】上一个接口返回作为下一个接口入参

前言: 实际工作场景当中,比如获取到商品列表,并查看商品详情。如果将商品id写死,就很笨拙。所以我们可以进行参数化动态去更新商品id 目录 场景1:接口A仅取一个值,作为接口B的入参 场景:接口A是获取教师列表中某个教室的id,接口B是查看该教师的详情页步骤: 1.获取接口…

DC系列 DC:4

DC:4 靶机 文章目录 DC:4 靶机信息收集IP端口收集网页信息收集网站信息收集bp爆破 反弹shellnc反弹 内网信息收集收集jim用户的密码密码爆破 Charles用户密码收集 提权teehee提权 备注 信息收集 IP端口收集 用arp-scan 网段锁定ip nmap对端口服务进行详细扫描nmap -p- -sV …

图片复制上传,拖拽输入框上传,el-upload自定义上传方法(上传和备注框强关联)

1. 效果图&#xff1a; 2. 复制图片使用的方法&#xff1a; 1.通过监听paste方法&#xff0c;获取复制内容2.获取复制内容中的clipboardData3.获取file文件进行上传 <input paste.native"handlePaste" />handlePaste(value){let files value.clipboardData…