Android学习笔记(二)---Activity

一、Activity介绍

    在应用组件提供了一个屏幕,可以让用户做某些事情交互的(打电话,照相片),每一个Activity都是一个活动窗口。可以在Activity上画UI(图形页面设计:按钮,文本框,多选框)。

    一个应用程序由多个activities组成,每个应用程序都有一个主activity,比如登录或者展示界面。用户的一个窗口可以启动另一个窗口,当一个新的activity启动的时候,会把原先的activity压到栈(后进先出)里面。这个栈是系统内部维护的,不需要我们来创建。

    实例一:创建一个activity

       1,创建一个class,继承Activity

     2,必须实现的回调方法:oncreate()

            当系统调用这个activity时,会调用这个回调方法。在这个方法体的内部,你应该初始化该Activity的一些组件。最重要的是你要调用一个setContentView(),该方法用来加载布局的。


     另一个回调方法: onPause()

      当用户离开一个activity的时候,会调用这个方法。它通常会保存用户一些数据到本地,因为用户可能离开一个页面后,一去不复返了。

          3,当创建一个窗体后,必须要在清单文件中声明。


      package:是存放activity的包,我们每次在清单文件中注册activity时,andorid:name可以简写为:andorid:name=“.NextActivity”

     




二、Activity页面跳转 + 值传递

     页面跳转:由一个窗体跳转到另一个窗体中。

    值传递:当我们由一个窗体进入另一个窗体时,需要传递一些参数。

     实例需求:用户输入用户名xxx,点击登录,跳转到另一个页面,显示:欢迎您:xxx

运行结果:




程序清单:

/**
 * 登录页面:LoginActivity.java
 * @author 绝版-飞扬
 *
 */
public class LoginActivity extends Activity {
    private EditText editText;    //用户名
    private Button button;        //登录按钮
    public LoginActivity() {
        // TODO Auto-generated constructor stub
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.login);
        editText = (EditText)this.findViewById(R.id.editText1);        //获取页面元素
        button = (Button)this.findViewById(R.id.button1);            //获取页面元素
        //添加button的点击事件监听:跳转页面+传递参数
        button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View arg0) {
                  // TODO Auto-generated method stub
                //创建意图方式一:Intent(意图)传递参数(推荐使用)
                Intent intent = new Intent(LoginActivity.this,IndexActivity.class);
                //将传递的参数putExtra到意图中
                intent.putExtra("username", editText.getText().toString().trim());
                //开启另一个activity,并将intent传递过去
                startActivity(intent);
                /*创建意图方式二:
                  Intent intent = new Intent();
                  intent.setClass(LoginActivity.this,IndexActivity.class);
                 */
                /*创建意图方式三:
                 * com.example.hello.IndexActivity:意图过滤器的名字,在清单文件中声明
                 * Intent intent = new Intent("com.example.hello.IndexActivity");
                 */
            }
        });
    }
}
login.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="35dp"
        android:layout_marginTop="85dp"
        android:text="用户名:"
        android:textSize="30sp" />

    <EditText
        android:id="@+id/editText1"
        android:layout_width="110dp"
        android:layout_height="wrap_content"
        android:layout_alignTop="@+id/textView1"
        android:layout_toRightOf="@+id/textView1"
        android:ems="10" >
        <requestFocus />
    </EditText>
    <Button
        android:id="@+id/button1"
        android:layout_width="100dp"
        android:layout_height="wrap_content"
        android:layout_below="@+id/editText1"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="62dp"
        android:text="登录" />
</RelativeLayout>
/**
 * 主页面:IndexActivity.java
 * @author 绝版-飞扬
 */
public class IndexActivity extends Activity {
    private TextView textView;
    public IndexActivity() {
        // TODO Auto-generated constructor stub
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.index);
        // 获取页面上的文本标签
        textView = (TextView) this.findViewById(R.id.textView2);
        // 得到上一个activity传递过来的intent
        Intent intent = getIntent();
        textView.setText(intent.getStringExtra("username"));
    }
}
index.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="43dp"
        android:layout_marginTop="32dp"
        android:text="欢迎您:"
        android:textSize="30sp" />
    <TextView
        android:id="@+id/textView2"
        android:textSize="30sp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/textView1"
        android:layout_alignBottom="@+id/textView1"
        android:layout_marginLeft="22dp"
        android:layout_toRightOf="@+id/textView1"
        android:text="" />
</RelativeLayout>
清单文件:AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.hello"
    android:versionCode="1"
    android:versionName="1.0" >
<!-- 清单文件 -->
    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />
