Android笔记:Activity

1.Android可视化界面结构:
    一个Android应用的可视化界面最底层是Activity,在他之上是一个Window对象,在window之上通常是布局容器,再上面才是用户直接交互的组件(按钮,文本框)
交互组件(UI控件)-->布局容器(layout)--->Window对象--->Activity
2.Activity生命周期
    Activity是以栈的形式管理的,当前活动的Activity位于栈顶,其他的Activity则处于非活动状态.
       Activiy生命周期中的4个重要状态
            活动 处于栈顶位置,用户进行交互
            暂停 可见但失去焦点,用户不能进行交互
            停止 不可见
            销毁 被系统和进程Kill掉
         细分Activity生命周期为3个关键的嵌套子周期:
            首尾:第一次调用onCreate()到最后调用onDestroy().对应的做全局的初始化,以及最后的释放.
            可见但不一定交互:从调用onStart()到对应调用一次onStop(),用户可以在屏幕上看到Activity但不一定能与之交互,可以在这期间维护向用户显示的资源.
                                    onReSart()被停止的Activity重新被启动.
           活动周期:从调用onResume()到对应的onPause(),活动的activtiy与用户进行交互
3.控制Activity的生命周期
    用户很多常见的操作都会引起Activity的暂停,停止,结束甚至启动多个程序版本,对于程序而言,这些都应该是要尽量避免的.
    3.1强制执行单任务模式:
        比如当程序执行跳转操作之后再次的启动,可能会在手机上产生多个Activity实例(系统自动Kill多余的实例或者引发异常).
        那么我们为了保证任何时候,每个Activity都只有一个正在运行的实例,只需要在AndroidManifest.xml的Activity元素中加入以下代码:
        android:lauchMode="singleInstance"
        如果想要限制一个程序中只有一个activity实例,只需要在AndroidManifest.xml的Activity元素中加入以下代码:
        android:lauchMode="singleTask"
   3.2强制手机屏幕方向
        手机屏幕方向改变时,Activity被结束然后再重新启动,这样导致程序丢失了当前的状态.
        那么有一种方案是禁止切换应用程序的视图(屏幕方向的切换),在AndroidManifest.xml的Activity元素中加入以下代码:
        android:screenOrientation="portrait"(纵向)或者android:screenOrientation="landscape"(横向)
        问题还没有完全解决,以上代码只是将程序始终保存在指定的方向,并不能防止Activity的重新启动的一系列操作.
        要实现不重启,还需要在AndroidManifest.xml中设置

android:configChanges="orientation|keyboradHidden"(手机屏幕方向,键盘滑出时触发),事件为onConfigurationChanged(Configuration newConfig)
   3.3保存和恢复Activity的信息
       手机屏幕方向改变时,Activity被结束然后再重新启动,这样导致程序丢失了当前的状态.
       我们可以保存当前Activity的信息,然后再重启是恢复之前的信息
       实现这一想法就是:onSaveInstanceState和onRestoreInstanceState
       原理:当一个Activty即将被Kill时,通过重写onSaveInstanceState来保存需要保存的状态的相关信息,当重新创建该Activity后,之前onSaveInstanceState保存的状态信息将
通过Bundle传递给onCreate方法,然后就可以利用onRestoreInstanceState方法来保存恢复之前的状态信息了.
值得注意一下:
触发onSaveInstanceState的几个操作:(实际Activity销毁)
1.当用户按下HOME键
2.长按HOME
3.按下电源按键,屏保状态
4.屏幕方向切换(不设置configChanges)
Note:除了第4种,其他的3种情况,onSaveInstanceState和onRestoreInstanceState不一定是被成对调用的.

4.Activity的交互
    4.1启动另一个Activity(跳转)
        1.定义一个Intent,并为该Intent指定即将被启动的Activity
         Intent newActivityIntent=new Intent(this,NewActivity.class);
        2.调用Intent的startActivity方法启动并跳转到新的Activity
         startActivity(neActivityIntent);
        3.当新的Activity执行完毕之后,调用finish方法结束当前Activity,并将控制权交回给调用它的Activity.
         finish();
        4.在ActivityManifest.xml中声明新的Activity(注册)
    4.2启动另一个Activity并返回结果
        1.定义一个Intent,并为该Intent指定即将被启动的Activity
        2.调用startActivityForResult(Intent intent,int requestCode)跳转并标记requestCode
        3.重写onActivityResult(int requestCode,int resultCode,intent data)解析返回的数据
        4.在另一个Activity中调用setResult(RESULT_OK,backintent)
Note:在Activity之间传递数据Bundle:一个类型安全的容器,只能存储基本数据类型或基本类型的数组,如string,int,byte和boolean等

代码:

