每个Android项目都有一个名为AndroidManifest.xml的文件,包含了Android系统运行前必须掌握的相关信息,如应用程序名称、图标、应用程序的包名、组件注册信息和权限配置等。
Android以Java作为编程语言,因此其程序文件以.java作为扩展名。Java程序文件位于src文件夹的某个包内。
在Android项目中,有字符串、位图、布局等资源,可以将其划分为三种类型:XML文件、位图(图像)文件、raw(声音)文件。
在Android项目中,有两个用于存放资源文件的文件夹,分别为res和assets。其中,res文件夹内的资源文件最终被打包到编译后的.java文件中,res文件夹内不支持深度的子目录;assets文件夹中的资源文件不会被编译,而是直接打包到应用中,assets文件夹支持任意深度的子目录。res文件夹内的资源文件可以通过R资源类访问,而assets文件夹内的资源文件则不能。
布局文件夹res/layout用来存放扩展名为.xml的布局文件,由某种布局管理器管理的若干控件对象组成,供Activity组件使用。
值文件夹res/values里的strings.xml是非常重要的文件,通常存放着布局文件中控件对象的属性值。
国际化是指在软件设计过程中将特定语言及区域脱钩的过程,当软件移植到不同的语言及区域时,软件本身不需要做任何的修改。
Android SDK并没有提供给专门的API来实现国际化,而是通过对不同的资源文件进行不同的命名来达到国际化的目的 。
比如控件值来源于文件res/values/strings.xml,通过键名hello来引用,就是符合国际化的做法。如在布局文件中,定义文本框控件的代码:
<TextView ...android:text="@string/hello" />
如果不通过引用字符串变量的方式,而是直接把字符串常量写在TextView控件的android:text属性后,这种写法对程序运行没有任何影响,只是不符合国际化的做法,其代码如下:
<TextView ...android:text="字符串常量" />
每个Android应用项目都有一个图标,默认使用的图标文件是ic_launcher是一个绿色的机器人,文件格式是.xml,存放在文件夹res/mipmap里。
更改Android应用默认图标的两种方法:
(1)右击mipmap→New→Vector Asset→Clip Art。
(2)先将.png格式的文件,复制到文件夹res/drawable中,然后通过R文件引用该图像文件。
项目使用的音频文件,通常存放在res/raw文件夹里。
在Android Studio开发中,有时希望把多个相关联的应用集合在一个项目里,使用Android Studio提供的多模块功能可以做到这一点。
在一个已经创建好的项目里,创建一个新模块的操作方法是:File→New→New Module。创建New Module的方法与创建项目的步骤基本相同,只是New Module的名称取代了项目名称。
创建项目时,自动生成的app实质上就是一个Module,它会调用后来创建的Module。在工具栏里,可以选择不同的Module单独进行调试和安装。
根据Android应用程序的功能,组件可划分为四类核心组件:Activity、Service、BroadcastReceiver和ContentProvider。Android四大组件都需要在项目清单文件中使用相关标签进行注册。
Activity负责用户界面的设计,是Android最重要的组件。Activity用户界面框架采用MVC模式(Model View Controller)。控制器负责接受并响应程序的外部动作,通过视图反馈应用程序给用户的信息(UI界面反馈),模型是应用程序的核心,用于保存数据和代码。Activity组件在清单文件中使用标签注册
Service是Android提供的无用户界面、长时间在后台运行的组件。Android提供了许多系统服务程序。Service组件在清单文件中使用标签注册。
在Android系统中,当有特定事件发生时就会产生相应的广播,如开机启动完成、收到短信、电量改变、网络状态改变等。
BroadcastReceiver(广播接收者)接收来自系统或其他应用程序的广播,并做出回应。BroadcastReceiver没有UI界面,在清单文件中使用标签注册。
ContentProvider组件可以在无须了解数据来源、路径的情况下,对共享数据进行查询、添加、删除和更新等操作。ContentProvider组件在清单文件中使用标签注册。
当Android程序启动时系统会创建一个Application类型的对象,用来存储系统的一些信息完成数据传递、共享和缓存等操作。Application对象的生命周期是整个程序中最长的,等于这个程序的生命周期,且是全局的、单例的,即在不同的Activity和Service中获得的对象都是同一个对象。
Activity和Service都是Context的子类,通过Context提供的方法getApplicationContext()就能获得Context对象。通过Intent对象,Activity组件之间可以相互调用,实现有参数传递或返回值的调用。
BroadcastReceiver和ContentProvider并不是Context的子类,其所持有的Context都是由其他组件传递过来的。在Activity和Service组件里发送广播,均需要使用Intent对象。
Android组件及通信机制如下图:
Intent是一种轻量级的进程间通信机制,让跨进程组件通信和发送系统广播成为可能,组件Activity、Service和BroadcastReceiver都是通过消息机制被启动(激活)的,其使用的消息就封装在对象Intent里。
Content是一个抽象类且是Activity的超类,提供了startActivity()方法,并以Intent对象作为参数,用于实现窗体的跳转。
在Android中,调用其他应用的动作名称由众多的类提供,也可以自定义。Android系统提供的常用意图动作名称如下表:
方法名 | 功能描述 |
---|---|
Intent.ACTION_MAIN | 标识Activity为一个程序的开始,参见清单文件中对主Activity的定义 |
Intent.ACTION_DIAL | 调用系统提供的拨号程序 |
Intent.ACTION_CALL | 呼叫指定的电话 |
Intent.ACTION_SENDTO | 发短信、E-Mail等 |
Intent.ACTION_VIEW | 浏览网页、地图、播放多媒体等 |
Intent.ACTION_WEB_SEARCH | 网络搜索 |
Intent.ACTION_BATTERY_CHANGED | 检查手机电量情况 |
Intent.ACTION_REQUEST_ENABLE | 蓝牙当前是否可用 |
在一个Android应用程序开始运行的时候,会单独启动一个进程(Process)。默认情况下,这个应用程序的所有组件都会运行在这个进程里。
一个Android应用程序通常由多个Activity组成,但只有一个主Activity。在项目清单文件中使用标签注册主Activity时,还需要内嵌、和标签,以此说明该Activity为应用程序的入口。以下代码是定义一个MainActivity.java为应用的主Activity代码:
<activity
android:name="packname.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>
系统拨号程序可以理解为系统预先定义的一个Activity,通过Intent对象去激活,步骤如下:
(1)在项目的布局文件里,添加一个名为call_btn的Button控件
(2)在MainActivity程序的onCreate()方法里,添加如下代码:
//先找控件,后设置监听器(使用匿名内部类创建监听器对象)
findViewById(R.id.call_btn).setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
//创建意图对象
Intent intent = new Intent();
//调用系统的界面程序
intent.setAction(Intent.ACTION_VIEW);
//intent.setAction(Intent.ACTION_DIAL); //调用系统的拨号程序
//根据数据类型打开相应的Activity(拨号程序)
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);
}
});
android.weiget.Toast类用于实现消息提醒,其信息在显示几秒后自动消失,只能以程序代码的方式设计。
Toast的静态方法makeText(Context,CharSequence,int)用于创建一个Toast对象,三个参数分别为:
①上下文对象,表示在哪个Activity里显示
②要显示的字符串信息
③显示的时长,可使用类常量Toast.LENGTH_LONG或Toast.LENGTH_SHORT,也可使用以毫秒为单位的正整数
通常先使用makeText()方法创建一个Toast对象,再使用show()方法显示某个Activity。在使用show()前,可以使用setGravity(int,int,int)方法设置显示位置,如果不设置,则默认出现在手机屏幕偏下的位置。
Toast.makeText(this,"显示信息",Toast.LENGTH_LONG).show(); //this表示当前Activity的上下文
Android系统运行应用程序时会产生一些日志(Log)信息,按照级别从低到高的顺序划分为Verbose(详细)、Debug(调试)、Information(信息)、Warning(警告)和Error(错误)等不同级别。
如果Android程序运行时闪退,则表明程序遇到了致命的错误。打开Logcat控制台,选择日志级别为Error,可获取错误信息。也可以通过查看Run控制台,找到出错的原因。
Log是一个Android类,提供了产生不同级别日志信息,方法有v(string,string)、d(string,string)、i(string,string)、w(string,string)、e(string,string)。其中第一个参数是用户自定义方便筛选的标签,第二个参数是需要输出的信息。
在Android Studio环境中,也可以通过设置断点、检查变量值的方式来检查错误,适用于程序错误的快速精确定位。
单击某行行号阴影区域即可设置断点,将产生一个断点标记。再次点击可以取消。
点击工具栏上的爬虫图标,将以Debug方式运行程序,在各个断点处暂停程序运行并显示内存变量值。单击向下图标,可以以单步方式运行程序。
本篇文章参考书籍有:
《Android Studio移动开发教程》 肖坤——电子工业出版社,2019.1
作者:阿涛
CSDN博客主页:https://blog.csdn.net/qq_43313113
如有不对的地方,欢迎在评论区指正
欢迎大家关注我,我将持续更新更多的文章