一、Activity活动
学习Android,第一个都会接触Activity滴,Activity表示一个用户界面,是Android应用程序的入口,可以同时有多个界面,但只会显示栈顶的界面。
Activity是Android的重要组成部分,一个程序包括多个Activity,新建项目都会有个程序启动时就调用的MainActivity。新定义Activity需在AndroidManifest配置。
如下是最简单的配置方式:
1 <activity 2 android:name=".OtherActivity" 3 android:label="other" > 4 </activity>
二、Activity的生命周期
Activity的生命周期交由系统管理,每个Activity都是平等的,Activity拥有四种基本状态
1、Active/Running:一个新的Activity启动入栈后,它在屏幕的最前端,处于栈顶。此时它处于可见和可交互状态;
2、Pause:当Activity被一个透明的或Dialog样式的Activity覆盖时,它虽然仍与窗口管理器联系,仍然可见,但是此时它是失去焦点,不可交互的;
3、Stop:当Activity被另一个Activity覆盖时,完全不可见,并且不可交互,此时处于stop状态;
4、Kill:被系统进程杀死或者回收的状态,由于系统资源有限,越是处于栈的底层,越容易被回收;
上面是google官方的Activity生命周期示意图,看图比较好理解和记忆Activity生命周期。结合生命周期状态来讲讲生命周期相关方法
1、onCreate:Activity被启动的调用的第一个方法,作为应用程序的入口点,一般做些 数据初始化和加载用户界面的工作;
2、onStart:在onCreate之后被调用,或者一个Activity从Stop变为Active状态;
3、onResume:从Pause状态被切换为Active状态时被调用;
4、onStop:从Active状态被切换为Stop状态时被调用,一般在这里保存Activity的状态信息;
5、onDestroy:在Active被结束时调用,一般做些释放资源,清除内存等工作。
此外还有一些不常用的方法如"重新启动 onRestart","暂停 onPause"
我们可以新建个Activity,Android.util的 Log类可以实现Android输出Log这一操作,
该类提供了若干静态方法
Log.v(String tag, String msg);
Log.d(String tag, String msg);
Log.i(String tag, String msg);
Log.w(String tag, String msg);
Log.e(String tag, String msg);
分别对应 Verbose, Debug, Info, Warning,Error.
tag是一个标识,可以是任意字符串,通常可以使用类名+方法名, 主要是用来在查看日志时提供一个筛选条件。
如Log.v(tag, msg)用来打印日志查看不同状态间的切换或不同方法的执行情况。
1 @Override 2 protected void onCreate(Bundle savedInstanceState) { 3 super.onCreate(savedInstanceState); 4 setContentView(R.layout.activity_main); 5 Log.v("MainActivity", "onCreate"); 6 } 7 8 @Override 9 protected void onStart() { 10 // TODO Auto-generated method stub 11 super.onStart(); 12 Log.v("MainActivity", "onStart"); 13 } 14 15 @Override 16 protected void onStop() { 17 // TODO Auto-generated method stub 18 super.onStop(); 19 Log.v("MainActivity", "onStop"); 20 } 21 22 @Override 23 protected void onResume() { 24 // TODO Auto-generated method stub 25 super.onResume(); 26 Log.v("MainActivity", "onResume"); 27 } 28 29 @Override 30 protected void onPause() { 31 // TODO Auto-generated method stub 32 super.onPause(); 33 Log.v("MainActivity", "onPause"); 34 } 35 36 @Override 37 protected void onDestroy() { 38 // TODO Auto-generated method stub 39 super.onDestroy(); 40 Log.v("MainActivity", "onDestroy"); 41 }
三、Activity栈
Android 是通过一种 Activity 栈的方式来管理 Activity 的,一个 Activity 的实例的状态决定它在栈中的位置。处于前台的 Activity 总是在栈的顶端,当前台的 Activity 因为异常或其它原因被销毁时,处于栈第二层的 Activity 将被激活,上浮到栈顶。当新的 Activity 启动入栈时,原 Activity 会被压入到栈的第二层。一个 Activity 在栈中的位置变化反映了它在不同状态间的转换。
除了最顶层即处在 Active 状态的 Activity 外,其它的 Activity 都有可能在系统内存不足时被回收,一个 Activity 的实例越是处在栈的底层,它被系统回收的可能性越大。系统负责管理栈中 Activity 的实例,它根据 Activity 所处的状态来改变其在栈中的位置。
四、Activity的加载模式
Activity有四种加载模式(一直忽略这个细节),使用适合的加载模式可以避免产生大量的重复的Activity,从而优化性能,减少系统资源消耗。具体为:
1、standard: 标准模式(默认的),一调用startActivity()方法就会产生一个新的实例。
2、singleTop: 检查是否已经存在了一个实例位于Activity栈的顶部,如果存在就不产生新的实例,反之则调用Activity的newInstance()方法产生一个新实例。
3、singleTask: 在一个新的Task(栈)中产生这个实例,以后每次调用都会使用此实例,而避免产生新的实例。
4、singleInstance: 这个基本上跟singleTask一样,只是有一点不同,那就是在这个模式下的Activity实例所处(新建的)Task中,只能有这一个Activity实例,而不能有其他的实例。
启动模式可以Android清单文件AndroidManifest.xml中,通过<activity>中的launchMode属性进行设置
1 <activity android:name="MainActivity" android:launchMode="singleTop"> 2 <intent-filter> 3 <category android:name="android.intent.category.DEFAULT"/> 4 </intent-filter> 5 </activity>
也可以在代码中通过一些标志进行设置
1 Intent intent = new Intent(this,xxx.class); 2 //如果activity在task存在,拿到最顶端,不会启动新的Activity 3 intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT); 4 //如果activity在task存在,将Activity之上的所有Activity结束掉 5 intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 6 //默认的跳转类型,将Activity放到一个新的Task中 7 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 8 //如果Activity已经运行到了Task,再次跳转不会在运行这个Activity 9 intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
五、Activity间的通信
Activity.startActivity()方法可以根据传入的参数启动另外一个 Activity:
1 //Intent可以在不同的应用程序的Activity发送数据 2 intent.putExtra("testIntent", "Robin"); 3 intent.setClass(MainActivity.this, OtherActivity.class); 4 //从哪里跳到哪里 5 MainActivity.this.startActivity(intent);
另一Activity里再接收信息(新的Activity如第一点说的要在AndroidManifest配置)
1 Intent intent=getIntent(); 2 String value=intent.getStringExtra("testIntent");
六、其他细节
back和home 按键对Activity作用的区别?
当你一按下手机的back键的时候,系统会默认调用程序栈中最上层Activity的Destroy()方法来销毁当前Activity,当此Activity又被其它Activity启动起来的时候,会重新调用OnCreate()方法进行创建,当栈中所有Activity都弹出结束后,应用也就随之结束了。按下手机的Home键的时候,系统会默认调用程序栈中最上层Activity的stop()方法,然后整个应用程序都会被隐藏起来,当你再次点击手机桌面上应用程序图标时,系统会调用最上层Activity的OnResume()方法,此时不会重新打开程序,而是直接进入,会直接显示程序栈中最上层的Activity。