Android之四大组件

Android四大组件之一Activity

1.Activity简介

  Activity是一个应用程序组件,主要用于和用户交互,通常为用户提供窗口,此窗口可以充满屏幕,但也可以小于屏幕而浮于其它窗口之上,也就是说一个应用程序可以由多个Activities组成,但必须要指定一个”MainActivity”在第一次启动时调用,当新的Activity启动时,原先的Activity会被压入堆栈中,直到按返回键一个一个退出新启动的Activity。

1.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()来判断它。

Activity的Intent Filter

  在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的类型。

Activity的加载模式

  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的跳转

startActivity(intent):

无返回结果,从一个Activity启动另一个Activity(在同一应用程序中)。

Intent intent=new Intent();
intent.setClass(MainActivity.this, SecondActivity.class);           
startActivity(intent);
Intent intent=new Intent(MainActivity.this, SecondActivity.class);  
startActivity(intent);

startActivityForResult (Intent intent, int requestCode):

有返回数据/结果。主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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值