<!-- 应用:四大组件都会出现在这里 -->
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <!-- 在清单文件中注册activity -->
        <activity android:name=".IndexActivity">
            <intent-filter >
                <action android:name="com.example.hello.IndexActivity"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>            
        </activity>
        <activity android:name=".LoginActivity">
              <intent-filter>
                   <!-- 当前的窗体为主窗体 -->
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

三、Activity页面跳转 + 回传值

   回传值:新页面关闭后,将一些参数值传回给上一个页面中。

           我们之前启动一个新的activity时,用的是startActivity(intent),为了得到新activity传回的值,我们要使用startActivityForResult(intent,requestCode); 第一个参数是意图(传递参数的),第二个参数是请求码:即调用startActivityForResult() 传递过去的一个标识。

          我们还要在第一个页面中重写onActivityResult(int requestCode, int resultCode, Intent data)

          requestCode请求码,传递给第二个页面的标识。

          resultCode:结果码,用于标识返回数据来自哪个新Activity

          data:第二个页面返回个第一个页面的意图(携带着回传的数据)

举个列子:第一个页面中,有三个文本框,一个计算按钮,前两个是“加数”文本框,后一个是“和”文本框。

                  第二个页面中,有一个标签,一个文本框,一个确定按钮。

             用户填写第一个页面中的前两个文本框,点击计算,跳转到第二个页面中,将填写在第二个页面中的文本框的值传回给第一个页面中的“和”文本框。

运行结果:

  一,填写3,5,点击计算


  二,填写8,点击确定


   三,将8,传递给第一个页面中


清单文件:

