1.什么是Activity
安卓四大组件之一, 用来显示界面, 一个Activity就是应用中一个界面
*** 2.创建
定义类继承Activity
清单文件中声明<activity>节点
*** 3.启动
创建Intent对象, Intent指定要启动哪个Activity, startActivity()
a.显式意图: 
指定类名, 通常用作应用程序内部跳转
通过构造函数, 或者setClass(), setClassName()方法可以指定类名
startActivity()启动一个Activity
如果启动其他应用程序中的Activity, 该Activity的export属性必须为true

b.隐式意图: 
不指定类名, 通常用在应用程序之间跳转
通过Intent.setAction()和Intent.setData()来设置意图的动作和数据

Activity中的<intent-filter>如果能匹配上动作和数据就可以启动

public void explicit(View v) {
		Intent intent = new Intent(this, OtherActivity.class);		// 创建意图
//		intent.setClass(this, OtherActivity.class);					// 指定类
//		intent.setClassName(this, "com.itheima.activity.MainActivity");
//		intent.setClassName("com.android.camera", "com.android.camera.Camera");		// 启动其他应用时, Activity的export属性为true才能用
		startActivity(intent);										// 启动Activity
	}
	
	public void implicit(View v) {
		Intent intent = new Intent();
		
		/*
		intent.setAction(Intent.ACTION_CALL);				// 设置动作
		intent.setData(Uri.parse("tel://18600012345"));		// 设置数据
		*/
		
		/*
		intent.setAction(Intent.ACTION_VIEW);
		intent.setData(Uri.parse("http://www.baidu.com"));
		*/
		
		intent.setAction(Intent.ACTION_VIEW);
		intent.setDataAndType(Uri.parse("file:///mnt/sdcard/a.jpg"), "image/*");
		
		/*
		intent.setAction(Intent.ACTION_VIEW);
		intent.setDataAndType(Uri.parse("file:///mnt/sdcard/1.mp3"), "audio/*");
		*/
		
		/*
		intent.setAction(Intent.ACTION_VIEW);
		intent.setDataAndType(Uri.parse("file:///mnt/sdcard/1.mp4"), "video/*");
		*/
		
		startActivity(intent);								// 根据意图中的动作和数据来匹配一个Activity
	}




*** 3.传递数据


a.启动时传递数据


Intent可以使用putExtra()方法装入数据(键值对)


新Activity中getIntent()之后, 可以调用getStringExtra(), getIntExt()获取数据


可传递数据类型: 基本数据类型, String, Bundle, Serializable, Parcelable


b.关闭时返回数据


如果希望新的Activity可以返回数据, 那么就需要使用(1)startActivityForResult()方法来启动Activity,


在新的Activity中调用(2)setReuslt(resultcode,intent)方法设置要返回的数据


finish()之后, 原Activity会自动调用(3)onActivityResult(), 该方法的形参就是setReuslt()设置的数据

public void sendData(View v){
		Intent intent=new Intent();
		intent.setClass(getApplicationContext(), OtherActivity.class);
		
		//传入基本数据类型;
//		intent.putExtra("name", "张三");
//		intent.putExtra("age", 10);
		
		//传递类类型;
//		Person p=new Person("李四",19);
//		intent.putExtra("person", p);
		
		//可以放入bundle类型;
//		Bundle bundle=new Bundle();
//		bundle.putSerializable("person", new Person("王五",89));
//		intent.putExtra("bundle", bundle);
		
		Person p=new Person("俊哥",88);
		intent.putExtra("person", p);
		
		startActivity(intent);
		
	}
	
	public void restoreData(View v){
		Intent intent=new Intent();
		intent.setClass(getApplicationContext(), OtherActivity.class);
		
		Person p=new Person("俊哥",88);
		intent.putExtra("person", p);
		
		this.startActivityForResult(intent, 100);//1.设置返回数据;
		
//		startActivity(intent);
		
	}
	
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent intent) {//3onActivityResult(),
//		super.onActivityResult(requestCode, resultCode, intent);
		
		String name=intent.getStringExtra("name");
		int age=intent.getIntExtra("age", -2);
		TextView tv_data2=(TextView) findViewById(R.id.tv_data2);
		tv_data2.setText(name+":"+age);
		
		Toast.makeText(getApplicationContext(), requestCode+","+resultCode, 0).show();

	}




*** 4.生命周期


onCreate(), onStart(), onResume(), onPause(), onStop(), onDestroy(), onRestart()


 ** 5.横竖屏切换


a.默认情况下, 横竖屏切换时会摧毁Activity重构, 因为要进行屏幕适配. 


可以使用onSaveInstanceState()保存数据, 用onRestoreInstanceState()恢复数据


onSaveInstanceState()在Activity失去焦点时也会被调用, 如果Activity在后台被杀死了, 再次启动时会自动调用onRestoreInstanceState()




layout:默认情况下,使用的布局文件;


layout-land:横屏


layout-port:竖屏,布局文件应该同名;






b.如果不需要屏幕适配, 那么可以通过定义属性控制Activity不摧毁重构


android:co 


c.固定Activity方向


android:screenOrientation="portrait"


在这种情况下, Activity不会摧毁重构, 也不会改变方向


d.相关代码


getResources().getConfiguration().orientation


setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)


setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)


*** 6.启动模式:launchMode(在<activity>.中配置)


a.standard: 每次都启动一个新的


b.singleTop: 不能自己创建自己


c.singleTask: 启动哪个, 就把它上面的出栈


d.singleInstance: 启动哪个就把哪个放在栈顶