1.activity是什么?
Activity是Android提供的四大组件之一,是进行Android开发必不可少的组件.Activity是一个界面的载体,可以把它与html页面进行类比,html页面由各种各样的标签组成,而Activity则可以由各种控件组成
2.activity的生命周期
2.1生命周期的最初理解
onCreate() :
当Activity第一次被创建的时候调用此方法.一般在此方法中进行控件的声明,添加事件等初始化工作.
onStart():
当Activity被显示到屏幕上的时候调用此方法.
onResume():
当此Activity能够被操作之前,也就是能够获得用户的焦点之前调用此方法.
onRestart():
当Activity被停止后又被再次启动之前调用此方法.接着将调用onStart()方法.
onPause():
当第一个Activity通过Intent启动第二个Activity的时候,将调用第一个Activity的onPause()方法.然后调用第二个Activity的onCreate(),onStart(),onResume()方法,接着调用第一个Activity的onStop()方法.如果Activity重新获得焦点,则将调用onResume()方法;如果此Activity进入用户不可见状态,那么将调用onStop()方法.
onStop():
当第一个Activity被第二个Activity完全覆盖,或者被销毁的时候回调用此方法.如果此Activity还会与用户进行交互,将调用onRestart方法();如果此Activity将被销毁,那么将调用onDestroy()方法.
onDestroy():
Activity被销毁之前调用此方法.或者是调用finish()方法结束Activity的时候调用此方法.可以在此方法中进行收尾工作,比如释放资源等.
(注意:重写某个Activity的这些回调方法的时候需要首先在第一行调用基类Activity的相应的回调方法.比如super.onCreate(),super.onStart()等等.)
2.2生命周期的简单应用场景
打开一个activity
onCreate —— onStart —— onResume
点击返回键(此时activity销毁)
onStop —— onDestroy
a页面跳b页面
a:onPause、b:onCreate、onStart、onResume、a:onStop
b页面返回a
b:onPause、a:onRestart、onStart、b:onStop、onDestroy
横屏到竖屏
07-10 18:57:34.481 16266-16266/com.example.day_09zhou_2 E/TAG: onPause:
07-10 18:57:34.485 16266-16266/com.example.day_09zhou_2 E/TAG: onStop:
07-10 18:57:34.485 16266-16266/com.example.day_09zhou_2 E/TAG: onDestroy:
07-10 18:57:34.530 16266-16266/com.example.day_09zhou_2 E/TAG: onCreate:
07-10 18:57:34.532 16266-16266/com.example.day_09zhou_2 E/TAG: onStart:
07-10 18:57:34.538 16266-16266/com.example.day_09zhou_2 E/TAG: onResume:
竖屏到横屏
07-10 18:58:09.266 16266-16266/com.example.day_09zhou_2 E/TAG: onPause:
07-10 18:58:09.267 16266-16266/com.example.day_09zhou_2 E/TAG: onStop:
07-10 18:58:09.267 16266-16266/com.example.day_09zhou_2 E/TAG: onDestroy:
07-10 18:58:09.328 16266-16266/com.example.day_09zhou_2 E/TAG: onCreate:
07-10 18:58:09.331 16266-16266/com.example.day_09zhou_2 E/TAG: onStart:
07-10 18:58:09.336 16266-16266/com.example.day_09zhou_2 E/TAG: onResume:
锁屏
07-10 18:59:20.652 16266-16266/com.example.day_09zhou_2 E/TAG: onPause:
07-10 18:59:20.685 16266-16266/com.example.day_09zhou_2 E/TAG: onStop:
开屏
07-10 18:59:46.299 16266-16266/com.example.day_09zhou_2 E/TAG: onRestart:
07-10 18:59:46.333 16266-16266/com.example.day_09zhou_2 E/TAG: onStart:
07-10 18:59:46.515 16266-16266/com.example.day_09zhou_2 E/TAG: onResume:
2.3解决切换横竖屏的时候会重走生命周期
1.activity标签设置 android:configChanges="orientation|keyboardHidden|screenSize"
这样切换横竖屏就不会重新执行生命周期,可以重写方法,在里面执行切换横竖屏时要做的操作
@Override
public void onConfigurationChanged(Configuration newConfig) {
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
Log.d("===","\n 当前屏幕为横屏");
} else {
Log.d("===","\n 当前屏幕为竖屏");
}
super.onConfigurationChanged(newConfig);
Log.e("===", "onConfigurationChanged");
// setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); //设置横屏
}
2.固定屏幕,强制不让他旋转
只竖屏显示(android:screenOrientation="portrait")
只横屏显示(android:screenOrientation="landscape")
3.四种启动模式
在 manifest 文件中声明 activity 时,你可以利用activity元素的launchMode属性来设定 activity 与 task 的关系。launchMode 属性指明了 activity 启动 task 的方式。 launchMode 属性可设为四种启动模式:
standard:默认模式
是最常见的activity启动方式,也是默认的启动的方式。当启动一个activity的时候他将进入返回栈的栈顶。系统不会管栈内是否有相同的activity,方式像后入先出。
singleTop:栈顶模式
方式是在活动启动的时候,系统先判定栈顶是否有相同的活动,如果没有则新建活动,否则将不新建活动。而是直接使用他。
singleTask:栈内复用
方式在活动启动的时候,系统先判定栈中是否有该活动的实例,如果没有这新建实例,如果有则将已有活动上面的栈都出栈。
singleInstance:单栈模式
方式在启动的时候会新建一个栈,当别的程序访问这个活动启动这个活动的时候得到的也是这个实例,所有应用访问的都是同一个实例。
4.跳转页面和传值
跳转页面使用intent
4.1跳转页面
4.1.1.跳转至当前进程其他activity页面
Intent intent = new Intent(this, Main2Activity.class);
startActivity(intent);
4.1.2.跳转至其他app的activity
Intent intent=new Intent(); intent.setComponent(new ComponentName(String packageName,String activityName )); startActivity(intent);
注:这样是跳到主activity,如果要跳到其他activity需要在对方activity标签下android:exported="true"
4.1.3.打开常见的系统的activity
打开浏览器网页:
Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
打开相册:
Intent intent = new Intent(); intent.setAction(Intent.ACTION_GET_CONTENT); intent.setType("image/*"); startActivity(intent);
打开发送短信界面:
Intent intent = new Intent(); intent.setAction(Intent.ACTION_SEND); intent.setType("text/plain"); intent.putExtra(Intent.EXTRA_TEXT,"Hello World !"); startActivity(intent);
打开拨号界面:
Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.setData(Uri.parse("tel:110")); startActivity(intent);
4.2传值
4.2.1 传递基本数据,以键值对的形式,接收的时候也是通过键值对
发送:
Intent intent = new Intent(this, Main2Activity.class);
intent.putExtra("key","value");
startActivity(intent);
接收:
Intent intent = getIntent();
String key = intent.getStringExtra("key");
4.2.2 传递对象
实体类实现Serializable接口
发送和发送基本数据一致
接收:强转成实体类类型
Bean key = (Bean)intent.getSerializableExtra("key");
还可以通过bundle来传递
发送:
Intent intent = new Intent(Activity1.this,Activity2.class); Person person = new Person("zhangsan",23,"USST","ShangHai"); Bundle bundle = new Bundle(); bundle.putSerializable("person",person); intent.putExtras(bundle); startActivity(intent);
接收和上面的接收方式一致