原创

安卓实战01---基础知识


1 安卓四大组件

Android 的四大组件分别是:活动(Activity)用于表现功能、服务(Service)后台运行服务,不提供界面呈现、广播接受者(Broadcast Receive),勇于接收广播、内容提供者(Content Provider),支持多个应用中存储和读取数据。

1.1 活动Activity

Activity是用户操作的可视化界面,当我们创建完毕Activity之后,需要调用setContentView()方法来完成界面的显示;以此来为用户提供交互的入口。在Android中只要能看见的窗口几乎都要依托于Activity,所以Activity是在开发中使用最频繁的一种组件。

  • 一个Activity通常就是一个页面
  • 不同的Activity之间通过Intent进行通信
  • Android中的每一个Activity都必须要在AndroidManifest.xml配置文件中声明,否则系统将不识别也不执行该Activity
  • 下图是Activity的生命周期:

1

1.2 服务Service

Service用于在后台完成用户指定的操作,不过需要注意的是,服务并不是运行在一个独立的进程当中的,而是依赖于创建服务时所在的应用程序进程。与某个应用程序进程被杀掉时,所有依赖于该进程的服务也会停止运行。另外.也不要被服务的后台概念所迷惑,实际上服务并不会自动开启线程,所有的代码都是默认运行在主线程当中的。我们需要在服务的内部手动创建子线程,并在这里执行具体的任务,否则就有可能出现主线程被阻塞住的情况。与Activity一样,它存在自己的生命周期,也需要在AndroidManifest.xml配置相关信息。

1.3 内容提供者Content-Provider

  • Android平台提供了Content Provider使一个应用程序的指定数据集提供给其他应用程序。其他应用可以通过ContentResolver类从该内容提供者中获取或存入数据。
  • 多个应用程序间共享数据。例如:通讯录数据被多个应用程序使用,且必须存储在一个内容提供者中。
  • ContentProvider实现数据共享,用于保存和获取数据,并使其对所有应用程序可见。这是不同应用程序间共享数据的唯一方式,因为android没有提供所有应用共同访问的公共存储区。
  • 开发人员不会直接使用ContentProvider类的对象,大多数是通过ContentResolver对象实现对ContentProvider的操作。
  • ContentProvider使用URI来唯一标识其数据集,这里的URI以content://作为前缀,表示该数据由ContentProvider来管理。

1.4 广播接收器 Broadcast-Receive

在Android中,广播是一种广泛运用的在应用程序之间传输信息的机制,而广播接收器是对发送出来的广播进行过滤接受并响应的一类组件,可以使用广播接收器来让应用对一个外部时间做出响应。

2

例如,当电话呼入这个外部事件到来时,可以利用广播接收器进行处理,当下载一个程序成功完成时,仍然可以利用广播接收器进行处理。广播接收器既可以在AndroidManifest.xml中注册,也可以在运行时的代码中使用Context.registerReceive()进行注册。只要是注册了,当事件来临时,即使程序没有启动,系统也在需要的时候启动程序。各种应用还可以通过使用Context.sendBroadcast()将它们自己的Intent广播给其他应用程序:

  1. 定义一个类,继承BroadcastReceiver类
  2. 覆盖其onReceive方法,对接收到的广播进行自定义的操作
  3. 注册BroadcastReceiver:(1)在代码中使用Activity的registerReceiver方法进行注册,此种方式,仅在此Activity中有效(2)在AndroidMainframe.xml文件中注册,此种方式,即使应用程序没有运动,可以在广播发出时,接收到广播的信息(可看作是后台运行)。

1.5 意图Intent

Intent用于联系Activity、广播、Service等组件,Intent的对象主要包含六部分信息:

  • Component-name
  • Action
  • Data
  • Category
  • Extras
  • Flags

2 安卓的布局

在Android开发中,布局的设计方式有两种:

  • 使用XML文件描述界面布局
  • 在Java代码中通过调用方法进行控制

我们既可以使用任何一种声明界面布局的方式,也可以同时使用两种方式。但是建议尽量采用XML文件声明界面元素布局。在程序运行时动态添加界面布局会大大降低应用响应速度,但依然可以在必要时动态改变屏幕内容,其中使用XML文件声明有以下3个特点:

  1. 将程序的表现层和控制层分离
  2. 在后期修改用户界面时,无须更改程序的源程序;
  3. WYSIWYG可视化工具直接看到所设计的用户界面,有利于加快界面设计

六大界面布局方式包括: 线性布局(LinearLayout)、框架布局(FrameLayout)、表格布局(TableLayout)、相对布局(RelativeLayout)、绝对布局(AbsoluteLayout)和网格布局(GridLayout) 。

