zoukankan      html  css  js  c++  java
  • Android 四大组件之 Activity

    Android的四大组件分别是“Activity”,“Broadcast Receivers”,“Service”,“Content Providers

    Activity是作为和用户之间直接交互的UI组件,Activity组件无疑在Android的UI组件中占据着重要的位置。在通常情况下,Activity作为一个全屏的窗口出现,也可以作为浮动窗口或者其他Activity的子Activity出现。

    作为应用生命周期中最重要的组件之一,Activity的发布和管理构成了平台应用模型的基础。在Android中,Activity的管理是通过Activity栈的方式来进行的,在Activity的生命周期中,存在4种状态:激活(active)、运行(running)、停止(stopped)、暂停(paused)。

    如图:

    Active/Runing

    当Activity处于屏幕的前端时,Activity处于"active"或"running"状态,此时它处于可见并可和用户交互的激活状态,叫做活动状态或者运行状态(active or running)。

    Paused

    当Activity失去焦点但可见(新建了一个非全屏或者透明的Activity,该Activity处于Activity栈的顶部)时,Activity处于"paused"状态。处于"paused"状态的Activity依然维护着其所有的状态和成员信息,并继续处于窗口管理器的管理之下,在内存极端不足情况下,处于"paused"状态的Activity有可能被杀死。

     Stoped

    如果一个Activity被另外的Activity完全覆盖掉,叫做停止状态(Stopped)。它依然保持所有状态和成员信息,但是它不再可见,所以它的窗口被隐藏,当系统内存需要被用在其他地方的时候,Stopped的Activity将被强行终止掉。

    Killed

     如果一个Activity是Paused或者Stopped状态,系统可以将该Activity从内存中删除,Android系统采用两种方式进行删除,要么要求该Activity结束,要么直接终止它的进程。当该Activity再次显示给用户时,它必须重新开始和重置前面的状态。

    在Activity变得再次可见时,如果需要做界面上的刷新,相关的操作可以在Activity:: onResume()方法中处理。在Activity构建完成后会获得焦点,相应的焦点变化可以在Activity:: onWindowFocusChanged()方法中监听。

    Activity栈
    Android 是通过一种 Activity 栈的方式来管理 Activity 的,一个 Activity 的实例的状态决定它在栈中的位置。处于前台的 Activity 总是在栈的顶端,当前台的 Activity 因为异常或其它原因被销毁时,处于栈第二层的 Activity 将被激活,上浮到栈顶。当新的 Activity 启动入栈时,原 Activity 会被压入到栈的第二层。一个 Activity 在栈中的位置变化反映了它在不同状态间的转换。

    Activity和Activity间的切换通常需要借助于Intent组件来进行。一个最简单的调用方式如下:

    Intent in = new Intent(context, BluetoothOppBtErrorActivity.class); //设置调用的Activity 
    in.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); //设置标志位
    in.putExtra("title", context.getString(R.string.unknown_file)); //设置标题
    in.putExtra("content", context.getString(R.string.unknown_file_desc));//设置显示内容
    context.startActivity(in); //启动Activity,不需返回数据


    在被调Activty中,处理数据的方法如下:
       

     protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            Intent intent = getIntent();
            String mErrorTitle = intent.getStringExtra("title");
            mErrorContent = intent.getStringExtra("content");
    
        }

    在泛化Activity类时,必须实现Activity:: onCreate()和Activity:: onPause ()两个方法。另外通过一个Activity调用另一个Activity时,如果不需要返回数据,可以通过Context.startActivity()方法来进行。如果需要返回数据,则通过Context.startActivityForResult()方法来处理,常见的方式如下:

    Intent intent = new Intent();
    intent.setClass(this, CreatePlaylist.class);
    startActivityForResult(intent, NEW_PLAYLIST); // NEW_PLAYLIST为"requestCode"

    在被调Activity中,处理完请求后,可以通过如下方法向调用Activity返回数据:

    setResult(RESULT_OK, (new Intent()).setData(uri));


    对于返回的数据,调用Activity将在其onActivityResult()方法中处理。处理过程如下:
      

      protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
            switch (requestCode) {
                case NEW_PLAYLIST:
                if (resultCode == RESULT_OK) {
                    Uri uri = intent.getData();
    
                }
            }
        }

    主要的Activity属性包括:taskAffinity 、launchMode 、allowTaskReparenting 、clearTaskOnLaunch 、alwaysRetainTaskState finishOnTaskLaunce等。

    另外,对于某些特殊的Activity,可能希望提供对标题栏的定制,在Android中,对标题栏支持如下特征:FEATURE_NO_TITLE、FEATURE_PROGRESS、FEATURE_LEFT_ICON、FEATURE_RIGHT_ICON、FEATURE_CUSTOM_TITLE等。

    为了隐藏标题栏,可以在Java代码中实现,也可以在AndroidManifest.xml文件中实现,由于框架上的因素,如果是通过Java代码实现,标题栏在Activity初始化时仍有短暂的可见性,在AndroidManifest.xml文件中实现,则不存在类似问题。

    其Java实现方式如下:

    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    //Java代码方式
    setContentView(R.layout.main); //必须放置在requestWindowFeature()后面

    }


    其AndroidManifest.xml文件实现方式如下:

       < activity android:name=".graphics.FrameBufferObjectActivity"
            android:label="Graphics/OpenGL ES/Frame Buffer Object"
            android:theme="@android:style/Theme.NoTitleBar"
            android:configChanges="orientation|keyboardHidden"> //禁止界面旋转
            < intent-filter>
              < action android:name="android.intent.action.MAIN" />
              < category android:name="android.intent.category.SAMPLE_CODE" />
            < /intent-filter>
        < /activity>


    如果希望自定义标题栏。方法为:

    public void onCreate(Bundle savedInstanceState) {
    
        super.onCreate(savedInstanceState);
    
        requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
    
        setContentView(R.layout.main);
    
        getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.custom_title);
    
        }


    如果希望同时隐藏标题栏和状态栏,方法如下:

     <activity 
      android:name="GL2JNIActivity" android:theme="@android:style/Theme.NoTitleBar.Fullscreen" //同时隐藏状态栏 android:launchMode="singleTask" android:configChanges="orientation|keyboardHidden"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> < /activity>

    Activity的响应时间
           当前Activity所在的线程为主线程,它的响应时间为5秒,如果在当前运行的Activity中进行耗时的操作且响应时间起过5秒,那么程序就会报ANR错误。所以,这也是不建议在Activity中写太多复杂代码的原因之一。
           当然,有些代码只能写在Activity中,不然就运行不了(它们不是生命周期方法),比如你想要获得android系统或者硬件一的些信息,就必须在Activity中写出来,如果单独写一个工具类获得不了。

    参考资料:

    百度百科。http://www.3g-edu.org/news/art086.htm

  • 相关阅读:
    nunit2.5.7 单元测试时提示:“当前不会命中断点 还没有为该文档加载任何符号”
    文件下载报错:引发类型为“System.OutOfMemoryException”的异常-.Net 内存溢出
    asp.net 访问页面访问统计实现 for iis7
    easyui tree 更改图标
    asp.net 访问页面访问统计实现
    记一次空格引起的查询问题
    SVN如何忽略dll文件和bin目录
    vmware 中安装Ghost XP 版本心得
    冒泡排序
    JS数组去重
  • 原文地址:https://www.cnblogs.com/ywtk/p/3951379.html
Copyright © 2011-2022 走看看