zoukankan      html  css  js  c++  java
  • android基本程序单元Activity

     一、Activity 简介

    在android开发中Activity非常重要,在一个应用中,每一个显示的屏幕都是一个Activity.所以学习android,必须要对Activity有一定的了解.
          activity类处于android.app包中,继承体系如下:
          1.java.lang.Object
          2.android.content.Context
          3.android.app.ApplicationContext
          4.android.app.Activity

          activity是单独的,用于处理用户操作。几乎所有的activity都要和用户打交道,所以activity类创建了一个窗口,开发人员可以通过setContentView(View)接口把UI放到activity创建的窗口上,当activity指向全屏窗口时,也可以用其他方式实现:作为漂浮窗口(通过windowIsFloating的主题集合),或者嵌入到其他的activity(使用ActivityGroup)。大部分的Activity子类都需要实现以下两个接口:
          onCreate(Bundle)接口是初始化activity的地方. 在这儿通常可以调用setContentView(int)设置在资源文件中定义的UI, 使用findViewById(int) 可以获得UI中定义的窗口.
    onPause()接口是使用者准备离开activity的地方,在这儿,任何的修改都应该被提交(通常用于ContentProvider保存数据).
          为了能够使用Context.startActivity(),所有的activity类都必须在AndroidManifest.xml文件中定义有相关的“activity”项。

          activity类是Android 应用生命周期的重要部分。

    简单的例子:

    /Chapter05_Activity_Creation/src/com/amaker/test/MainActivity.java

    代码
    package com.amaker.test;

    import android.app.Activity;
    import android.os.Bundle;
    import android.widget.Button;
    import android.widget.TextView;

    // 继承Activity
    public class MainActivity extends Activity {
    // 声明要使用的组件
    private TextView myTextView;
    private Button myButton;
    // 覆盖onCreate方法
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // 设置当前视图
    setContentView(R.layout.main);
    // 通过findViewById() 方法实例化组件
    myTextView = (TextView) findViewById(R.id.TextView01);
    myButton
    = (Button) findViewById(R.id.Button01);
    }
    }

    布局文件

    /Chapter05_Activity_Creation/res/layout/main.xml

    代码
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation
    ="vertical"
    android:layout_width
    ="fill_parent"
    android:layout_height
    ="fill_parent"
    >

    <TextView android:id="@+id/TextView01"
    android:layout_width
    ="wrap_content"
    android:layout_height
    ="wrap_content"
    android:text
    ="简单的Activity"></TextView>

    <Button android:text="Click Me!"
    android:id
    ="@+id/Button01"
    android:layout_width
    ="wrap_content"
    android:layout_height
    ="wrap_content"></Button>

    </LinearLayout>

    清单文件

    /Chapter05_Activity_Creation/AndroidManifest.xml

    代码
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package
    ="com.amaker.test"
    android:versionCode
    ="1"
    android:versionName
    ="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
    <activity android:name=".MainActivity"
    android:label
    ="@string/app_name">
    <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    </activity>
    </application>
    <uses-sdk android:minSdkVersion="3" />
    </manifest>

    二、启动一个Activity

    一个activity可以启动另外一个,甚至包括与它不处于同一应用程序之中的。举个例子说,假设你想让用户看到某个地方的街道地图。而已经存在一个具有此功能的activity了,那么你的activity所需要做的工作就是把请求信息放到一个Intent对象里面,并把它传递给startActivity()。于是地图浏览器就会显示那个地图。而当用户按下BACK键的时候,你的activity又会再一次的显示在屏幕上。

    Android将这两个activity放在同一个任务中来维持一个完整的用户体验。简单的说,任务就是用户所体验到的应用程序。它是安排在一个堆栈中的一组相关的activity。堆栈中的根activity就是启动了这整个任务的那个──一般情况下,它就是用户在应用程序加载器中所选择的。而堆栈最上方的activity则是当前运行的──用户直接对其进行操作的。当一个activity启动另外一个的时候,新的activity就被压入堆栈,并成为当前运行的activity。而前一个activity仍保持在堆栈之中。当用户按下BACK键的时候,当前activity出栈,而前一个恢复为当前运行的activity

    activity相当于web开发中的页面,从一个页面跳转到另外的一个页面。

      

    小例子:

    /Chapter05_Activity_StartActivity/src/com/amaker/test/FirstActivity.java

     
     

    代码
    package com.amaker.test;

    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;

    public class FirstActivity extends Activity {
    /** Called when the activity is first created. */
    private Button b1;
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.first);
    b1
    = (Button) findViewById(R.id.Button01);
    // 响应按键事件
    b1.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
    // 显示方式声明Intent,直接启动SecondActivity
    Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
    startActivity(intent);
    }
    });
    }
    }

    /Chapter05_Activity_StartActivity/src/com/amaker/test/SecondActivity.java

    代码
    package com.amaker.test;

    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;

    public class SecondActivity extends Activity {
    /** Called when the activity is first created. */
    private Button b2;
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.second);

    b2
    = (Button) findViewById(R.id.Button02);
    // 响应按键事件
    b2.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
    // 显示方式声明Intent,直接启动SecondActivity
    Intent intent = new Intent(SecondActivity.this,FirstActivity.class);
    startActivity(intent);
    }
    });
    }
    }

    布局文件

    /Chapter05_Activity_StartActivity/res/layout/first.xml

    代码
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation
    ="vertical"
    android:layout_width
    ="fill_parent"
    android:layout_height
    ="fill_parent"
    >

    <Button android:id="@+id/Button01"
    android:layout_width
    ="wrap_content"
    android:layout_height
    ="wrap_content"
    android:text
    ="Second Activity"></Button>

    </LinearLayout>

    /Chapter05_Activity_StartActivity/res/layout/second.xml

    代码
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation
    ="vertical" android:layout_width="fill_parent"
    android:layout_height
    ="fill_parent">

    <Button android:id="@+id/Button02"
    android:layout_width
    ="wrap_content"
    android:layout_height
    ="wrap_content"
    android:text
    ="返回"></Button>
    </LinearLayout>

    三、Activity之间传递数据

    如何在Activity中调用另一个Activity,但若需要在调用另外一个Activity的同时传递数据,那么就需要 利用android.os.Bundle对象封装数据的能力,将欲传递的数据或参数,通过Bundle来传递不同Intent之间的数据。 相当于web开发中用session等等进行参数传递一样。

    利用Intent传递数据

    传递数据的Activity中:

       Intent intent = new Intent();
       intent.putExtra("name","Jon");//在Intent中加入键值对数据。键:name,值:Jon
       intent.setClass(Activity01.this,Activity02.class);
       Activity01.this.startActivity(intent);

    在取出数据的Activity中:

      Intent intent = getIntent();//获得传过来的Intent。
      String value = intent.getStringExtra("name");//根据键name取出值。

    利用Bundle传递数据

    传递数据的Activity:

      Intent intent = new Intent();
      Bundle myBundle = new Bundle();
      myBundle.putString("Key_Name","Tom");
      intent.putExtras(myBundle);
      intent.setClass(Activity01.this,Activity02.class);
      Activity01.this.startActivity(intent);

    取出数据的Activity:

       Bundle getBundle = getIntent().getExtras();
       String value = getBundle.getString("Key_Name");

    利用startActivityForResult传递数据

    startActivityForResult可以把数据传过去,还可以把那边的数据传过来。

    传递数据的Activity中:

       Intent intent      = new Intent();
       Bundle bundle  = new Bundle();
       bundle.putString("data", "somedata");//把数据传过去
       intent.putExtras(bundle);
       intent.setClass(Activity01.this, Activity02.class);
       startActivityForResult(intent, 10);//10是一个代码

    重载onActivityResult方法,用来接收传过来的数据:

     protected void onActivityResult(int requestCode, int resultCode,Intent intent) {
       switch (resultCode) {
       case RESULT_OK:
          Bundle b = intent.getExtras();
          String str = b.getString("Result");
          setTitle("Return data:" + str);
           break;
      default:
            break;
      }
      }

    接收数据的Activity:

      Intent   intent        = getIntent();
      Bundle getBundle = getIntent().getExtras();
      String   data          = getBundle.getString("data");//读取传过来的数据
      et.setText(data);

      EditText edittext = (EditText) findViewById(R.id.text);
      Intent intent = new Intent();//实例化一个Intent用来传过去,可以在Intent里存放数据。
      Bundle bundle = new Bundle();
      bundle.putString("Result",edittext.getText().toString());
      intent.putExtras(bundle);
      Activity02.this.setResult(RESULT_OK,intent);//把Intent(数据)传过去,RESULT_OK是请求码。
      finish();//结束当前的Activity。

    四、启动一个Activity并返回结果

    使用startActivityForResult()方法

    实例:

    /Chapter05_Activity_StartActivityForResult/src/com/amaker/test/MainActivity.java

    代码
    package com.amaker.test;

    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.EditText;

    public class MainActivity extends Activity {

    private EditText username,password;
    private Button b1;

    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    b1
    = (Button)findViewById(R.id.Button01);

    b1.setOnClickListener(
    new OnClickListener() {
    @Override
    public void onClick(View v) {
    username
    = (EditText)findViewById(R.id.username);
    password
    = (EditText)findViewById(R.id.password);

    String str_username
    = username.getText().toString();
    String str_password
    = password.getText().toString();

    Bundle b
    = new Bundle();
    b.putString(
    "username", str_username);
    b.putString(
    "password", str_password);

    Intent intent
    = new Intent(MainActivity.this,NextActivity.class);
    intent.putExtras(b);

    startActivityForResult(intent,
    1);
    }
    });
    }

    @Override
    protected void onActivityResult(
    int requestCode, int resultCode, Intent data) {

    Log.i(
    "requestcode", requestCode+"-----------");

    Log.i(
    "resultCode", resultCode+"-----------");

    Bundle b
    = data.getExtras();

    String str_username
    = b.getString("username");
    String str_password
    = b.getString("password");

    System.out.println(str_username);

    Log.i(
    "abc", data.getStringExtra("abc"));

    username.setText(str_username);
    password.setText(str_password);
    }

    }

    /Chapter05_Activity_StartActivityForResult/src/com/amaker/test/NextActivity.java

    代码
    package com.amaker.test;

    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;

    public class NextActivity extends Activity {
    private Button b2;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.next);
    b2
    = (Button)findViewById(R.id.Button02);
    b2.setOnClickListener(
    new OnClickListener() {
    @Override
    public void onClick(View v) {
    Intent intent
    = getIntent();
    intent.putExtra(
    "abc", "test");
    NextActivity.
    this.setResult(5, intent);
    NextActivity.
    this.finish();
    }
    });

    }
    }

    /Chapter05_Activity_StartActivityForResult/res/layout/main.xml

    代码
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation
    ="vertical"
    android:layout_width
    ="fill_parent"
    android:layout_height
    ="fill_parent"
    >

    <TextView
    android:text="用户名称:"
    android:id
    ="@+id/TextView01"
    android:layout_width
    ="wrap_content"
    android:layout_height
    ="wrap_content"></TextView>

    <EditText
    android:text=""
    android:id
    ="@+id/username"
    android:layout_width
    ="fill_parent"
    android:layout_height
    ="wrap_content"></EditText>

    <TextView
    android:text="用户密码:"
    android:id
    ="@+id/TextView02"
    android:layout_width
    ="wrap_content"
    android:layout_height
    ="wrap_content"

    ></TextView>

    <EditText
    android:text=""
    android:id
    ="@+id/password"
    android:layout_width
    ="fill_parent"
    android:layout_height
    ="wrap_content"
    android:password
    ="true"
    ></EditText>

    <Button
    android:text="下一步"
    android:id
    ="@+id/Button01"
    android:layout_width
    ="wrap_content"
    android:layout_height
    ="wrap_content"></Button>

    </LinearLayout>

    /Chapter05_Activity_StartActivityForResult/res/layout/next.xml

    代码
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation
    ="vertical"
    android:layout_width
    ="fill_parent"
    android:layout_height
    ="fill_parent"
    >

    <TextView
    android:text="Email:"
    android:id
    ="@+id/email"
    android:layout_width
    ="wrap_content"
    android:layout_height
    ="wrap_content"></TextView>

    <EditText
    android:text=""
    android:id
    ="@+id/EditText01"
    android:layout_width
    ="fill_parent"
    android:layout_height
    ="wrap_content"></EditText>

    <TextView
    android:text="Mobile:"
    android:id
    ="@+id/mobile"
    android:layout_width
    ="wrap_content"
    android:layout_height
    ="wrap_content"></TextView>

    <EditText
    android:text=""
    android:id
    ="@+id/EditText02"
    android:layout_width
    ="fill_parent"
    android:layout_height
    ="wrap_content"></EditText>

    <Button
    android:text="上一步"
    android:id
    ="@+id/Button02"
    android:layout_width
    ="wrap_content"
    android:layout_height
    ="wrap_content"></Button>

    </LinearLayout>


     

    五、Activity的生命周期

     和其他手机平台的应用程序一样,Android的应用程序的生命周期是被统一掌控 的,也
       就是说我们写的应用程序命运掌握在别人(系统)的手里,我们不能改变它,只能学习并
       适应它。
      
      
    简单地说一下为什么是这样:我们手机在运行一个应用程序的时候,有可能打进来电话
       发进来短信,或者没有电了,这时候程序都会被中断,优先去服务电话的基本功能,另
       外系统也不允许你占用太多资源,至少要保证电话功能吧,所以资源不足的时候也就有可 

       能被干掉。

       言归正传,Activity的基本生命周期如下代码所示:

     
    1. public class MyActivity extends Activity {   
    2.     protected void onCreate(Bundle savedInstanceState);    
    3.   
    4.     protected void onStart();    
    5.   
    6.     protected void onResume();   
    7.   
    8.     protected void onPause();   
    9.   
    10.     protected void onStop();   
    11.   
    12.     protected void onDestroy();   
    13.   }   
     public class MyActivity extends Activity {
         protected void onCreate(Bundle savedInstanceState);
    
         protected void onStart();
    
         protected void onResume();
    
         protected void onPause();
    
         protected void onStop();
    
         protected void onDestroy();
       } 

       你自己写的Activity会按需要 重载这些方法,onCreate是免不了的,在一个Activity正常启动的过程中,他们被调用的顺序是 onCreate -> onStart -> onResume, 在Activity被干掉的时候顺序是onPause -> onStop -> onDestroy ,这样就是一个完整的生命周期,但是有人问了 ,程序正运行着呢来电话了,这个程序咋办?中止了呗,如果中止的时候新出的一个Activity是全屏的那么:onPause->onStop ,恢复的时候onStart->onResume ,如果打断  这个应用程序的是一个Theme为Translucent 或者Dialog 的Activity那么只是onPause ,恢复 的时候onResume

       详细介绍一下这几个方法中系统在做什么以及我们应该做什么:

       onCreate:    在这里创建界面,做一些数据的初始化工作

       onStart:   到这一步变成用户可见不可交互

       onResume:   变成和用户可交互 的,(在activity栈系统通过栈的方式管理这些个      
                          Activity的最上面,运行完弹出栈,则回到上一个Activity)

       onPause:     到这一步是可见但不可交互 的,系统会停止动画等消耗CPU 的事情
                        从上文的描述已经知道,应该在这里保存你的一些数据,因为这个时候
                        你的程序的优先级降低,有可能被系统收回。在这里保存的数据,应该在
     

                        onResume里读出来,注意:这个方法里做的事情时间要短,因为下一
                        个activity不会等到这个方法完成才启动

       onstop:      变得不可见 ,被下一个activity覆盖了

       onDestroy:  这是activity被干掉前最后一个被调用方法了,可能是外面类调用finish方
                         法或者是系统为了节省空间将它暂时性的干掉,可以用isFinishing()来判
                         断它,如果你有一个Progress Dialog在线程中转动,请在onDestroy里
                         把他cancel掉,不然等线程结束的时候,调用Dialog的cancel方法会抛
                        
    的。                    
                 
    onPause,onstop, onDestroy,三种状态下 activity都有可能被系统干掉
    为了保证程序的正确性,你要在onPause()里写上持久层操作的代码,将用户编辑的内容都保存到存储介质上(一般都是数据库)。实际工作中因为生命周期的变化而带来的问题也很多,比如你的应用程序起了新的线程在跑,这时候中断了,你还要去维护那个线程,是暂停还是杀掉还是数据回滚,是吧?因为Activity可能被杀掉,所以线程中使用的变量和一些界面元素就千万要注意了,一般我都是采用Android的消息机制[Handler, Message]来处理多线程和界面交互的问题。
     

    /Chapter05_Activity_LifeCycle/src/com/amaker/test/MainActivity.java

    代码
    package com.amaker.test;

    import android.app.Activity;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;

    public class MainActivity extends Activity {

    private Button b1;
    private static final String TAG="lifecycle";
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    Log.i(TAG,
    "onCreate------------------------------>");
    b1
    = (Button)findViewById(R.id.Button01);
    b1.setOnClickListener(
    new OnClickListener() {
    @Override
    public void onClick(View v) {
    MainActivity.
    this.finish();
    }
    });
    }

    @Override
    protected void onStart() {
    super.onStart();
    Log.i(TAG,
    "onStart------------------------------>");
    }

    @Override
    protected void onRestart() {
    super.onRestart();
    Log.i(TAG,
    "onRestart------------------------------>");
    }

    @Override
    protected void onResume() {
    super.onResume();
    Log.i(TAG,
    "onResume------------------------------>");
    }

    @Override
    protected void onPause() {
    super.onPause();
    Log.i(TAG,
    "onPause------------------------------>");
    }

    @Override
    protected void onStop() {
    super.onStop();
    Log.i(TAG,
    "onStop------------------------------>");
    }

    @Override
    protected void onDestroy() {
    super.onDestroy();
    Log.i(TAG,
    "onDestroy------------------------------>");
    }

    }

    /Chapter05_Activity_LifeCycle/res/layout/main.xml

    代码
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation
    ="vertical"
    android:layout_width
    ="fill_parent"
    android:layout_height
    ="fill_parent"
    >

    <TextView
    android:id="@+id/TextView01"
    android:layout_width
    ="wrap_content"
    android:layout_height
    ="wrap_content"
    android:text
    ="測試Activity的生命週期"></TextView>

    <Button android:id="@+id/Button01"
    android:layout_width
    ="wrap_content"
    android:layout_height
    ="wrap_content"
    android:text
    ="結束Activity"></Button>

    </LinearLayout>

  • 相关阅读:
    jQuery EasyUI API 中文文档 数字框(NumberBox)
    jQuery EasyUI API 中文文档 数值微调器(NumberSpinner)
    jQuery EasyUI API 中文文档 日期时间框(DateTimeBox)
    jQuery EasyUI API 中文文档 微调器(Spinner)
    jQuery EasyUI API 中文文档 树表格(TreeGrid)
    jQuery EasyUI API 中文文档 树(Tree)
    jQuery EasyUI API 中文文档 属性表格(PropertyGrid)
    EntityFramework 数据操作
    jQuery EasyUI API 中文文档 对话框(Dialog)
    jQuery EasyUI API 中文文档 组合表格(ComboGrid)
  • 原文地址:https://www.cnblogs.com/linzheng/p/1939684.html
Copyright © 2011-2022 走看看