MainAcitivity.java:

    public class MainActivity extends Activity {
    private Button button;
    private Button button2;
    private EditText editText1;
    private EditText editText2;
    private EditText editText3;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 测试一:测试页面跳转+值传递()Indent Bundle
        button = (Button) this.findViewById(R.id.button1);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                // 开启另一个窗体
                // 第一种方式
                Intent intent = new Intent(MainActivity.this,
                        NextActivity.class);
                intent.putExtra("username", "小飞扬");
                Bundle bundle = new Bundle();
                bundle.putString("code", "100000");
                intent.putExtra("bundle", bundle);
                startActivity(intent);
            }
        });
        // 测试二:测试页面跳转+值回传
        button2 = (Button) this.findViewById(R.id.button2);
        editText1 = (EditText) this.findViewById(R.id.editText1);
        editText2 = (EditText) this.findViewById(R.id.editText2);
        editText3 = (EditText) this.findViewById(R.id.editText3);
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                Intent intent = new Intent(MainActivity.this,
                        CaculateActivity.class);
                String a = editText1.getText().toString().trim();
                String b = editText2.getText().toString().trim();
                intent.putExtra("message", a + "+" + b + "=?");
                startActivityForResult(intent, 1000);
            }
        });
    }
    /**
     * 从子activity中,回传结果回来给他
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode==1000&&resultCode==1001){
            //从子窗口中获取结果
            String result_value=data.getStringExtra("result");
            editText3.setText(result_value);
        }
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
}


activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="37dp"
        android:text="启动下一个Activity活动窗体" />

    <EditText
        android:id="@+id/editText1"
        android:layout_width="70dp"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/button1"
        android:layout_marginTop="30dp"
        android:ems="10" >

        <requestFocus />
    </EditText>

    <EditText
        android:id="@+id/editText2"
        android:layout_width="70dp"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/editText1"
        android:layout_alignBottom="@+id/editText1"
        android:layout_centerHorizontal="true"
        android:ems="10" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/editText2"
        android:layout_toLeftOf="@+id/editText2"
        android:text=" + "
        android:textSize="30sp" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/editText2"
        android:layout_toRightOf="@+id/editText2"
        android:text=" = "
        android:textSize="30sp" />

    <EditText
        android:id="@+id/editText3"
        android:layout_width="60dp"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/textView2"
        android:layout_alignBottom="@+id/textView2"
        android:layout_alignParentRight="true"
        android:ems="10" />
    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/editText3"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="48dp"
        android:text="计算" />
</RelativeLayout>


CaculateActivity.java

package com.example.hello;

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;
import android.widget.EditText;
import android.widget.TextView;

public class CaculateActivity extends Activity {
    private Button button;
    private EditText editText;
    private TextView textView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.caculate);
        button = (Button) this.findViewById(R.id.button1);
        textView = (TextView) this.findViewById(R.id.textView1);
        Intent intent = getIntent();
        String message = intent.getStringExtra("message");
        textView.setText(message);
        editText = (EditText)this.findViewById(R.id.editText1);
        button.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                String value = editText.getText().toString().trim();
                Intent intent = new Intent();
                intent.putExtra("result", value);
                //设置回传的意图
                setResult(1001, intent);
                //结束activity的生命周期
                finish();
            }
        });
    }
}


caculate.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <Button
        android:id="@+id/button1"
        android:layout_width="100dp"
        android:layout_height="wrap_content"
        android:layout_below="@+id/textView1"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="90dp"
        android:text="确定" />

    <EditText
        android:id="@+id/editText1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/textView1"
        android:layout_alignBottom="@+id/textView1"
        android:layout_alignParentRight="true"
        android:ems="10" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="30sp"
        android:layout_alignParentTop="true"
        android:layout_marginRight="16dp"
        android:layout_marginTop="54dp"
        android:layout_toLeftOf="@+id/editText1"
        android:text="结果" />
</RelativeLayout>


activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.hello"
    android:versionCode="1"
    android:versionName="1.0" >
<!-- 清单文件 -->
    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />
<!-- 应用:四大组件都会出现在这里 -->
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <!-- 窗体 -->
        <activity
            android:name="com.example.hello.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>
        <activity android:name=".NextActivity">
            <intent-filter >
                <action android:name="com.example.hello.NextActivity" />
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>
        <activity android:name=".CaculateActivity"></activity>
    </application>

</manifest>

四、Activity生命周期介绍

     如果想关闭一个activity的话,调用finish()

     如果想关闭一个分离的activity,调用finishActivity()

     activity的生命周期能够被它关联的其他activities,它的任务,和回退栈(back stack)直接影响.

     activity存在三种状态:

     1、Resume:重新启动,表示activity重新回到屏幕的前面,或者得到用户的焦点。

     2、Paused:暂停,当另外一个activity得到用户的焦点时,当前的activity就会被暂停,其实依然是可现的,并且位于当前获取焦点的activity的下面,这个暂停的activity任然会保存在我们内存中,有可能被我们的system干掉(手机内存极低的情况下)。

     3、Stopped:停止,被另一个activity完全覆盖掉了,被停止的activity没有死,任然保存在内存中。不会再附加到我们的窗口中。可能会被系统干掉(系统需要内存的时候就会被干掉)。

     当activity处于暂停或停止的时候,系统能够干掉它通过调用finish()方法。


测试activity的执行过程:日志打印被调用的方法名(onCreate(),onStart(),onResume(),onPause(),onStop(),onRestart(),onDestory())

一、启动项目(TestActivity为程序入口)


      执行结果:

      ---onCreate()---方法

      ---onStart()---方法

      ---onResume()---方法

二:用DDMS 模拟打电话




     测试结果:

      ---onPause()---方法

      ---onStop()---方法

三:挂断电话

      测试结果:

      ---onRestart()---方法

      ---onStart()---方法

      ---onResume()---方法

四:退出应用程序:点击虚拟机的返回键

      ---onPause()方法---

      ---onStop()方法---

      ---onDestory()方法---

Activity的生命周期的状态图:

    

程序清单

TestActivity.java
public class TestActivity extends Activity {
    private final String TAG = "TestActivity";
    public TestActivity() {
        // TODO Auto-generated constructor stub
    }
    /**
     * 1、第一次被调用,仅仅调用一次
     * 2、初始化布局View或者绑定数据
     */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.i(TAG, "---onCreate 方法---");
    }
    /**
     *
     */
    @Override
    protected void onStart() {
        // TODO Auto-generated method stub
        super.onStart();
        Log.i(TAG, "---onStart 方法---");
        
    }
    
    @Override
    protected void onResume() {
        // TODO Auto-generated method stub
        super.onResume();
        Log.i(TAG, "---onResume 方法---");
    }
    @Override
    protected void onPause() {
        // TODO Auto-generated method stub
        super.onPause();
        Log.i(TAG, "---onPause 方法---");
    }
    @Override
    protected void onRestart() {
        // TODO Auto-generated method stub
        super.onRestart();
        Log.i(TAG, "---onRestart 方法---");
    }
    @Override
    protected void onStop() {
        // TODO Auto-generated method stub
        super.onStop();
        Log.i(TAG, "---onStop 方法---");
    }
    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        Log.i(TAG, "---onDestroy 方法---");
    }
}

五、Activity现场保存状态

      当系统破坏了我们的activity后,activity被销毁了。当我们重新创建这个activity的时候,希望他回到某种状态下,那么我们需要把这个状态重新创建。通过调用onSaveInstanceState()去保存你的activity的状态。(保存持久化数据有两种方式:数据库,XML文件),并在onCreate(Bundle )方法中读取。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值