活动的使用how to build and use an activity

来源:互联网 发布:一年php工资7千 编辑:程序博客网 时间:2024/06/05 06:27

这篇文章,主要活动的应用的概述,详细内容将在之后补充。


活动的使用(how tobuild and use an activity)

1.    创建一个活动
首先,我们要创建一个Activity的子类或继承一个子类作为我们的活动。在这个新的活动中,我们必须要实现几个回调函数(将在它的生命周期中被系统调用,比如created,stopped.resumed,destoyed)

2.    其中,最重要的几个回调分别是:
onCreate():你必须实现这个函数,因为系统会在构造活动的时候调用这个函数。而且在你实现的时候,你需要初始化活动中的组件。最关键的是,你必须用setContentView()这个方法去为你的活动用户界面定义布局。

onPause():当用户离开活动时,这个方法会被第一个调用。(可能这个活动还没被摧毁)。一般,在这方法中,我们应该保存一些当前用户的信息。(应为我们为您可能不再回到这个活动了。)

3.    除此之外,还有几个生命周期的回调函数。所有这些方法将在之后再讨论。

实现用户界面

活动中的用户界面是有许多个对象组成(这些对象继承自View类)。每个对象都以矩形的形状在活动的窗口上占据一定空间,并与用户交互。比如说,按钮,它在用户点击时,可以触发一个动作。

 

Android提供许多已经做好的视图(views)来帮助你去设计和组织你的布局。“Widgets”就是一组提供 visual (and interactive) 的视图,比如button, text field,checkbox, image。

Layout”是继承自ViewGroup的视图,可以为子视图提供唯一的布局模块,比如有linear layout,grid layout,relative layout.你也可以自己继承View和ViewGroup类来构建自己的组件和布局,然后将它们应用到自己的活动布局中。

 

目前,我们通过定义XML layout file文件来定义布局,然后将其保存在应用资源中(application resources)。通过这种方式,我们可以将界面布局的设计和源代码分隔开来。

然后,我们在XML中设计好自己满意的布局,再在onCreate()方法中用setContentView()加载这个XML布局(通过一个资源序号resource ID for the layout)。同时,你也可以自己定义视图并使用。

 

关于如何创建一个用户界面的详细信息,看《用户界面》

 

在清单(manifest)中定义活动

我们必须在清单中定义我们的活动,为了它能被系统访问到。

 

1.  首先,打开清单文件(manifest file)

然后,在里面添加<activity>作为子<application>的子节点。如:<manifest ... >  <application ... >      <activity android:name=".ExampleActivity" />      ...  </application ... >  ...</manifest >

2.  在这个节点中,我们还可以定义许多属性,比如活动的标签,图标,主题类型。android:name这个是唯一必填的属性,它清楚的表明的这个活动的类名。一旦,我们发布我们的应用,就不应该修改这个属性。因为如果你这么做了,你就可能打破一些功能,就可能出现应用短路。

 

<acitivity>的引用中继续了解它的详细信息。

 

 

使用intent-filter

在<activity>节点中,我们还可以指明intent-filters来定义其他应用组件如何启动它。

 

当我们通过Android SDK工具创建一个应用的时候,根活动就会自动的被创建,并且在清单中自动生成一个<activity>节点,包括<intent-filter>

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

这些信息到底是什么意思呢?

首先,<action>节点指明这是个活动是应用的主(main)入口。android.intent.action.MAIN

<category>节点指明这个活动应该被列入系统应用启动(为了允许用户去启动这个活动)。

 

如果我们只是在应用中自我调用,而不允许其他应用启动这些活动,那么我们就不需要加<intentfilter>.只需要一个主活动有一个main action和 launcher gategory,就像上面的例子中一样。

 

如果我们的活动想回应其他应用的请求,那么我们就必须加intent-filter了。在<action>和<category>中我们要指明它要回应哪种请求。

 

对于更详细的内容,可以查看 《Intents Intent Filters

 

 

启动一个活动

我们可以在一个活动中启动另外一个活动。通过调用startActivity(),传入一个Intent参数,指明你要启动哪一个活动。在Intent中,我们可以指明我要启动具体哪一个活动,或者哪一类活动。(系统会为你选择合适的活动,甚至是其他的应用)Intent还可以携带一些数据,传递给启动的活动。

 

在我们自己的应用中,我去启动一个已知的活动时,可以这样:

Intent intent = new Intent(this, SignInActivity.class);startActivity(intent);

然而,如果我们要去启动一个来自其他应用的活动时,(比如发邮件,发短信等等)我们可以这样:

Intent intent = new Intent(Intent.ACTION_SEND);intent.putExtra(Intent.EXTRA_EMAIL, recipientArray);startActivity(intent);

首先要构造一个Intent,来描述要执行的动作,然后系统将启动合适的活动。如果有多个活动匹配这个intent,那么用户就可以自己选择。

 

启动一个活动并返回

有时候,我们想在A活动接收B活动的结果(A活动启动了B活动,B结束后,A想获得一个结果)。在这种情况,就可以调用startActivityForResult()这个方法(代替startActivity()),并实现onActivityResult()回调。当前一个活动结束后,它将返回一个intent结果到onActivityResult()方法。

 

举个例子,可能你想要用户选择一个联系人,因此你的活动要能够处理关于联系人的信息。

以下就是一个例子:

 

private void pickContact() {
    // Create an intent to "pick" a contact, as defined by thecontent provider URI
    Intent intent = new Intent(Intent.ACTION_PICK,Contacts.CONTENT_URI);
    startActivityForResult(intent,PICK_CONTACT_REQUEST);
}

@Override
protected void onActivityResult(int requestCode,int resultCode,Intent data){
    // If the request went well (OK) and the request was PICK_CONTACT_REQUEST
    if (resultCode== Activity.RESULT_OK&& requestCode == PICK_CONTACT_REQUEST){
        // Perform a query to the contact's contentprovider for the contact's name
        Cursor cursor =getContentResolver().query(data.getData(),
        new String[]{Contacts.DISPLAY_NAME},null, null, null);
        if (cursor.moveToFirst()){ // True if thecursor is not empty
            int columnIndex = cursor.getColumnIndex(Contacts.DISPLAY_NAME);
            String name = cursor.getString(columnIndex);
            // Do somethingwith the selected contact's name...
        }
    }
}

 

以上内容为我对官档的个人理解,如有错误欢迎大家在评论区指出!

阅读全文
0 0
原创粉丝点击