不一样的Activity

回顾android Activity,突然发现我不懂了,有可能是我以前没想太多,现在来整理下吧;(孔子曾说过 温故而知新,可以为师矣

Android 中最重要的是四大组件,即Activity、Service、ContentProvider和Broadcast。这4个组件分工明确,共同构成了可重用、灵活、低耦合的Android系统。

Activity负责UI元素的加载与页面之间的跳转,代表了一个页面单元;Swevice负责与ui无关的工作,如在后台执行耗时操作等;ContentProvider负责存储、共享数据,使得数据可以在多个应用之间共享;Broadcast则是各个组件、应用之间进行通信,简化了Android开发中的通信问题。

这里只讲Activity:

一、Activity介绍

Activity在大家看来显示用户界面,会加载一些UI元素与UI的交互,如:textview,edittext,listview,imageview等,还可以进行一些界面的跳转,共同完成特定的操作流程。每个应用都有一个或多个activity组成,它是App程序中不可缺少的一部分。

应用默认加载的Activity再AndroidManifest.xml中必须加上intent-filter

<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android:intent.category.LAUNCHER"/>
</intent-filter>

二、Activity生命周期

1.onCreate()

它在Activity第一次被创建时调用,通常会在这个函数中完成activity的初始化操作,如:设置布局、初始化视图、绑定事件等。

2.onStart()

这个函数在activity的onCreate函数调用之后被调用,此时的Activity还处在不可见状态,它的下一个状态就是Activity变得可见的时候,也就是这个函数在Activity可见之前被调用。

3.onResume()

这个函数在Activity变为可见时被调用,执行完onResume之后,Activity就会请求AMS渲染它所管理的视图。此时的Activity一定位于返回栈的栈顶,并且处于运行状态。

4.onPause()

这个函数在系统准备去启动或者恢复另一个Activity时调用,也就是在Activity即将从可见状态变为不可见时。我们通常会在这个函数中将一些消耗CPU的资源放掉,以及保存一些关键数据。

5.onStop()

这个函数在Activity完全不可见时调用。它和onPause()函数的主要区别在于,如果新启动的Activity是一个对话框的Activity,那么onPause()函数会得到执行,而onStop()函数并不会执行。

6.onDetroy()

这个函数在Activity被销毁之前调用,之后Activity的状态将会变为销毁状态。

7.onRestart()

这个函数在activity由停止状态重新变为运行状态之前调用,也就是Activity被重新启动了。

三、Activity的构成

Activity的构成并不是一个Activity对象再加上一个布局文件那么简单,在Activity和开发人员设置的视图之间还隔着2层。
视图的总类是window类,之后是顶级视图DecorView,顶级视图下有个mContentPatent布局,开发者其实是在mContentPatent内操控视图。
Window类是抽象类,DecorView是实现类,mContentPatent是实现类里的方法,这样理解更好点。

四、Activity的4种启动模式

Activity提供4个启动模式,我们可以在一些特殊情况下对Activity实例做一些特殊的处理.

1.standard(标准启动模式)

如果ActivityA的启动模式为standard,并且已经有一个ActivityA被启动,再次调整ActivityA的话,会在栈中重新实例化一个ActivityA实例,这种模式比较消耗资源。

2.singleTop(节约模式)

如果ActivityA在栈顶显示,重新调用ActivityA的话,它不会重新在栈内new一个新ActivityA的实例,而会重用原来的实例,并且调用原来实例的onNewIntent()函数。但是ActivitA不在栈顶的话,重新调用ActivityA的话,它会像standard一样,重新在栈内new一个新的ActivityA实例

3.singleTask(霸王餐模式)

ActivityA在栈顶时,它会像singleTop一样,不会重新实例,而会重用原来的实例,并且调用原来实例的onNewIntent()函数。如果不在栈顶,在栈内的话的话,它会把ActivityA之上的实例全部销毁,让ActivityA在栈顶。如果ActivityA没有被实例的话,它会自动实例化ActivityA,并把ActivityA放在栈顶。

4.singInstance(小灶模式)

ActivityA开启的话,它会开启一个单独的任务(线程),app相当于进程。一个进程内可以有多个线程。如果APPA内开了一个ActivityA线程,AppB内也开一个ActivityA线程的话,后面的线程会把前面的线程覆盖掉,因为singleInstance能够保证Activity在系统中只有一个实例,不管多少应用要启动该Activity,这个Activity有且只有一个.

五、FragmentActivity与Fragment

为了更好运用越来越大的屏幕空间,Android在3.0版本引入了Fragment,它可以像Activity一样包含布局。不同的是Fragment是被镶嵌在Activity中使用,它作为一个更大粒度的UI单元。如果需要兼容低于Android3.0的系统,那么开发人员需要引入android-support-v4的jar包才能使用Fragment功能。
而且使用Fragment性能上得到了提高,Activity跳转Activity会有一定延迟,在手机不好的情况下更明显。然后我们习惯性在一个Activity上添加不同的Fragment,这种是一个小的优化。
比如:
MianActivity: 
  xml:只有一个FrameLayout
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/content_frame"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    

</FrameLayout>
 java内加载不同的Fragment
代码:
//隐藏fragment
    public void hideFragment(FragmentTransaction ft) {
        //如果不为空,就先隐藏起来

        if (homeFragment != null) {
            ft.hide(homeFragment);
        }
        if (switchColumnFragment != null) {
            ft.hide(switchColumnFragment);
        }
    }

    //显示fragment
    public void showFragment(int index){

        FragmentTransaction ft = getSupportFragmentManager()
                .beginTransaction();
        hideFragment(ft);
        //注意这里设置位置
        position = index;

        switch (index){

            case FRAGMENT_ONE:
                if (homeFragment == null) {
                    homeFragment = new HomeFragment();
                    ft.add(R.id.content_frame, homeFragment);
                } else {
                    ft.show(homeFragment);
                }

                break;
            case FRAGMENT_TWO:
                if (switchColumnFragment == null) {
                    switchColumnFragment = new SwitchColumnFragment();
                    ft.add(R.id.content_frame, switchColumnFragment);
                } else {
                    ft.show(switchColumnFragment);
                }

                break;
        }

        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
//                ft.addToBackStack(null);//点击返回,会返回上一次的fragment
        ft.commitAllowingStateLoss();// 最后再提交

    }
这里注意:需要下面代码,防止切换横竖屏
@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    //屏幕旋转时记录位置
    outState.putInt(HealthManagementActivity.POSITION, position);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    //屏幕恢复时取出位置
    showFragment(savedInstanceState.getInt(HealthManagementActivity.POSITION));
    super.onRestoreInstanceState(savedInstanceState);
}
看到这样的同道会有这样的想法,fragment这么方便,那我把所有的Activity都换成fragment,行不行?
答案是,不行的,这种只比较适合连续一起的界面,比如主页面,登录界面-》注册/找回密码 这样的界面。
全部使用Fragment的话  一些界面的跳转传参就会比较麻烦。
我们要看哪里方便我们就使用什么控件,这个我们要自己把握哦~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值