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