Android四大组件之Activity
最近在看Android的书籍,所以有时间复习一下Android的四大组件。
Android开发四大组件分别是:
- 活动(Activity):用于表现功能。
- 服务(Service):后台运行服务,不提供界面呈现。
- 广播接收器(BroadcastReceiver):用于接收广播。
- 内容提供器(ContentProvider):支持在多个应用存储和读取数据,相当于数据库。
1.1 Activity
在Android中,Activity是所有程序的根本,所有程序的流程都运行在Activity之中,Activity可以算是开发者遇到的最频繁,也是Android当中最基本的模块之一。在Android的程序当中,Activity一般代表手机屏幕的一屏。如果把手机比作一个浏览器,那么Activity就相当于一个网页。在activity当中可以添加以下Button、Checkbox等控件。可以看到Activity概念和网页的概念相当类似。
一般一个Android应用是由多个Activity组成的。这多个Activity之间可以进行相互跳转,例如,按下一个Button按钮之后,可能会跳转到其它的Activity。和网页跳转稍微有些不一样的是,Activity之间跳转可能有返回值。例如,从Activity A跳转到Activity B,那么当Activity B运行结束的时候,有可能返回给Activity A一个返回值。这样做在很多时候是相当方便的。
当打开一个新的屏幕时,之前一个屏幕会被置为暂停状态,并且压入历史堆栈中。用户可以通过回退操作返回到以前打开过的屏幕。我们可以选择性地移除一些没有必要保留的屏幕,因为Android会把每个应用从开始到当前的每个屏幕都保存在堆栈中。
Android用Intent这个特殊类实现在Activity与Activity之间的切换。Intent类用于描述应用的功能。在Intent的描述结构中,有两个最重要的部分;动作和动作对应的数据。典型的动作类型有:MAIN、VIEW、PICK、EDIT等,而动作对应的数据则以URI的形式表示。例如,要查看一个人的联系方式,需要创建一个动作类型为VIEW的Intent,以及一个表示这个人的URI。
通过解析各种Intent,从一个屏幕导航到另一个屏幕是很简单的。当向前导航时,Activity将会调用StartActivity(Intent my Intent)方法。然后,系统会在所有已安装的应用程序中定义的IntentFilter中查找,找到最匹配myIntent的Intent对应的Activity。新的Activity接收到MyIntent的通知后,开始运行。当StartActivity方法被调用时,将触发解析MyIntent的动作,该机制提供了两个关键好处:
- Activity能够重复利用从其它组件中以Intent的形式产生的请求。
- Activity可以在任何时候被具有相同IntentFilter的新的Activity取代。
下面举例说明两个Activity之间的切换。新建两个Activity:FirstActivity和SecondActivity。FirstActivity.java代码如下所示,定义了一个按钮并为这个按钮绑定监听事件,当用户单击这个按钮时,将会切换到SecondActivity,同时关闭当前Activity。
public class FirstActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 设置显示first的布局
setContentView(R.layout.activity_first);
// 取得布局first中的button1按钮
Button btn = (Button) findViewById(R.id.button1);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setClass(FirstActivity.this, SecondActivity.class);
// 启动SecondActivity
startActivity(intent);
// 关闭当前的Activity
finish();
}
});
}
}
SecondActivity.java,功能也相同,点击按钮跳转到第一个Activity。
public class SecondActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 设置显示first的布局
setContentView(R.layout.activity_first);
// 取得布局first中的button1按钮
Button btn = (Button) findViewById(R.id.button1);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setClass(SecondActivity.this, FirstActivity.class);
// 启动SecondActivity
startActivity(intent);
// 关闭当前的Activity
finish();
}
});
}
}
activity_first.xml 布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="我是FirstActivity"/>
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="跳转到SecondActivity" />
</LinearLayout>
activity_second.xml布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="我是SecondActivity"/>
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="跳转到FirstActivity" />
</LinearLayout>
同时不要忘记在manifest.xml中注册activity:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.demo"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="11"
android:targetSdkVersion="21" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/Sn1.Widget.ActionMode" >
<activity
android:name=".FirstActivity"
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 android:name="com.example.demo.SecondActivity"/>
</application>
</manifest>
以上内容都是通过看书所得,所以推荐大家可可以去看看,书名<Android经典项目案例开发实战宝典>