您的位置:华清远见教育科技集团 >> Android资料 >> Android应用组件Activity  
 
Android应用组件Activity
分享到:

对Android应用程序而言,应用组件主要由Activity、Service、Broadcast Receivers、Intent、Content Providers、AndroidManifest等构成。Activity是与用户直接交互UI组件,将在本文详细给大家介绍一下!

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

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

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

当Activity不再可见时,该Activity处于"stopped"状态,处于"stopped"状态的Activity会继续维护其所有的状态和成员信息,但当系统内存不足需要清理释放时,处于"stopped"状态的Activity便成为被杀死的考虑对象。

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

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>

 更多相关文章

·Android RPC管道文件系统
·Android RPC远程调用
·SMSM状态通信处理过程
·SMD 数据通信的实现
·Android SMD数据通信概述