Activity

作者: Trainee | 来源:发表于2017-09-01 16:57 被阅读0次

    生命周期

    image

    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的其他属性


    image

    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;
        }
    }
    

    相关文章

      网友评论

        本文标题:Activity

        本文链接:https://www.haomeiwen.com/subject/yyjkjxtx.html