activity简介

一个Activity是一个应用程序组件,提供一个屏幕,用户可以用来交互为了完成某项任务,例如拨号、拍照、发送email、看地图。每一个activity被给予一个窗口,在上面可以绘制用户接口。窗口通常充满屏幕,但也可以小于屏幕而浮于其它窗口之上。
  一个应用程序通常由多个activities组成。通常,一个应用程序中的都有一个mainactivity,相当于程序的入口。其他activity从这个activity启动。每一次一个activity启动,前一个activity就停止了,但是系统保留activity在一个栈上(“back stack”)。当一个新activity启动,它被推送到栈顶,取得用户焦点。Back Stack符合简单“后进先出”原则,所以,当用户完成当前activity然后点击back按钮,它被弹出栈(并且被摧毁),然后之前的activity恢复。

  当一个activity因新的activity启动而停止,它被通知这种状态转变通过activity的生命周期回调函数。有许多回调函数一个activity可能会收到,源于它自己的状态变化-无论系统创建它、停止它、恢复它、摧毁它-并且每个回调提供你完成适合这个状态的指定工作的机会。例如,当停止的时候,你的activity应该释放任何大的对象,例如网络数据库连接。当activity恢复,你可以重新获得必要的资源和恢复被中断的动作。这些状态转换都是activity的生命周期的部分.

一 创建一个activity

定义一个类继承activity类,并且在清单文件中注册这个类.新创建的activity,必须在清单文件中做配置,否则系统找不到,在显示时会直接报错.
1.定义一个类
      public class SecondActivity extends Activity 
2.在清单文件中注册这个类
         

关于  android:icon="@drawable/ic_launcher"和android:label="主界面"属性,这两个属性可以在activity上添加,也可以在appliction上添加,两者的区别在于添加到application时,图片和文字是在系统的设置列表中,app目录下面.而在activity上是显示在某个具体的activity上的.
一般地,每个apk都会有一个activity加上下面的过滤器,表示这个activity是程序的入口.就是打开app第一个进入的页面.
            
                
                
            
3.创建一个布局文件,并将这个布局文件设置给新建的activity
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_second);
	}


二 activty的生命周期

来看看谷歌官方的图片
activity简介_第1张图片
简要概述如下:
void onCreate(): Activity已经被创建完毕
void onStart(): Activity已经显示在屏幕,但没有得到焦点
void onResume(): Activity得到焦点,可以与用户交互
void onPause(): Activity失去焦点,无法再与用户交互,但依然可见 比如第二个页面背景透明 还能看到第一个页面,但失去焦点,无法与用户交互
void onStop(): Activity不可见,进入后台
void onDestroy():Activity被销毁
void onRestart(): Activity从不可见变成可见时会执行此方法
完整生命周期(entire lifetime)
onCreate-->onStart-->onResume-->onPause-->onStop-->onDestory
可视生命周期(visible lifetime)
onStart-->onResume-->onPause-->onStop
前台生命周期(foreground lifetime)
onResume-->onPause
注意:
* 内存不足时,系统会优先杀死后台Activity所在的进程,都杀光了,如果内存还是不足,那么就会杀死暂停状态的Activity所在的进程,如果还是不够,有可能杀死前台进程
* 如果有多个后台进程,在选择杀死的目标时,采用最近最少使用算法(LRU)

三 activity跳转

安卓利用Intent(意图)来沟通组件,Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。Intent不仅可用于应用程序之间,也可用于应用程序内部的Activity/Service之间的交互。因此,可以将Intent理解为不同组件之间通信的“媒介”专门提供组件互相调用的相关信息。activity跳转分为显示跳转和隐式跳转.

3.1显式意图跳转

     通过设置Activity的包名和类名实现跳转,称为显式意图.如下:
	* 跳转至同一项目下的另一个Activity,直接指定该Activity的字节码即可
		Intent intent = new Intent();
		intent.setClass(this, SecondActivity.class);
    	startActivity(intent);

	* 跳转至其他应用中的Activity,需要指定该应用的包名和该Activity的类名
		//显示跳转到拨号器
		Intent intent = new Intent();
		//启动系统自带的拨号器应用
		intent.setClassName("com.android.dialer", "com.android.dialer.DialtactsActivity");
		startActivity(intent);


3.2隐式意图跳转

     就是通过设置意图的action进行跳转
        * 隐式意图跳转至指定Activity
        Intent intent = new Intent();
		//启动系统自带的拨号器应用
    	intent.setAction(Intent.ACTION_DIAL);
    	startActivity(intent);
    自定义activity进行隐式跳转.要让一个Activity可以被隐式启动,需要在清单文件的activity节点中设置intent-filter子节点.在跳转时startactivity(intent)时查清单文件搜索action的name值 和category的值是否匹配,匹配就跳转.
	
			//name值随便写,大概写成包名就可以了 为这个activity定义一个动作名
			//name 的值就是动作名,需要动作名时写这个
            		
            		//必须要写,不写跳不过来
			
			//mineType可以自己定义 如:text/username 
			//要想完全匹配这样2个属性的节点 代码中必须intent.setDataAndType(Uri.parse("asd:qwe123"), "aa/bb");这样写
			
        
* action 指定动作(可以自定义,可以使用系统自带的)
* data   指定数据(操作什么内容) scheme的值可以随便写 不过用时intent.setData(Uri.parse("asd:qwe"));中的前缀asd必须相同。否则无法启动activity 
如果不写scheme属性,直接写android:mimeType="aa/bb"在启动的时候要intent.setType("aa/bb");这样设置才能对应到android:mimeType="aa/bb"
intent.setType("aa/bb") 会清除掉intent.setData()里面设置的值。这两个API是不能共存的
* category 类别 (默认类别,机顶盒,车载电脑)
* 隐式意图启动Activity,需要为intent设置以上三个属性,且值必须与该Activity在清单文件中对三个属性的定义匹配
 activity下的intent-filter节点及intent-filter其子节点都可以同时定义多个,隐式启动时只需与任意一个匹配即可启动这个activity
	
		可以都多个,只要匹配其中一个就能启动这个activity
		
		
		
		
	

3.3显式意图和隐式意图的应用场景

* 显式意图用于启动同一应用中的Activity, 隐式意图用于启动不同应用中的Activity
* 如果系统中存在多个Activity的intent-filter同时与你的intent匹配,那么系统会显示一个对话框,列出所有匹配的Activity,由用户选择启动哪一个
* 再启动效率上,隐式远远低于显式

3.4 跳转activity时携带数据

* Activity通过Intent启动时,可以通过Intent对象携带数据到目标Activity

	Intent intent = new Intent(this, SecondActivity.class);
    	intent.putExtra("maleName", maleName);
    	intent.putExtra("femaleName", femaleName);
    	startActivity(intent);
* 在目标Activity中取出数据

	Intent intent = getIntent();
	String maleName = intent.getStringExtra("maleName");
	String femaleName = intent.getStringExtra("femaleName");

3.5跳转一个activity并返回一个结果

从A界面打开B界面, B界面关闭的时候,返回一个数据给A界面
步骤:
1. 开启activity并且获取返回值
startActivityForResult(intent, 0);
2. 在新开启的界面里面实现设置数据的逻辑
Intent data = new Intent();
data.putExtra("phone", phone);
//设置一个结果数据,数据会返回给调用者
setResult(0, data);
finish();//关闭掉当前的activity,才会返回数据
3. 在开启者activity里面实现方法
onActivityResult(int requestCode, int resultCode, Intent data) 
通过data获取返回的数据
4. 根据请求码和结果码确定业务逻辑



你可能感兴趣的:(安卓)