2.1 LinearLayout线性布局

线性布局:一行或一列只能放置一个控件

属性功能
android:gravity布局管理器内组件的对齐方式
android:orientation布局管理器内组件的排列方式(horizontal、vertical)
android:layout_gravity该子元素在LinearLayout中的对齐方式
android:layout_weight子元素在LinearLayout中所占的权重

2.2 RelativeLayout相对布局

相对布局:控件与控件按之间的相对位置进行布局

2.3 TableLayout表格布局

表格布局:结合TableRow,定义基于表格的布局模式

2.4 AbsoluteLayout绝对布局

绝对布局:Android不提供任何布局控制,而是由开发人员自己通过X坐标、Y坐标来控制组件的位置。绝对布局已经过时,不应使用或少使用。

2.5 FrameLayout帧布局

帧布局:此布局中可以放置多个View,但只有一个View可以显示,通常使用此布局处理在同一位置不同情况下显示不同内容的控件。

2.6 GridLayout网格布局

GridLayout是Android4.0增加的网格布局控件,与之前的TableLayout有些相似,它把整个容器划分为rows* columns个网格,每个网格可以放置一个组件,性能及功能都要比tablelayout好。比如:GridLayout布局中的单元格可以跨越多行,而tablelayout则不行,此外,其渲染速度也比tablelayout要快。GridLayout提供了setRowCount(int)和setColumnCount(int)方法来控制该网格的行和列的数量:

属性功能对应的java方法
android:alignmentMode设置该布局管理器采用的对齐模式setAlignmentMode(int)
android:columnCount设置该网格的列数量setColumnCount(int)
android:columnOrderPreserved设置该网格容器是否保留序列号setColumnOrderPreserved(boolean)
android:roeCount设置该网格的行数量setRowCount(int)
android:rowOrderPreserved设置该网格容器是否保留行序号setRowOrderPreserved(boolean)
android:useDefaultMargins设置该布局管理器是否使用默认的页边距setUseDefaultMargins(boolean)

为了控制GridLayout布局容器中各子组件的布局分布,GridLayout提供了一个内部类:GridLayout.LayoutParams,来控制Gridlayout布局容器中子组件的布局分布。

【ps】这一布局我们将在后面的遥控页面使用!

2.7 ConstraintLayout约束布局

约束布局就是一个强力升级版的RelativeLayout,RelativeLayout能实现的ConstraintLayout也能实现,RelativeLayout不能实现的ConstraintLayout也能实现。从性能上来说:使用ConstraintLayout的布局基本上不存在ViewGroup的多层级嵌套,以遍历的形式完成整个界面的measure、layout、draw。所以在复杂布局的绘制上ConstraintLayout具有一定的性能优势。

2.8 界面布局类型的建议

首先得明确,界面布局类型的嵌套越多越深越复杂,会使布局实例化变慢,使Activity的展开时间延长。建议尽量减少布局嵌套,尽量减少创建View对象的数量。例如:减少布局层次,用RelativeLayout来代替LinearLayout(通过Relative相对其他元素的位置来减少块状嵌套)。

3 安卓的基本控件

3.1 文本控件

  • TextView:显示不可编辑的文本(还可以自动识别并链接如Email地址、Web地址、电话号码等特殊字符)
  • EditText:可以编辑的文本框
  • AutoCompleteTextView:可编辑的文本视图显示自动完成建议当用户键入(例:列表显示在一个下拉菜单,用户可以从中选择一项,以完成输入,建议列表是从一个数据适配器获取的数据)。
  • MultiAutoCompleteTextView

调整控件位置的时候,常用的属性为下图所示:

3

3.2 按钮控件

  • Button
  • ImageButton
  • CheckBox
  • RadioButton、RadioGroup

3.3 日期时间控件

  • DatePicker、TimePicker:
  • DigitalClock、AnalogClock
  • Chronometer

3.4 其他基本控件

  • ProgressBar:进度条
  • SeekBar:拖动条
  • RatingBar:星级评分控件
  • ImageView

4 基本的设计流程(小练习)

4.1 放置控件

  1. 首先,利用鼠标拖拽的方式放置组件(如:Plain Text、password、TextView、Button等);
  2. 然后,将组件四个边中间的点连接到指定位置(可以是其他组件,也可以是页面的四周),以确定其在页面中的具体位置。

【ps】在你托拽组件的时候,对应的.xml文件将自动生成其组件的代码。

4.2 控件属性的设置

