要学习Android开发必须要首先要了解Android的四大组件,这是Android里最基础也是比较重要的知识。Android的四大组件也称为Android的四大天王分别是Activity、Service、BroadCast Recevicer、Content provider。
Activity
先从Activity谈起,大多数的应用都有界面,有界面首先就离不开Acitivity。
1.Activity的定义和作用:Activity的中文意思就是活动,代表手机屏幕的一屏,或是平板中的一个窗口,提供了和用户交互的可视化界面。Activity是用于处理UI相关业务的,比如加载界面、监听用户操作等事件。
2.Activity的简单用法:
(1)创建Activity
package mystudio.hbq.com.myapplication; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } }
(2)写布局文件
<?xml version="1.0" encoding="utf-8"?> <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="@dimen/activity_vertical_margin" tools:context="mystudio.hbq.com.myapplication.MainActivity"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" /> </RelativeLayout>
(3)在AndroidManifest.xml 文件配置Activity
<activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
通过以上三步一个基本的Activity就可以启动了。
Service
接着我们来谈谈Service即服务,是一个一种可以在后台执行长时间运行操作而没有用户界面的应用组件。Service的官方定义:Service(服务)是一个没有用户界面的在后台运行执行耗时操作的应用组件。其他应用组件能够启动Service,并且当用户切换到另外的应用场景,Service将持续在后台运行。另外,一个组件能够绑定到一个service与之交互(IPC机制),例如,一个service可能会处理网络操作,播放音乐,操作文件I/O或者与内容提供者(content provider)交互,所有这些活动都是在后台进行。
Service的两种启动状态:
启动状态,当应用组件通过调用 startService() 启动服务时,服务即处于“启动”状态。一旦启动,服务即可在后台无限期运行,即使启动服务的组件已被销毁也不受影响,除非手动调用才能停止服务, 已启动的服务通常是执行单一操作,而且不会将结果返回给调用方。
绑定状态,当应用组件通过调用 bindService() 绑定到服务时,服务即处于“绑定”状态。绑定服务提供了一个客户端-服务器接口,允许组件与服务进行交互、发送请求、获取结果,甚至是利用进程间通信 (IPC) 跨进程执行这些操作。 仅当与另一个应用组件绑定时,绑定服务才会运行。 多个组件可以同时绑定到该服务,但全部取消绑定后,该服务即会被销毁。
BraodCast Receiver
BroadcastReceiver就是“广播接收者”的意思,顾名思义,它就是用来接收来自系统和应用中的广播。
在Android系统中,广播体现在很多方面,例如当开机完成后系统会产生一条广播,接收到这条广播就能实现开机启动服务的功能;当网络状态改变时系统会产生一条广播,接收到这条广播就能及时地做出提示和保存数据等操作;当电池电量改变时,系统会产生一条广播,接收到这条广播就能在电量低时告知用户及时保存进度,等等。
广播分为两个角色:广播发送者、广播接收者。
发送广播,调用Context对象的sendBroadcast(Intent)即可发送广播,在参数Intent对象中,应该调用setAction()方法配置广播的“频道号”,即是相当于收音机要接收某个电台的频段,只有注册了相同的Action的广播接收者才可以接收到该广播。
接收广播
1.开发广播接收器,自定义类,继承自android.content.BroadcastReceiver后需要注册,注册时,使用IntentFilter配置与发送方相同的Action,重写onReceiver()方法实现对广播的处理。
public class MyBroadcastReceiver extends BroadcastReceiver {
private static final String TAG = "MyBroadcastReceiver";
@Override
public void onReceive(Context context, Intent intent) {
StringBuilder sb = new StringBuilder();
sb.append("Action: " + intent.getAction() + "\n");
sb.append("URI: " + intent.toUri(Intent.URI_INTENT_SCHEME).toString() + "\n");
String log = sb.toString();
Log.d(TAG, log);
Toast.makeText(context, log, Toast.LENGTH_LONG).show();
}
}
这样就开发了一个广播接收器。
2.注册广播接收器,可以区分为静态注册和动态注册:
(1)静态注册,在清单文件AndroidManifest.xml中,在application节点下使用receiver节点进行注册。这种方式注册的广播接收者必须是一个单独的只实现BroadcastReceiver的类,不能是内部类。且这样的广播接收者是常驻型的,即从APP安装到手机上的那一刻即开始处于接收广播状态,且直至该APP被从手机移除。
<receiver android:name=".MyBroadcastReceiver" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MY_RECEIVER"/> <action android:name="android.intent.action.INPUT_METHOD_CHANGED" /> </intent-filter> </receiver
(2)动态注册
- 在程序中调用Context对象的registerReceiver(BroadcastReceiver, IntentFilter)方法进行注册。这种方式可以注册以内部类的形式存在的广播接收者,且这种方式的广播接收者仅当注册后才开始接收广播,并且在调用了Context对象的unregisterReceiver(BroadcastReceiver)方法后就会停止接收广播。
BroadcastReceiver br = new MyBroadcastReceiver();
IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
intentFilter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);
this.registerReceiver(br, filter);
ContentProvider
ContentProvider即内容提供者,可以将应用程序自身的数据对外(对其它应用程序)共享,使得其它应用可以对自身的数据进行增、删、改、查操作。Android系统使用了许多ContentProvider,将系统中的绝大部分常规数据进行对外共享,例如:联系人资料、通话记录、短信、相册、日历等等,一般这些数据都存放于一个个的数据库中。
我们自己的app可以实现一个ContentProvider的抽象接口将自己的数据完全暴露出去,而且ContentProvider是以类似数据库中表的方式将数据暴露的。那么外界获取其提供的数据,也就应该与从数据库中获取数据的操作基本一样,只不过是采用URL来表示外界需要访问的“数据库”。