Android四大核心组件

Activity

Activity是Android应用程序核心组件中最基本的一种,是用户与应用程序交互的窗口。类似于一个网站中的网页,可以互相跳转,并且可以有返回值(相当于转发是添加参数或者返回值)。
当新打开一个视图时,之前的视图会被置为暂停状态,并被压入历史堆栈中。
Activity是由Android系统进行维护的,拥有自己的生命周期,如:

  • onCreate() :创建
  • onStart() : 激活
  • onResume(): 恢复
  • onPause(): 暂停
  • onStop(): 停止
  • onDestroy(): 销毁
  • onRestart(): 重启
Service

Service是Android系统中类似于Activity但是没有视图的程序,可以在后台运行很长时间,相当于操作系统中的一个服务。
Android定义了两种类型的Service,即本地和远程Service。本地Service是只能由承载该Service的应用程序访问的组件,而远程Service是供在设备上运行的其他应用程序远程访问的Service。
通过Context.startService(Intent service)可以启动一个Service,通过Context.bindService()可以绑定一个Service。

BroadcastReceiver

顾名思义,广播接收者适用于接受来自系统和其他应用程序的广播,并作出回应。
在Android系统中,当有特定时间发生时就会产生相应的广播,比如开机时系统会发送一条广播给应用,告知应用启动等。
BroadcastReceiver不能生成UI,通过NotificationManager来通知用户有事件发生,对于用户来说是隐式的。
BroadcastReceiver有两种注册方式:

  • 在AndroidManifest.xml中进行静态注册
  • 在运行的代码中使用Context.registerReceiver()来进行动态注册。
    只要注册了BroadcastReceiver,即使对应的广播事件来临时应用程序尚未启动,系统也会自动启动该应用程序对事件进行处理。同时,用户还可以通过Context.sendBroadcast()将自己的Intent对戏那个广播给其他应用程序
ContentProvider

文件,数据库等数据在Android系统内是私有的,仅允许被特定应用程序使用,在两个程序之间,数据的交换或者共享由ContentProvider实现。
ContentProvider类实现了一组标准方法的借口,从而能够让其他应用保存或者读取ContentProvider提供的各种数据类型。

Intent

Intent并不是Android应用程序核心组件,但是Activity,Service,BroadcastReceiver之间互相通信使用的消息使用的就是Intent。

Activity解读

一个Android程序通常由多个Activity组成,但是其中只有一个MainActivity,相当于java中的main方法。

Activity的生命周期

本质上讲,activity在生命周期中一共存在三个状态

  • 运行态:指activity运行在屏幕最上层并获得了用户焦点
  • 暂停态:指当前activity依然存在,但是没有获得用户焦点。处于暂停态的activity保留了自己所使用的内存和用户信息,但是在系统极度缺乏资源的状态下,有kennel会被杀死释放资源。
  • 停止态: 指当前activity完全被处于运行态的activity遮挡住,用户完全不能看见该界面。处于停止态的activity依然存活,也保留了自己使用的内存和用户信息,但是一旦系统缺乏资源,停止态的activity会被杀死释放资源。

方法

调用说明

onCreate(Bundle savedInstanceState)

创建Activity时调用。在该方法中,还会以Bundle的形式提供对以前存储的任何状态的访问,其中参数savedInstanceState对象是用于保存Activity的对象状态

onStart()

activity在屏幕上变得用户可见是调用

onResume()

activity开始与用户交互时使用,无论是启动还是重启一个activity,该方法总是会被调用

onPause()

当Android喜用要激活其他activity时,该方法被调用,暂停或者收回CPU和其他资源时调用

onStop()

activity被停止并且转为不可见阶段时调用

onRestart()

重新启动已经停止的activity时调用

onDestroy()

activity被完全从系统内存中移除时使用。该方法被调用可能是因为有人直接调用finish方法或者系统决定停止该活动以释放资源

activity生命周期解释

上述七个生命周期方法分别在四个阶段按照一定的顺序进行调用:

  • 启动activity:依次执行onCreate(),onStart(),onResume()
  • activity失去焦点:依次执行onPause(),onStop()
  • activity重获焦点:依次执行onRestart(),onStart() ,onResume()
  • 关闭activity:依次执行onPause(),onStop(),onDestroy()

Activity组件

每个android应用都有一个主Activity,相当于java中的main方法。多个Activity可以直接相互调用以完成不同的工作,当新的Activity被启动的时候,之前的Activity会停止,但是不会被销毁,而是被压入Back Stack的栈顶,当用户点击Back按钮时,当前的Activity会被销毁,原先的Activity会被从Back Stack的栈顶弹出并激活。当Activity状态发生改变的时候,都会通过状态回调函数同志Android系统。