常见的控件属性:

  • 【android:id】:.java文件利用findViewById(R.id.名字)方法来找到该控件。
  • 【android:text】:控件显示的文字。
  • 【android:hint】:未输入情况下显示的文字(尽量使用strings.xml中的字符串)。
  • 【android:grivity】:控件中文本的位置(例:"center")。
  • 【android:textSize】:控件中文本字体的大小(例:"40sp")。
  • 【android:background】:控件的背景色,RGB命名法(例:"#F6F6C4")。
  • 【android:padding】:控件的内边距。

【ps】可能出现的问题:

  1. 当我们在1.1中固定好控件位置之后,可能会手动更改某个组件的id,这时如果其他组件与更改id的控键存在位置关系,那么它的app:layout_constraintXXX_toBottomOf属性不会自动更改,需要我们手动调整。
  2. 在android:hint使用strings.xml的时候,注意.xml中对应标签的name属性。
  3. 关于android:id命名一定要清晰明了,自己能记得住,统一使用小驼峰法:(一)除第一个单词之外,其他单词首字母大写(二)"控件类型"+"该处表示的含义"(例:"editTextUserPwd"、"textViewUserName"、"buttonBMI"等等)。

4.3 Button的设置

由于Android开发底层的特点,在利用java编写Button这类控件的时候,不再需要那些繁琐的监听操作,仅需要在Button控件中添加android:onClick和在.java中编写少量代码便可实现对应的功能。

  1. 在android:onClick属性命名的时候,我们也采用小驼峰法,("该处表示的含义" + "ButtononCliked"),例:"onloginButtononCliked"、"BMIButtononCliked"等。
  2. 创建onloginButtononCliked()方法:编写触发后执行的任务。
// 组件Button触发的函数,必须是public、void、参数:View view
public void onloginButtononCliked(View view){
	// 编写触发后执行的程序
}

4.4 利用java调用控件中获取的字符串

  1. 创建想要获取字符串所在控件的对象类型
  2. 利用findViewById()方法找到控件对应的对象(我们的版本需要强转)
  3. 利用.getText().toString()方法获取对象中的字符串值

【ps】在调用控件的时候,id的值尽量不要自己打,在自动出现列表中寻找。

public class MainActivity extends AppCompatActivity {
    // 1.创建想要获取字符串所在控件的对象类型
    private EditText editTextUserName;  

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

	// 2.通过finView找到控件对应的对象(ps:版本问题需要强制转换)
        editTextUserName = (EditText) findViewById(R.id.editTextUserName);
	// 3.利用.getText().toString()方法获取对象中的字符串值
	// [PS]这是举个例子,正式代码引用控件对象的值,不放在这里。
	editTextUserName = editTextUserName.getText().toString()
    }
}

4.5 利用Toast创建浮现小窗口

在屏幕上浮现出一个小窗口,显示一段时间后又消失,这个可视化组件叫做Toast,它主要用于提示用户某种事件发生了,具体的使用方法如下:

  1. 定义Toast并用makeText()设置:文本和浮现时间长短
  2. 用.show()将Toast显示出来
// (方法一):
Toast toast = Toast.makeText(MainActivity.this,"登陆成功",Toast.LENGTH_LONG);
toast.show();

// (方法二):
Toast.makeText(this, "登陆成功", Toast.LENGTH_LONG).show();

【Android开发Toast】参考1

【Android开发Toast】参考2

【Android开发Toast】参考3

4.6 利用Intent(意图)实现页面跳转

Intent intert = new Intent(MainActivity.this,Main2Activity.class);
startActivity(intert);

4.7 实现多页面的控件值传送

MainActivity.java文件下的代码:

Intent intert = new Intent(MainActivity.this,Main2Activity.class);
// 利用putExtra()方法:
//    第一个参数:跳转到下一页面时,用来调用的名字;
//    第二个参数:从此页面传入的某一控件值
intert.putExtra("useName",editTextUserName.getText().toString());
startActivity(intert);

Main2Activity.java文件下的代码:

public class Main2Activity extends AppCompatActivity {
    private TextView textViewshowusername;
	
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
		
	textViewshowusername = (TextView) findViewById(R.id.textViewshowusername);
	// 1.首先,获取Intent(意图)的对象
	Intent intent = getIntent();
	// 2.然后,利用getStringExtra()方法来获取对应的值
        textViewshowusername.setText(intent.getStringExtra("useName"));
    }
}

参考资料与源码链接

Android
  • 作者:李延松(联系作者)
  • 发表时间:2021-05-18 13:44
  • 版本声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  • 公众号转载:请在文末添加作者公众号二维码

评论

留言