Android 的四大组件分别是:活动(Activity)用于表现功能、服务(Service)后台运行服务,不提供界面呈现、广播接受者(Broadcast Receive),勇于接收广播、内容提供者(Content Provider),支持多个应用中存储和读取数据。
Activity是用户操作的可视化界面,当我们创建完毕Activity之后,需要调用setContentView()方法来完成界面的显示;以此来为用户提供交互的入口。在Android中只要能看见的窗口几乎都要依托于Activity,所以Activity是在开发中使用最频繁的一种组件。
Service用于在后台完成用户指定的操作,不过需要注意的是,服务并不是运行在一个独立的进程当中的,而是依赖于创建服务时所在的应用程序进程。与某个应用程序进程被杀掉时,所有依赖于该进程的服务也会停止运行。另外.也不要被服务的后台概念所迷惑,实际上服务并不会自动开启线程,所有的代码都是默认运行在主线程当中的。我们需要在服务的内部手动创建子线程,并在这里执行具体的任务,否则就有可能出现主线程被阻塞住的情况。与Activity一样,它存在自己的生命周期,也需要在AndroidManifest.xml配置相关信息。
在Android中,广播是一种广泛运用的在应用程序之间传输信息的机制,而广播接收器是对发送出来的广播进行过滤接受并响应的一类组件,可以使用广播接收器来让应用对一个外部时间做出响应。
例如,当电话呼入这个外部事件到来时,可以利用广播接收器进行处理,当下载一个程序成功完成时,仍然可以利用广播接收器进行处理。广播接收器既可以在AndroidManifest.xml中注册,也可以在运行时的代码中使用Context.registerReceive()进行注册。只要是注册了,当事件来临时,即使程序没有启动,系统也在需要的时候启动程序。各种应用还可以通过使用Context.sendBroadcast()将它们自己的Intent广播给其他应用程序:
Intent用于联系Activity、广播、Service等组件,Intent的对象主要包含六部分信息:
在Android开发中,布局的设计方式有两种:
我们既可以使用任何一种声明界面布局的方式,也可以同时使用两种方式。但是建议尽量采用XML文件声明界面元素布局。在程序运行时动态添加界面布局会大大降低应用响应速度,但依然可以在必要时动态改变屏幕内容,其中使用XML文件声明有以下3个特点:
六大界面布局方式包括: 线性布局(LinearLayout)、框架布局(FrameLayout)、表格布局(TableLayout)、相对布局(RelativeLayout)、绝对布局(AbsoluteLayout)和网格布局(GridLayout) 。
线性布局:一行或一列只能放置一个控件
属性 | 功能 |
---|---|
android:gravity | 布局管理器内组件的对齐方式 |
android:orientation | 布局管理器内组件的排列方式(horizontal、vertical) |
android:layout_gravity | 该子元素在LinearLayout中的对齐方式 |
android:layout_weight | 子元素在LinearLayout中所占的权重 |
相对布局:控件与控件按之间的相对位置进行布局
表格布局:结合TableRow,定义基于表格的布局模式
绝对布局:Android不提供任何布局控制,而是由开发人员自己通过X坐标、Y坐标来控制组件的位置。绝对布局已经过时,不应使用或少使用。
帧布局:此布局中可以放置多个View,但只有一个View可以显示,通常使用此布局处理在同一位置不同情况下显示不同内容的控件。
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】这一布局我们将在后面的遥控页面使用!
约束布局就是一个强力升级版的RelativeLayout,RelativeLayout能实现的ConstraintLayout也能实现,RelativeLayout不能实现的ConstraintLayout也能实现。从性能上来说:使用ConstraintLayout的布局基本上不存在ViewGroup的多层级嵌套,以遍历的形式完成整个界面的measure、layout、draw。所以在复杂布局的绘制上ConstraintLayout具有一定的性能优势。
首先得明确,界面布局类型的嵌套越多越深越复杂,会使布局实例化变慢,使Activity的展开时间延长。建议尽量减少布局嵌套,尽量减少创建View对象的数量。例如:减少布局层次,用RelativeLayout来代替LinearLayout(通过Relative相对其他元素的位置来减少块状嵌套)。
调整控件位置的时候,常用的属性为下图所示:
【ps】在你托拽组件的时候,对应的.xml文件将自动生成其组件的代码。
常见的控件属性:
【ps】可能出现的问题:
由于Android开发底层的特点,在利用java编写Button这类控件的时候,不再需要那些繁琐的监听操作,仅需要在Button控件中添加android:onClick和在.java中编写少量代码便可实现对应的功能。
// 组件Button触发的函数,必须是public、void、参数:View view
public void onloginButtononCliked(View view){
// 编写触发后执行的程序
}
【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()
}
}
在屏幕上浮现出一个小窗口,显示一段时间后又消失,这个可视化组件叫做Toast,它主要用于提示用户某种事件发生了,具体的使用方法如下:
// (方法一):
Toast toast = Toast.makeText(MainActivity.this,"登陆成功",Toast.LENGTH_LONG);
toast.show();
// (方法二):
Toast.makeText(this, "登陆成功", Toast.LENGTH_LONG).show();
Intent intert = new Intent(MainActivity.this,Main2Activity.class);
startActivity(intert);
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"));
}
}
评论