Android学习笔记--Activity概述


Android工程组件:Activity,Service,BroadcastReceiver 和 Content Provider。


Activity介绍


       Activity是Android应用程序与用户交互的窗口,几乎每一个Android应用程序都离不开Activity。Activity的作用就是提供界面。像应用中的登陆界面,注册界面,评论界面和产品列表界面,每个页面都可以通过一个独立的类来表示。这个独立的类继承于Activity这个基类,上面可以显示由几个View组件组成的用户接口,并且可以对事件进行相应的处理,一套View通过Activity.setContent()填充到Activity窗体中。每当应用中添加一个Activity,需要在AndroidManifest.xml中添加一个对应的<activity></activity>标签。各activities之间关系很松散,它们之间没有直接的关联。必须有一个activity被指定为主activity,它是程序启动时首先显示的界面。每个activity都可以随意启动其它的activity。每当一个activity被启动,则前一个activity就被停止。

       当一个activity因为新的activity启动而被停止时,它会收到状态变化的通知,这样的变化有多个,每个都会引起系统调用一个相应的回调方法以通知activity,这些回调方法被统称为“生命周期回调方法”。这些回调方法分别在Activity被创建、停止、恢复、销毁时被调用。

     

在名单文件中声明activity

为了能让系统操作你的Activity,你必须在工程的名单文件中声明它。例如:

<manifest ... >

  <application ... >

      <activityAndroid:name=".ExampleActivity" />

      ...

  </application ... >

  ...

</manifest >

    当然有很多属性可以设置给Activity,比如label,icon或主题等等。详情请查看<activity>元素的说明。

   注意看<activity Android:name=".ExampleActivity"/&amp;gt;,看到activity name的值中,最前面有个”.”,如果你把它忘了,程序运行就会出错,而你很难找出错误的原因。其次,不论你是Activity是只内部使用还是外部使用,都要去名单文件中注册,否则依然会出现莫名其妙的错误,只是在内部使用时,不需要为acitivity增加意图过滤器。


使用intent过虑器

    可以为一个<activity>元素指定多个过虑器。使用<intent-filter>元素指定。intent过虑器的目的是告诉其它组件如何启动这个Activity。当你使用ADT创建一个新工程时,根Activity被自动创建,它已具有两个意图过虑器,一个意图过虑器声明这个Activity负责响应“main”action;另一个过虑器声明这个Activity须被置于”launcher”类别之下。一般是这个样子:

<activityAndroid:name=".ExampleActivity"android:icon="@drawable/app_icon">

    <intent-filter>

        <actionAndroid:name="android.intent.action.MAIN" />

        <category Android:name="android.intent.category.LAUNCHER"/>

    </intent-filter>

</activity>

<intent-filter>中就是过滤器们。<action>说明此Acitivity是程序的”main”入口,<category>指出这个Acitivity需要在系统的应用列表中列出。

    如果你写的程序中的Activity不需被其它程序调用,那么不需为这个Activity增加任何意图过滤器。但程序中必须有一个Activity被指定为”main” Action和”launcher” category。你自己程中的 Activity可以用更直接的方式调用。

    然而,如果你想让你的Activity被其它程序调用,那么你需要为它增加意图过滤器。这些过意图滤器包括<action>,<category>以及<data>。这些元素指明了你的activity响应何种类型的intent。

启动一个Activity

    你可以用startActivity()启动一个activity,它有一个参数是intent,你需要在这个intent中指明要调用的activity。Intent中你可以明确地指定要启动的activity,或只指定activity的类型,此时系统会为你挑选一个合适的activity,这个activity可能位于其它程序中,也可能位于你自己的程序中。Intent中可以带一坨被新activity使用的数据(相当于参数传递)。

    在你的程序内部,如果需要启动一个内部的activity,你需在intent中明确指定新activity的类名。例如:

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

    startActivity(intent);

    SignInActivity是要启动的activity类。

    然而,你的程序可能想执行自身没有提供的功能,比如发出邮件,发送短信息等。此时,需要启动其它程序提供的activity。此时就体现出intent的真正价值来了:它可以很容易地启动其它程序提供的activity,你只需要在intent中指定你要执行的动作,然后调用 startActivity() ,系统就会跟据你的需要,为你选择一个合适的activity,并启动它。如果同时有多个activity可以执行这动作,那么用户可以选择哪个被使用。例如,你想让用户发送一个电子邮件,你可以创建以下的Intent:

Intent intent = new Intent(Intent.ACTION_SEND);

intent.putExtra(Intent.EXTRA_EMAIL, recipientArray);

startActivity(intent);

    putExtra()是设置扩充数据的,.EXTRA_EMAIL表明第二个参数recipientArray里面放的是多个email地址。当发邮件的程序被启动并接收到这个intent时,它就把邮件地址们放到它的Acitivity界面的“to”控件中。当用户发送完毕返回时,你的activity就恢复运行(resume)。可以看到,启动另外一个程序是多么的容易。

启动一个acitvity并得到结果

    有时,你可能想从你启动的activity获得其执行后返回的结果。此时你可以用方法startActivityForResult()来启动新acitivity(不再是startActivity了)。然后,你的程序还需要定义回调方法onActivityResult()。当新activity运行结束时,它把一个intent返回给你的程序,这个intent是在onActivityResult()中被接收。

    例如:你想让用户打开通讯录,从中选择一个联系人,然后你取得用户所选的联系人,对之进行处理。以下是示例代码:

private void pickContact() {

    //Create anintent to "pick" a contact, as defined by the content provider URI

    Intent intent =new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI);

   startActivityForResult(intent, PICK_CONTACT_REQUEST);

}

 

@Override

protected void onActivityResult(int requestCode, intresultCode, Intent data) {

    // If the requestwent well (OK) and the request was PICK_CONTACT_REQUEST

    if (resultCode== Activity.RESULT_OK && requestCode == PICK_CONTACT_REQUEST) {

        // Perform aquery to the contact's content provider for the contact's name

        Cursorcursor = getContentResolver().query(data.getData(),new String[]{Contacts.DISPLAY_NAME}, null, null, null);

        if(cursor.moveToFirst()) { // True if the cursor is not empty

            intcolumnIndex = cursor.getColumnIndex(Contacts.DISPLAY_NAME);

            String name =cursor.getString(columnIndex);

            // Dosomething with the selected contact's name...

        }

    }

}

    此例子展示了在onActivityResult()中的基本逻辑流程。首选检查所启动的Activity是否正确运行,resultCode为Activity.RESULT_OK表示正常,其次,查看requestCode是否与当时请求的一致,即是否为PICK_CONTACT_REQUEST。都通过后,开始操作返回的数据,也就是data参数。

    Data是这样处理的,用ContentResolver向内容提供者发出请求,这个请求会返回一个游标,通过这个游标读取数据,这很像数据库表的操作。要理解此处,请查阅Content Providers一节。  

关闭Activity

    Activity可以内部调用finish()方法关闭它自己,也可以调用finishActivity()方法关闭其它的activity。

  注意:大多数情况下,你不应主动结束一个activity。系统掌管着activity的生命,所以你也不必结束自己的activity。使用上述方法会破坏用户体验。除非你觉得很必要时,否则就不要做!


声明:本文后面一大截出自未知高手,引用作为参考,勿喷!





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值