生命周期
onCreate:create表示创建,这是Activity生命周期的第一个方法,也是我们在android开发中接触的最多的生命周期方法。它本身的作用是进行Activity的一些初始化工作,比如使用setContentView加载布局,对一些控件和变量进行初始化等。但也有很多人将很多与初始化无关的代码放在这,其实这是不规范的。此时Activity还在后台,不可见。所以动画不应该在这里初始化,因为看不到……
onStart:start表示启动,这是Activity生命周期的第二个方法。此时Activity已经可见了,但是还没出现在前台,我们还看不到,无法与Activity交互。其实将Activity的初始化工作放在这也没有什么问题,放在onCreate中是由于官方推荐的以及我们开发的习惯。
onResume:resume表示继续、重新开始,这名字和它的职责也相同。此时Activity经过前两个阶段的初始化已经蓄势待发。Activity在这个阶段已经出现在前台并且可见了。这个阶段可以打开独占设备
onPause:pause表示暂停,当Activity要跳到另一个Activity或应用正常退出时都会执行这个方法。此时Activity在前台并可见,我们可以进行一些轻量级的存储数据和去初始化的工作,不能太耗时,因为在跳转Activity时只有当一个Activity执行完了onPause方法后另一个Activity才会启动,而且android中指定如果onPause在500ms即0.5秒内没有执行完毕的话就会强制关闭Activity。从生命周期图中发现可以在这快速重启,但这种情况其实很罕见,比如用户切到下一个Activity的途中按back键快速得切回来。
onStop:stop表示停止,此时Activity已经不可见了,但是Activity对象还在内存中,没有被销毁。这个阶段的主要工作也是做一些资源的回收工作。
onDestroy:destroy表示毁灭,这个阶段Activity被销毁,不可见,我们可以将还没释放的资源释放,以及进行一些回收工作。
onRestart:restart表示重新开始,Activity在这时可见,当用户按Home键切换到桌面后又切回来或者从后一个Activity切回前一个Activity就会触发这个方法。这里一般不做什么操作。
pointer
- onStart方法和onResume方法有什么区别(onStop和onPause)
是否在前台。onStart方法中Activity可见但不在前台,不可交互,而在onResume中在前台。
- A activity打开B activity A 的onpause()和B的onResume哪个先执行
先A onPause()然后再执行B的onResume
- onSaveInstanceState和onRestoreInstanceState的作用
横屏操作发生,导致activity被销毁时,会调用onSaveInstanceState,可以在其中存取数据,恢复时会调用onRestoreInstanceState获取bundle数据(非空)设置它,oncreate中也可以获取bundle数据设置它,但是oncreate中不一定是非空的
- 使activity不会因为屏幕旋转而被重新创建的方法
给activity设置android:configchanges="orientation|screenSize",configchanges的其他属性
LaunchMode
Standard:新建一个实例,进入创建它的activity的栈中
singleTop:栈顶复用模式,如果在栈顶就不会被重新创建,它的onNewIntent方法会被调用,这个activity的onCreate和onStart不会被调用
singleTask:栈内复用,需要的任务栈中有该实例时,就不创建新实例(需要的任务栈指的事TaskAffinity属性,他可以指定任务栈的名字,默认是包名)
singleInstance:一个activity独自占据一个任务栈
指定LaunchMode的方法
//manifest中的activity配置
android:launchMode="singleTask"
//添加flag标签
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Flags
- FLAG_ACTIVITY_NEW_TASK :
对应singleTask模式
- FLAG_ACTIVITY_SINGLE_TOP:
对应singleTop模式
- FLAG_ACTIVITY_CLEAR_TOP:
如果设置了此标志位,并且被启动的Activity已经存在于这个Task中,则不会启动一个该Activity的新的实例,而是弹出在Task中,该Activity上的所有Activity。同时,这个intent作为一个新的intent会传递给该Activity。
- FLAG_ACTIVITY_CLEAR_TASK:
如果设置了这个标志的intent通过Context.startActivity()去启动某个Activity,那么该标志会导致任何与此获得弄个相关联的task被清空,在这个活动启动之前。然后,该活动就会变成根Activity,之前的活动全被销毁了。这个标志只能和FLAG_ACTIVITY_NEW_TASK在一起使用
IntentFilter
<intent-filter>
<action android:name="android.intent.action.SEND"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="text/plain"/>
<data android:mimeType="image/*"/>
</intent-filter>
需要同时匹配action,category,data才能成功隐式启动activity
action
系统预定义了一些action,像android.intent.action.SEND可以用来分享信息,其他应用如果也有activity定义了此action时,进行隐式调用android.intent.action.SEND时,会谈出选择框将所有含此action的应用列出来进行选择分享
category
使用android.intent.category.DEFAULT就好了
data
分为uri和mimetype,像例子一样就是分享文本和图片,当uri匹配成功才会被调用起来
自定义ActivityManager
public class ActivityManager{
private static final String TAG = "ActivityManager";
private static Stack<Activity> activityStack;
private static ActivityManager instance;
private Activity currActivity;
private ActivityManager(){
}
public static ActivityManager getActivityManager(){
if(instance == null){
instance = new ActivityManager();
}
return instance;
}
//退出栈顶Activity
public void popActivity(Activity activity){
if(activity == null || activityStack == null){
return;
}
if(activityStack.contains(activity)){
activityStack.remove(activity);
}
currActivity = activity;
//activity.finish;
}
public void destoryActivity(Activity activity){
if(activity == null){
return;
}
activity.finish();
if(activityStack.contains(activity)){
activityStack.remove(activity);
}
activity=null;
}
//获得当前栈顶Activity
public Activity currentActivity(){
if(activityStack == null||activityStack.empty()){
return null;
}
return activityStack.lastElement();
}
//将当前Activity推入栈中
public void pushActivity(Activity activity){
if(activityStack == null){
activityStack = new Stack<Activity>();
}
activityStack.add(activity);
}
//退出栈中除指定的Activity外所有
public void popAllActivityExceptOne(Class cls){
while(true){
Activity activity = currentActivity();
if(activity == null){
break;
if(activity.getClass().equals(cls))
break;
destroyActivity(activity);
}
}
//退出栈中所有Activity
public void popAllActivity(){
popAllActivityExceptOne(null);
}
public Activity getCurrentActivity(){
return currActivity;
}
public int getActivityStackSize(){
int size = 0;
if(activityStack != null){
size = activityStack.size();
}
return size;
}
}