安卓学习之Activity

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: 启动哪个就把哪个放在栈顶
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值