Activity是Android应用程序核心组件中最基本的一种,是用户与应用程序交互的窗口。类似于一个网站中的网页,可以互相跳转,并且可以有返回值(相当于转发是添加参数或者返回值)。
当新打开一个视图时,之前的视图会被置为暂停状态,并被压入历史堆栈中。
Activity是由Android系统进行维护的,拥有自己的生命周期,如:
onCreate()
:创建onStart()
: 激活onResume()
: 恢复onPause()
: 暂停onStop()
: 停止onDestroy()
: 销毁onRestart()
: 重启Service是Android系统中类似于Activity但是没有视图的程序,可以在后台运行很长时间,相当于操作系统中的一个服务。
Android定义了两种类型的Service,即本地和远程Service。本地Service是只能由承载该Service的应用程序访问的组件,而远程Service是供在设备上运行的其他应用程序远程访问的Service。
通过Context.startService(Intent service)
可以启动一个Service,通过Context.bindService()
可以绑定一个Service。
顾名思义,广播接收者适用于接受来自系统和其他应用程序的广播,并作出回应。
在Android系统中,当有特定时间发生时就会产生相应的广播,比如开机时系统会发送一条广播给应用,告知应用启动等。
BroadcastReceiver不能生成UI,通过NotificationManager来通知用户有事件发生,对于用户来说是隐式的。
BroadcastReceiver有两种注册方式:
Context.registerReceiver()
来进行动态注册。Context.sendBroadcast()
将自己的Intent对戏那个广播给其他应用程序文件,数据库等数据在Android系统内是私有的,仅允许被特定应用程序使用,在两个程序之间,数据的交换或者共享由ContentProvider实现。
ContentProvider类实现了一组标准方法的借口,从而能够让其他应用保存或者读取ContentProvider提供的各种数据类型。
Intent并不是Android应用程序核心组件,但是Activity,Service,BroadcastReceiver之间互相通信使用的消息使用的就是Intent。
一个Android程序通常由多个Activity组成,但是其中只有一个MainActivity,相当于java中的main方法。
本质上讲,activity在生命周期中一共存在三个状态
方法 | 调用说明 |
---|---|
onCreate(Bundle savedInstanceState) | 创建Activity时调用。在该方法中,还会以Bundle的形式提供对以前存储的任何状态的访问,其中参数savedInstanceState对象是用于保存Activity的对象状态 |
onStart() | activity在屏幕上变得用户可见是调用 |
onResume() | activity开始与用户交互时使用,无论是启动还是重启一个activity,该方法总是会被调用 |
onPause() | 当Android喜用要激活其他activity时,该方法被调用,暂停或者收回CPU和其他资源时调用 |
onStop() | activity被停止并且转为不可见阶段时调用 |
onRestart() | 重新启动已经停止的activity时调用 |
onDestroy() | activity被完全从系统内存中移除时使用。该方法被调用可能是因为有人直接调用finish方法或者系统决定停止该活动以释放资源 |
上述七个生命周期方法分别在四个阶段按照一定的顺序进行调用:
每个android应用都有一个主Activity,相当于java中的main方法。多个Activity可以直接相互调用以完成不同的工作,当新的Activity被启动的时候,之前的Activity会停止,但是不会被销毁,而是被压入Back Stack的栈顶,当用户点击Back按钮时,当前的Activity会被销毁,原先的Activity会被从Back Stack的栈顶弹出并激活。当Activity状态发生改变的时候,都会通过状态回调函数同志Android系统。
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>
在Android系统中,除了主Activity由系统启动以外,其他的Activity都需要由应用程序来启动。
starActivity()
方法来启动Activity,而要启动的Activity的信息由Intent对象来传递,如://表示通过当前的Activity来启动AnotherActivity
Intent intent = new Intet(this , AnotherActivity.class);
startActivity(intent);
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);
startActivityForResult()
,并实现onActivityResult()
方法来获取返回值。如:Intent intent = new Intent(Intent.ACTION_PICK,Contacts.CONTENT_URI);
startActivityForResult(intent,PICK_CONTACT_REQUEST);
关闭Activity使用finish()方法,关闭之前启动过的其他Activity可以使用finishActivity()方法。虽然Android SDK提供了这些方法,但是通常情况下不建议使用其去强制关闭某个Activity。因为Android系统在为用户维护Activity的生命周期,可以动态的回收和重建Activity,因此Activity应该交给Android系统来管理。
Activity数据传递共有三种形式
//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");
//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");
//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