• Android组件系列----当前Activity跳转到另一个Activity的详细过程


    【声明】

    欢迎转载,但请保留文章原始出处→_→

    生命壹号:http://www.cnblogs.com/smyhvae/

    文章来源:http://www.cnblogs.com/smyhvae/p/3863720.html

     

    【正文】 

    一、如何在一个应用程序当中定义多个Activity:

    步骤如下:

    (1)定义一个类,继承Activity

    (2)在该类当中,复写Activity当中的onCreate()方法

    (3)在AndroidManifest.xml文件中注册该Activity

    详细解释如下:

    (1)定义一个类,继承Activity:在src文件夹里面的包中新建一个class文件,可命名为:SecondActivity.java

    (2)在该类当中,复写Activity当中的onCreate()方法:在菜单栏选择Source--->Override/Implement Methods,弹出框,选择其中的onCreate()方法:

    clip_image004

    注:onCreate()方法是Activity运行的入口。

    紧接着,在layout文件夹中,为该Activity添加布局文件:(文件名必须为小写)

    clip_image006

    在该布局文件中添加一个 <TextView />

    在SecondActivity.java中设置该Activity所使用的布局文件,即在onCreate()方法中添加如下代码:

    setContentView(R.layout.second) ;
    (3)在AndroidManifest.xml文件中注册该Activity:(想要启动的Activity一定要先在Manifest文件中进行注册

    打开AndroidManifest.xml文件,注意里面的Activity标签,即以下代码:

    1         <activity
    2             android:name="com.example.test0201_activity01.MainActivity"
    3             android:label="@string/app_name" >
    4             <intent-filter>
    5                 <action android:name="android.intent.action.MAIN" />
    6                 <category android:name="android.intent.category.LAUNCHER" />
    7             </intent-filter>
    8         </activity> 

    代码解释如下:

    02行:代表Activity的名字:包名+类名。

    03行:label指定活动中标题栏的内容。

    04至08行:Activity的子标签,即:

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

    以上这段代码放在哪个Activity里,那个Activity就作为应用程序默认启动的Activity。即程序运行后的默认启动的Activity。

    现在将SecondActivity注册进去,在第一个Activity后面,添加如下代码:

    1         <activity 
    2             android:name="com.example.test0201_activity01.SecondActivity"
    3             android:label="SecondActivity" >            
    4         </activity> 
     

    二、Android当中的back stack(后退栈):(栈:子弹上膛,先进后出)

     

    android操作系统只显示back stack中最上面的元素(只显示栈顶端的activity)。

    在上方的图中,当用户点击后退按钮时,出现以下情况:(最上方的activity将被移除,依此类推)

     

    三、启动一个Activity的方法:即在默认启动的Activity中启动另一个Activity

    核心代码如下: 

    Intent intent = new Intent();
    intent.setClass(MainActivity.this, SecondActivity.class); 

    步骤如下:

    (1)生成一个意图对象 Intent

    (2)调用setClass方法设置所要启动的Activity

    (3)调用startActivity方法启动Activity

    具体解释如下:

    【实例】在第一个Activity点击按钮,来启动第二个Activity;在第二个Activity点击按钮,返回到第一个Activity

    (1)生成一个意图对象 Intent (Intent封装了你想做什么这件事)

    在布局文件activity_main.xml文件中添加一个button,并在MainActivity.java中生成button的监听器,

    生成意图对象的代码如下:

    Intent intent = new Intent() ;

    (2)调用setClass方法设置所要启动的Activity:

    Intent中的setClass方法格式如下:

    intent.setClass(packageContext, cls) ;

    参数解释如下:

    第一个参数:这个context对象即当前activity对象。Activity是context类的子类,此时Activity向上转型了。

    第二个参数:表示意图启动的那个Activity 。

    (3)调用startActivity方法启动Activity

    总而言之,监听器部分的【核心代码】如下:

        class ButtonListener implements OnClickListener {
            public void onClick(View v) {
                Intent intent = new Intent();
                //setClass函数的第一个参数是一个Context对象
                //Context是一个类,Activity是Context类的子类,也就是说,所有的Activity对象,都可以向上转型为Context对象
                //setClass函数的第二个参数是一个Class对象,在当前场景下,应该传入需要被启动的Activity类的class对象
                intent.setClass(MainActivity.this, SecondActivity.class);
                startActivity(intent);
            }
            
        }

    核心代码为第04行至第09行。

    【完整代码】如下:方案一

     1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     2     xmlns:tools="http://schemas.android.com/tools"
     3     android:layout_width="match_parent"
     4     android:layout_height="match_parent"
     5     android:paddingBottom="@dimen/activity_vertical_margin"
     6     android:paddingLeft="@dimen/activity_horizontal_margin"
     7     android:paddingRight="@dimen/activity_horizontal_margin"
     8     android:paddingTop="@dimen/activity_vertical_margin"
     9     tools:context=".MainActivity" >
    10 
    11     <Button
    12         android:id="@+id/button1"
    13         android:layout_width="match_parent"
    14         android:layout_height="wrap_content"
    15         android:text="启动第二个Activity" />
    16 
    17 </RelativeLayout>
    activity_main.xml

     

     1 package com.example.activiychange;
     2 
     3 import android.app.Activity;
     4 import android.content.Intent;
     5 import android.os.Bundle;
     6 import android.view.Menu;
     7 import android.view.View;
     8 import android.view.View.OnClickListener;
     9 import android.widget.Button;
    10 
    11 public class MainActivity extends Activity {
    12 
    13     private Button button ;
    14     
    15     @Override
    16     protected void onCreate(Bundle savedInstanceState) {
    17         super.onCreate(savedInstanceState);
    18         setContentView(R.layout.activity_main);
    19         
    20         button = (Button)findViewById(R.id.button1) ;
    21         
    22        // button.setOnClickListener(new ButtonListener()) ;            
    23         
    24        //为Button绑定监听器,采用匿名内部类
    25         button.setOnClickListener(new OnClickListener() {
    26             
    27             @Override
    28             public void onClick(View arg0) {
    29                 //下面这一行,有两种方法。方法一:
    30                 Intent intent = new Intent(MainActivity.this,SecondActivity.class) ;                
    31 /*                //方法二:
    32                 Intent intent = new Intent();
    33                 intent.setClass(MainActivity.this, SecondActivity.class);*/
    34                 //备注:setClass函数的第一个参数是一个Context对象
    35                 //备注:Context是一个类,Activity是Context类的子类,也就是说,所有的Activity对象,都可以向上转型为Context对象
    36                 //备注:setClass函数的第二个参数是一个Class对象,在当前场景下,应该传入需要被启动的Activity类的class对象
    37                 
    38                 startActivity(intent) ;                
    39             }
    40         } );
    41 
    42     }
    43 
    44 /*    class ButtonListener implements OnClickListener {
    45 
    46         @Override
    47         public void onClick(View arg0) {
    48             Intent intent = new Intent();
    49             intent.setClass(MainActivity.this, SecondActivity.class);
    50             startActivity(intent) ;
    51         }
    52         
    53     }*/
    54     
    55     
    56     @Override
    57     public boolean onCreateOptionsMenu(Menu menu) {
    58         // Inflate the menu; this adds items to the action bar if it is present.
    59         getMenuInflater().inflate(R.menu.main, menu);
    60         return true;
    61     }
    62     
    63 }
    MainActivity.java

     

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     3     android:layout_width="match_parent"
     4     android:layout_height="match_parent" >
     5 
     6     <Button
     7         android:id="@+id/button1"
     8         android:layout_width="wrap_content"
     9         android:layout_height="wrap_content"
    10         android:layout_alignParentRight="true"
    11         android:layout_alignParentTop="true"
    12         android:layout_marginRight="82dp"
    13         android:text="返回" /> 
    14 
    15 </RelativeLayout>
    second.xml

     

     1 package com.example.activiychange;
     2 
     3 import android.app.Activity;
     4 import android.content.Intent;
     5 import android.os.Bundle;
     6 import android.view.View;
     7 import android.view.View.OnClickListener;
     8 import android.widget.Button;
     9 
    10 public class SecondActivity extends Activity {
    11     
    12     private Button button1 ;
    13     @Override
    14     protected void onCreate(Bundle savedInstanceState) {
    15         super.onCreate(savedInstanceState);
    16         setContentView(R.layout.second);
    17         
    18         button1 = (Button)findViewById(R.id.button1) ;
    19         
    20         //为返回按钮绑定监听器
    21         button1.setOnClickListener(new OnClickListener() {
    22 
    23             @Override
    24             public void onClick(View arg0) {
    25                 Intent intent = new Intent(SecondActivity.this,MainActivity.class) ;
    26                 startActivity(intent) ;    
    27             }
    28             
    29         });        
    30 
    31         
    32     }
    33 }
    SecondActivity.java

    并在清单文件中注册SecondActivity,添加如下代码:

    1         <activity 
    2             android:name=".SecondActivity"
    3             android:label="SecondActivity"  >            
    4         </activity>
    AndroidManifest.xml

     

    或者如果不绑定监听器的话,可以对布局文件中的Button添加如下代码:android:onClick="gotoSecondActivity"

    【完整代码】如下:方案二

     1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     2     xmlns:tools="http://schemas.android.com/tools"
     3     android:layout_width="match_parent"
     4     android:layout_height="match_parent"
     5     android:paddingBottom="@dimen/activity_vertical_margin"
     6     android:paddingLeft="@dimen/activity_horizontal_margin"
     7     android:paddingRight="@dimen/activity_horizontal_margin"
     8     android:paddingTop="@dimen/activity_vertical_margin"
     9     tools:context=".MainActivity" >
    10 
    11     <TextView
    12         android:id="@+id/textView1"
    13         android:layout_width="wrap_content"
    14         android:layout_height="wrap_content"
    15         android:text="@string/hello_world" />
    16 
    17     <Button
    18         android:id="@+id/button1"
    19         android:layout_width="wrap_content"
    20         android:layout_height="wrap_content"
    21         android:layout_below="@+id/textView1"
    22         android:layout_marginTop="22dp"
    23         android:onClick="gotoSecondActivity"
    24         android:text="启动第二个Activity" />
    25 
    26 </RelativeLayout>
    activity_main.xml
     1 package com.example.smyh004activity01;
     2 
     3 import android.app.Activity;
     4 import android.content.Intent;
     5 import android.os.Bundle;
     6 import android.view.Menu;
     7 import android.view.View;
     8 
     9 public class MainActivity extends Activity {
    10 
    11     @Override
    12     protected void onCreate(Bundle savedInstanceState) {
    13         super.onCreate(savedInstanceState);
    14         setContentView(R.layout.activity_main);
    15         System.out.println("MainActivity-onCreate");
    16     }
    17     
    18     @Override
    19     protected void onStart() {
    20         super.onStart();
    21         System.out.println("MainActivity-onStart");
    22     }
    23     
    24     @Override
    25     protected void onResume() {
    26         super.onResume();
    27         System.out.println("MainActivity-onResume");
    28     }
    29     
    30     @Override
    31     protected void onPause() {
    32         super.onPause();
    33         System.out.println("MainActivity-onPause");
    34     }    
    35 
    36     @Override
    37     protected void onStop() {
    38         super.onStop();
    39         System.out.println("MainActivity-onStop");
    40     }    
    41     
    42 
    43     @Override
    44     protected void onRestart() {
    45         super.onRestart();
    46         System.out.println("MainActivity-onRestart");
    47     }
    48 
    49 
    50     @Override
    51     protected void onDestroy() {
    52         super.onDestroy();
    53         System.out.println("MainActivity-onDestroy");
    54     }
    55 
    56 
    57     /*
    58      * 通过这个方法跳转到SecondActivity界面
    59      */
    60     public void gotoSecondActivity(View view){
    61         //创建一个意图
    62         Intent intent = new Intent(MainActivity.this,SecondActivity.class);
    63         startActivity(intent);
    64     }
    65     
    66     @Override
    67     public boolean onCreateOptionsMenu(Menu menu) {
    68         // Inflate the menu; this adds items to the action bar if it is present.
    69         getMenuInflater().inflate(R.menu.main, menu);
    70         return true;
    71     }
    72     
    73 }
    MainActivity.java
     1 <?xml version="1.0" encoding="utf-8"?>
     2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     3     android:layout_width="match_parent"
     4     android:layout_height="match_parent"
     5     android:orientation="vertical" >
     6     
     7      <TextView
     8         android:id="@+id/textView1"
     9         android:layout_width="wrap_content"
    10         android:layout_height="wrap_content"
    11         android:text="@string/hello_world" />
    12 
    13     <Button
    14         android:id="@+id/button1"
    15         android:layout_width="wrap_content"
    16         android:layout_height="wrap_content"
    17         android:layout_below="@+id/textView1"
    18         android:layout_marginTop="22dp"
    19         android:onClick="gotoMainActivity"
    20         android:text="回到 第一个Activity" />   
    21 
    22 </LinearLayout>
    second.xml
     1 package com.example.smyh004activity01;
     2 
     3 import android.app.Activity;
     4 import android.content.Intent;
     5 import android.os.Bundle;
     6 import android.view.Menu;
     7 import android.view.View;
     8 
     9 public class SecondActivity extends Activity{
    10 
    11     @Override
    12     protected void onCreate(Bundle savedInstanceState) {
    13         // TODO Auto-generated method stub
    14         super.onCreate(savedInstanceState);
    15         setContentView(R.layout.second);
    16        System.out.println("SecondActivity-onCreate");
    17     }
    18     
    19     @Override
    20     protected void onStart() {
    21         super.onStart();
    22         System.out.println("SecondActivity-onStart");
    23     }
    24     
    25     @Override
    26     protected void onResume() {
    27         super.onResume();
    28         System.out.println("SecondActivity-onResume");
    29     }
    30     
    31     @Override
    32     protected void onPause() {
    33         super.onPause();
    34         System.out.println("SecondActivity-onPause");
    35     }    
    36 
    37     @Override
    38     protected void onStop() {
    39         super.onStop();
    40         System.out.println("SecondActivity-onStop");
    41     }    
    42     
    43 
    44     @Override
    45     protected void onRestart() {
    46         super.onRestart();
    47         System.out.println("SecondActivity-onRestart");
    48     }
    49 
    50 
    51     @Override
    52     protected void onDestroy() {
    53         super.onDestroy();
    54         System.out.println("SecondActivity-onDestroy");
    55     }
    56 
    57     /*
    58      * 通过这个方法跳转到SecondActivity界面
    59      */
    60     public void gotoMainActivity(View view){
    61         //创建一个意图
    62         Intent intent = new Intent(SecondActivity.this,MainActivity.class);
    63         startActivity(intent);
    64         finish();//结束当前的Activity
    65         //如果没有上面的finish(),那么当跳转到MainActivity之后,SecondActivity只会onStop,不会ondestroy。即仍然还在栈中
    66         //需要注意的是,当它跳到MainActivity时,会去重新创建一个新的MainActivity,即执行MainActivity中的onCreate()方法;
    67     }
    68     
    69 }
    SecondActivity.java

    并在清单文件中注册SecondActivity,添加如下代码:

    1         <activity 
    2             android:name=".SecondActivity"
    3             android:label=".SecondActivity">            
    4         </activity>

    生命周期描述如下:

    当用户点击当前默认的MainActivity中的按钮后,会跳到SecondActivity。生命周期如下:

    启动默认Activity时:

    MainActivity:onCreate

    MainActivity:onStart

    MainActivity: onResume

    点击按钮后,跳到SecondActivity:(MainActivity被保留至栈底)

    MainActivity:onPause

    SecondActivity:onCreate

    SecondActivity:onStart

    SecondActivity: onResume

    MainActivity: onStop

    按返回菜单后,回到MainActivity:(SecondActivity被销毁)

    SecondActivity: onPause

    MainActivity:onRestart

    MainActivity:onStart

    MainActivity: onResume

    SecondActivity: onStop

    SecondActivity: onDestroy

    当用户打开应用程序,之后按Home键返回到主页(或者按电源键,效果是一样的),再回到原来的程序。生命周期描述如下:

    启动默认Activity时:

    MainActivity:onCreate

    MainActivity:onStart

    MainActivity: onResume

    按Home键返回到主页:

    MainActivity:onPause

    MainActivity:onStop

    再回到原来的程序:

    MainActivity:onRestart

    MainActivity:onStart

    MainActivity:onResume

    方案二的【工程文件】

    链接:http://pan.baidu.com/s/1dDhBd7r 

    密码:jfm9

    我的公众号

    想学习代码之外的软技能?不妨关注我的微信公众号:生命团队(id:vitateam)。

    扫一扫,你将发现另一个全新的世界,而这将是一场美丽的意外:

  • 相关阅读:
    C# Console.Read()和Console.ReadLine()的区别
    C#获取项目程序及运行路径的方法
    Thread理解
    ENVI 监督分类Max stdev from Mean 参数IDL中的设置
    C# 插件开发学习实例
    利用动软代码器自动生存三层架构
    结构体的对齐
    链表分类及应用
    指针
    双向循环链表
  • 原文地址:https://www.cnblogs.com/qianguyihao/p/3863720.html
Copyright © 2020-2023  润新知