Activity是一个应用程序组件,主要用于和用户交互,通常为用户提供窗口,此窗口可以充满屏幕,但也可以小于屏幕而浮于其它窗口之上,也就是说一个应用程序可以由多个Activities组成,但必须要指定一个”MainActivity”在第一次启动时调用,当新的Activity启动时,原先的Activity会被压入堆栈中,直到按返回键一个一个退出新启动的Activity。
每一个Activity都有自己的生命周期,在实际使用中需要注意在Activity的状态变化中及时更新资源、数据的准备与释放。
onCreate:这里是”第一次创建Activity”的状态,一般完成变量、数据初始化以及加载自定义Activity界面,子线程的开启等操作;
onStart: 这里是“用户可见不可交互”的状态,一般完成前台显示的初始化等操作;
onResume:这里是”变成和用户可交互”的状态,一般完成在Activity再次获取焦点时重新启动资源和数据;(Activity栈系统通过栈的方式管理这些Activity,即当前Activity在栈的最上端,运行完弹出栈,则回到上一个Activity)
onPause:这里是”可见但不可交互”的状态,一般是在本Activity失去焦点处于此状态,应该在这里保存数据,因为这个时候它的优先级降低,但有可能被系统收回,当被系统收回可以在onResume将数据恢复。
onStop:这里是”变得不可见”的状态 ,会被下一个activity覆盖
onDestroy:这里是”Activity被kill前最后一个被调用方法”,可以通过调用自身的finish()方法或者finiActivity()来销毁此Activity所占资源,可以用isFinishing()来判断它。
在Android的AndroidManifest.xml配置文件中可以通过< intent-filter>节点为一个 Activity 指定其Intent Filter,以便告诉系统该Activity可以响应什么类型的Intent,以下是其匹配流程。
一个应用程序中只有一个Activity应该有“main”动作和”launcher”分类。< action />元素指定这是这个应用程序的”main”入口点,< category />元素指定这个Activity应该被列入系统应用程序列表中(为了允许用户启动这个Activity)。
<activity android:name="com.yl.android.intent_forresult.MainActivity" 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.yl.android.intent_forresult.SecondActivity" android:label="@string/title_activity_second" >
</activity>
如果你希望你的应用程序自包含,并且不希望别的应用程序激活它的activities,那么你不需要任何其它intent filters,而且你能通过自己的intent启动他们。
可是,如果你希望你的应用程序的activities能够从其它应用程序(包括你自己的)启动,那么你必须为这个activity定义额外的intent filters;每一种你希望响应类型的intent,都必须包含在里,即包含元素,可选的,一个元素并且/或一个元素。这些元素指定你的activity能响应的intent的类型。
standard:将intent发送给新的Activity实例,每次跳转都会生成新的Activity;
singleTop:也是将intent发送给新的Activity实例,但不同standard的一点是,在请求的Activity(配置成singleTop的Activity)正好位于栈顶时,不会构造新的实例;
singleTask:和后面的singleInstance都只创建一个Activity实例,当intent到来时,系统会检查栈里面是否已经有该Activity的实例(配置成singleTask的Activity),如果有直接将intent发送给它;
singleInstance:该模式就是将Activity单独放入一个栈中,这个栈中只有这一个Activity,不同应用的intent都由这个Activity接收和展示(比如,在多个task中共享一个Activity),这样就做到了共享。
举个例来说,如果开启一个导游服务类的应用程序(指定为singleInstance模式),里面有个Activity是开启GOOGLE地图的,当按下home键退回到主菜单又启动GOOGLE地图的应用时,显示的就是刚才的地图,因为实际上它们是同一个Activity,该模式就是将该Activity单独放入一个栈中,不同应用的intent都由这个Activity接收和展示,从而完成数据共享。当然前提是这些应用都没有被销毁,所以刚才是按下的HOME键,如果按下了返回键,则无效。
无返回结果,从一个Activity启动另一个Activity(在同一应用程序中)。
Intent intent=new Intent();
intent.setClass(MainActivity.this, SecondActivity.class);
startActivity(intent);
Intent intent=new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
有返回数据/结果。主Activity触发有返回值的跳转,requestCode的值是自定义的,用于识别跳转的目标Activity;
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
startActivityForResult(intent, REQUESTCODE);//REQUESTCODE=1
跳转的目标Activity所要做的就是返回数据/结果,使用setResult(int resultCode)只返回结果不带数据,使用setResult(int resultCode, Intent data)两者都返回;
Intent intent=new Intent();
int sum=Integer.parseInt(result.getText().toString());
intent.putExtra("sum", sum);
//通过intent对象返回结果,setResult()方法
setResult(2,intent);//2是返回的结果码
finish();//结束当前activity的生命周期,才能从堆栈中得到主Activity,并处理返回结果
在主Activity中接收返回的数据/结果,并通过onActivityResult(int requestCode, int resultCode, Intent data)函数来处理,这里的requestCode(1)就是startActivityForResult的requestCode,resultCode(2)就是setResult里面的resultCode,返回的数据在data里面。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
if(resultCode==2){//2表示SecondActivity结束时的结束码
if(requestCode==REQUESTCODE){
int sum=data.getIntExtra("sum", 0); //读取SecondActivity返回的和
result.setText(String.valueOf(sum));
}
}
}
项目地址:Activity启动之startActivityForResult