Activity的创建

  • 新建类
    创建一个新的Activity,必须创建Android.app.Activity的一个子类,并且重写onCreate()方法。
  • 关联布局XML文件
    在新建的Activity中设置其布局方式,需要在res/layout目录中新建一个XML布局文件。可以通过setContentView()方法来指定Activity的用户界面的布局文件,如setContentView(R.layout.activity_jarvis)
  • 注册
    AndroidManifes.xml文件中对建立的Activity进行注册,即在application标签下添加activity标签
<manifest ...>
	<application ...>
		<activity Android:name=".ExampleActivity" />
		对于主Activity,需要为其添加<intent-filter>标签
		<activity Android:name=".ExampleActivity" >
			<intent-filter>
				表示该activity作为主Activity出现
				<action Android.name="Android.intent.action.MAIN"/>
				表示该Activity会被显示在最上层的启动列表中
				<category Android.name="Android.intent.action.LAUNCHER" />
			</intent-filter>
		</activity>
	</application>
</manifest>

Activity的启动

在Android系统中,除了主Activity由系统启动以外,其他的Activity都需要由应用程序来启动。

  • 通常情况下,需要使用starActivity()方法来启动Activity,而要启动的Activity的信息由Intent对象来传递,如:
//表示通过当前的Activity来启动AnotherActivity
Intent intent = new Intet(this , AnotherActivity.class);
startActivity(intent);
  • 有时,用户不需要知道需要启动的Activity的名称,而可以仅制定要完成的行为,由Android系统来为用户挑选合适的Activity:
Intent intent = new Intent(Intent.ACTION_SEND);
//Intent.EXTRA_EMAIL中放置的是recipientArray中存储的要发送的Email的目标地址,该Intent对象starActivity方法启动后,Android系统会启动相应的Email处理应用程序,并将Intent.EXTRA_EMAIL中的内容放到邮件的目标地址中
intent.putExtra(Intent.EXTRA_EMAIL,recipientArray);
startActivity(intent);
  • 当需要从启动的Activity获取返回值时,需要使用startActivityForResult(),并实现onActivityResult()方法来获取返回值。如:
Intent intent = new Intent(Intent.ACTION_PICK,Contacts.CONTENT_URI);
startActivityForResult(intent,PICK_CONTACT_REQUEST);

关闭Activity

关闭Activity使用finish()方法,关闭之前启动过的其他Activity可以使用finishActivity()方法。虽然Android SDK提供了这些方法,但是通常情况下不建议使用其去强制关闭某个Activity。因为Android系统在为用户维护Activity的生命周期,可以动态的回收和重建Activity,因此Activity应该交给Android系统来管理。

Activity数据传递

Activity数据传递共有三种形式

  • 通过Intent传递一些简单数据
//Activity1中传递数据
Intent intent = new Intent(Activity1.this , Activity2.class);
intent.putExtra("author","jarvis");//在Intent中添加键值对
Activity1.this.startActivity(intent);

//在Activity2中获取传递过来的数据
Intent intent = getIntent();//获取传递过来的Intent
String value = intent.getStringExtra("author");
  • 通过Bundle传递相对复杂的数据或者对象
//Activity1中传递数据
Intent intent = new Intent(Activity1.this , Activity2.class);
Bundle bundle = new Bundle();
bundle.putString("author","jarvis");
intent.putExtras(bundle);
Activity1.this.startActivity(intent);

//在Activity2中获取传递过来的数据
Intent intent = getIntent();//获取传递过来的Intent
Bundle bundle = intent.getExtras();
String value = bundle.getString("author");
  • 通过startActivityForResult方法可以更方便的进行来回传递数据
//Activity1中向Activity2传递数据
final int REQUEST_CODE = 1;
Intent intent = new Intent(Activity1.this , Activity2.class);
Bundle bundle = new Bundle();
bundle.putString("author","jarvis");
intent.putExtras(bundle);
starActivityForResult(intent,REQUEST_CODE);

//同时Activity1还要重载onActivityResult方法,用于接受回调传回来的数据
protected void onActivityResult(int requestCode , int resultCode , Intent intent){
	if(requestCode == this.REQUEST_CODE){
		if(resultCode == 1){
			Bundle bundle = intent.getExtras();
			String value = bundle.getString("res");
		}
	}
}
//在Activity2中接受数据并且处理后回传
Intent intent = getIntent();
Bundle bundle = intent.getExtras();
String value = bundle.getString("author");

Intent resIntent = new Intent();
Bundle resBundle = new Bundle();
resBundle.putString("res","jarvis");
resIntent.putExtras(resBundle);
Activity2.this.setResult(1 , resIntent);
finish();//结束当前activity