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: 启动哪个就把哪个放在栈顶