string资源文件:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">SetupNewActivity</string>
    <string name="hello_world">Hello world!</string>
    <string name="StartActivitiy">这是启动页面的Activity</string>
    <string name="NewActivity">启动新的Activity</string>
    <string name="EndNewActivity">结束当前Activity</string>
    <string name="ShowNewActivity">这是新启动的Activity界面</string>
</resources>

主页面:activity_lauch.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"
    tools:context="${relativePackage}.${activityClass}" >

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/StartActivitiy"
        />
    <Button
        android:text="@string/NewActivity"
        android:id="@+id/SetupNew"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:layout_marginTop="20dp"
        />
</RelativeLayout>

跳转页面:activity_new.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"
    tools:context="${relativePackage}.${activityClass}" >

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/ShowNewActivity">
    </TextView>
    <Button
        android:text="@string/EndNewActivity"
        android:id="@+id/End"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:layout_marginTop="20dp">
    </Button>
</RelativeLayout>

LauchActivity.java:

package com.YZR.setupnewactivity;

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

public class LauchActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_lauch);
        Button setupButton=(Button)findViewById(R.id.SetupNew);
        setupButton.setOnClickListener(new OnClickListener(){

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                setupNewActivity();
            }
        });
    }
    private void setupNewActivity() {
        // TODO Auto-generated method stub
        Intent newActivityIntent=new Intent(LauchActivity.this,NewActivity.class);
        startActivity(newActivityIntent);
    }
}

NewActivity.java

package com.YZR.setupnewactivity;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class NewActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_new);
        Button endButton=(Button)findViewById(R.id.End);
        endButton.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                finish();
            }
        });
    }
}

AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.YZR.setupnewactivity"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="21" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="LauchActivity"
            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="NewActivity"
            android:label="@string/app_name">

            <intent-filter>
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>

        </activity>
    </application>

</manifest>

    

下一节再介绍传值跳转.

仅供学习之用.

END

<?xml version="1.0" encoding="utf-8"?>
<resources>

<string name="app_name">SetupNewActivity</string>
    
    <string name="hello_world">Hello world!</string>
    <string name="StartActivitiy">这是启动页面的Activity</string>
    <string name="NewActivity">启动新的Activity</string>
    <string name="EndNewActivity">结束当前Activity</string>
    <string name="ShowNewActivity">这是新启动的Activity界面</string>
</resources>

时间: 10-17

Android笔记:Activity的相关文章

Android笔记:Activity之带值传递

   Activty之间的传递数据 之前学习过如何启动一个activity,在一些场合不单需要启动另一个activity,还需要得到返回的结果.而且有些时候更经常的操作时启动另一个activity时带上一些值. 1.定义一个Intent,并为该Intent指定即将被启动的Activity      2.调用startActivityForResult(Intent intent,int requestCode)跳转并标记requestCode    3.重写onActivityResult(in

Android笔记——Activity中的回传数据案例(装备选择)

1.创建程序: <LinearLayout 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" tools:conte

自学Android笔记——Activity中的数据传递案例(用户注册)

1.创建程序activity_main: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Line

自学Android笔记——Activity中的回传数据案例(装备选择)

1.创建程序: <LinearLayout 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" tools:conte

Android笔记——Activity中的数据传递案例(用户注冊)

1.创建程序activity_main: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Line

Android学习笔记-Activity&Intent

界面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="matc

Android 笔记-Fragment 与 Activity之间传递数据

Fragment 与 Activity之间传递数据有两种方法,一种是使用setArgument,一种是使用接口回调.下面先学习第一种方法. (1)使用setArgument方法: 为了便于理解,我在这里打个比喻:假如Activity是皇帝,它设立了三个部门(如三省六部),分别是Fragment1,Fragment2和Fragemnt3: 现在他现在要吩咐部门Fragment1去做一些事情,比如说:领兵攻打岛国!!好,它肯定不自己跑去告诉该部门的. 一般来说,会有个宰相或者太监总管来负责皇帝口谕是

Android学习笔记——Activity的启动和创建

http://www.cnblogs.com/bastard/archive/2012/04/07/2436262.html Android Activity学习笔记--Activity的启动和创建 最近学习Android相关知识,感觉仅仅了解Activity几个生命周期函数基本上没有任何意义的: 于是想深入了解一下Activity到底是怎么一回事怎么运行来的:里面的东东真是叫个庞大: 现在只能简单的了解其框架性的概念和流程: 一 Activity概念 Android的核心不是Applicati

【Android笔记】(1)—— Activity生命周期与通信

一.Activity 1.Activity状态 活动中:如果Activity在屏幕前,即是可视的,可接受用户的输入. 暂停状态:Activity失去焦点,但仍然可见. 停止状态:如果一个Activity被另一个Activity遮住了,它的状态时停止的. 2.Activity生命周期动作方法 onRestart() : Activity第一次被创建时调用,用于初始化一些数据,如View,此时处于停止状态. onStart(): Activity将要对用户可见时调用,调用后进入停止状态. onRes