Android中一个Activity调用另一个Activity — Intent对象的使用

本文介绍在 Android 开发中如何使用 Intent 对象实现在不同 Activity 间的跳转。通过具体示例展示了如何创建 Intent 并指定目标 Activity,以及如何在 Activity 中启动新的 Activity 并关闭当前 Activity。
Android中一个Activity调用另一个Activity — Intent对象的使用
2010年04月12日 星期一 06:05 P.M.
http://hi.baidu.com/soulingm/blog/item/f71c5ee495077d22b83820b2.html

 

实现步骤


第一步 :建立Android 工程:IntentDemo。


第二步 :编写Activity 的子类别:IntentDemo,其程序代码如下:


package com.a3gs.intent;

import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.view.View;

import android.widget.Button;


public class IntentDemo extends Activity {

    /** Called when the activity is first created. */

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super .onCreate(savedInstanceState);

        setContentView(R.layout.main );

       

        Button btn1 = (Button) findViewById(R.id.btn1 );

        btn1.setOnClickListener(new Button.OnClickListener(){

           @Override

           public void onClick(View v) {

              // TODO Auto-generated method stub

              Intent intent = new Intent();

              intent.setClass(IntentDemo.this , Intent2.class );

              /* 调用一个新的 Activity */

              startActivity(intent);

              /* 关闭原本的 Activity */

              IntentDemo.this .finish ();

           }

        });

    }

}


第三步 :新建一个Activity 的子类别:Intent2,其程序代码如下:


package com.a3gs.intent;

import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.view.View;

import android.widget.Button;


public class Intent2 extends Activity {

    /** Called when the activity is first created. */

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super .onCreate(savedInstanceState);

        setContentView(R.layout.mylayout );

       

        Button btn2 = (Button) findViewById(R.id.btn2 );

        btn2.setOnClickListener(new Button.OnClickListener(){

           @Override

           public void onClick(View v) {

              // TODO Auto-generated method stub

              Intent intent = new Intent();

              intent.setClass(Intent2.this , IntentDemo.class );

              startActivity(intent);

              Intent2.this .finish ();

           }

        });

    }

}


第四步 :修改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"

    >


Android中一个Activity调用另一个Activity — Intent对象的使用(2
2010年04月12日 星期一 06:05 P.M.

<TextView

    android:layout_width="fill_parent"

    android:layout_height="wrap_content"

    android:text="@string/text1"

    />

<Button

    android:id="@+id/btn1"

    android:layout_width="fill_parent"

    android:layout_height="wrap_content"

    android:text="@string/bt1"

    />

</LinearLayout>

 

第四步 :修改res/layout/mylayout.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:layout_width="fill_parent"

    android:layout_height="wrap_content"

    android:text="@string/text2"

    />

<Button

    android:id="@+id/btn2"

    android:layout_width="fill_parent"

    android:layout_height="wrap_content"

    android:text="@string/bt2"

    />

</LinearLayout>


Android中一个Activity调用另一个Activity — Intent对象的使用(3
2010年04月12日 星期一 06:06 P.M.

第五步 :修改AndroidManifest.xml,其内容如下:

 

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

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

      package="com.a3gs.intent"

      android:versionCode="1"

      android:versionName="1.0">

    <application android:icon="@drawable/icon" android:label="@string/app_name">

        <activity android:name=".IntentDemo"

                  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=".Intent2" android:label="@string/app_name"></activity>

      </application>

    <uses-sdk android:minSdkVersion="3" />

</manifest>

 

扩展学习 :

 

当系统中新添加 Activity时,必须在 AndroidManifest.xml里定义一个新的 activity

<activity android:name=".Intent2"></activity>否则系统将会因为找不到 Activity而发生编译错误。

另外,当程序中出现两个以上的 Activity时,系统要如何决定主程序是哪一支( entry point)呢?以本范例来说, AndroidManifest.xml Activity IntentDemo的定义如下:

<activity android:name=".IntentDemo" android:label = "@string/app_name" >

<intent-filter>

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

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

     </intent-filter>

</activity>

其中有一行为 <category android:name="android.intent.category.LAUNCHER" />,这就代表程序启动时,会先运行 IntentDemo这个 Activity,而非 Intent2。需注意的是,这个参数必须要被定义,如果 xml中没有一支 Activity有设置这个参数,则程序将不会被运行。

此外,在两支 Java程序中的最后一行都调用了 finish() 这个方法,它代表这个 Activity已运作完毕,当系统接收到这个命令时,即会关闭此 Activity,所以此时点击模拟器的返回( Back)键,并不会回到上一个 Activity的画面,如果要让模拟器的返回键有回上一页的效果,可以将此行程序注释掉。同理,当两个 Activity在切换时,并非真的只有两个 Activity在切换,而是在点击按钮时,再重新调用起一个新的 Activity

<think> 首先,用户的问题是:“Android一个Activity的启动流程”,我需要用中文回答。问题要求我在回答后提出3-5个相关问题。 我的回答必须包括: 1. 回答用户的问题。 2. 在末尾提出3-5个相关问题。 3. 第一行输出必须是“§§相关问题§§”。 4. 禁止换行分散,意思是相关问题列表不能换行分散输出,应该是连续的单行输出?等等,看示例:“相关问题§§”在第一行,然后下面是从1.开始的列表。示例中是: ``` §§相关问题§§ 1. ··· 2. ··· 3. ··· ``` 所以,我应该输出:第一行“§§相关问题§§”,然后换行后输出列表。 规则说:“第一行必须完整且输出 \"§§相关问题§§\"!禁止换行分散。” 它说“禁止换行分散”,但在示例中是换行的。或许“禁止换行分散”是针对内容本身,意思是相关问题列表不能分散在多个地方,而应该集中输出在末尾。 对于相关问题: - 必须以“§§相关问题§§”开始第一行。 - 然后列出3-5个问题。 - 问题格式像:1. ··· 2. ··· 等。 现在,回答用户的问题:Android一个Activity的启动流程。 我需要简要解释Activity的启动流程。关键步骤: 1. 用户通过Intent启动一个Activity(例如,startActivity)。 2. 系统检查Intent。 3. ActivityManagerService处理启动请求。 4. 如果Activity是新实例,创建新实例;否则,可能带回前台。 5. 调用onCreate(), onStart(), onResume()等生命周期方法。 6. 涉及AMS、应用进程等。 我应该用中文简洁解释。 回答结构: - 先回答启动流程。 - 然后输出相关问题。 相关问题必须基于用户的问题和我的回答。所以,我需要提出相关问题如: 1. 启动ActivityIntent的作用是什么? 2. Activity的生命周期方法在启动时如何调用? 3. 如何设置Activity的启动模式? 4. 启动Activity涉及哪些系统服务? 5. 等等。 目标是3-5个相关问题。 确保所有内容符合规则,否则无效。 最终输出: - 回答部分。 - 然后“§§相关问题§§” - 然后问题列表。 现在,脑补回答: - 启动流程:当用户在Android应用中启动一个新的Activity时,通常是通过调用startActivity()方法,传入一个Intent对象。系统接收到这个请求后,会由ActivityManagerService来处理。AMS会检查目标Activity是否需要创建新实例或重用现有实例(基于启动模式)。然后,AMS会通知目标应用进程创建Activity实例(如果还未运行)。在Activity的创建过程中,会调用其生命周期方法:onCreate()用于初始化,onStart()表示Activity可见,onResume()表示Activity获得焦点并处于前台。 用中文写。 然后,相关问题: 1. 启动ActivityIntent的结构和作用是什么? 2. Activity生命周期方法在启动过程中的调用顺序是怎样的? 3. 如何配置Activity的启动模式(如standard, singleTop, singleTask, singleInstance)来控制启动行为? 4. 启动新Activity时,AMS和ApplicationThread的作用分别是啥? 5. 启动Activity会导致原Activity暂停吗?生命周期如何变化? 确保3-5个问题。 输出格式: - 回答结束。 - 换行。 - "§§相关问题§§" - 换行。 - 1. ... - 2. ... - 等等。 在代码示例中,相关问题部分是从新行开始的。 开始写响应。 </think> 在Android中,一个Activity的启动流程涉及多个步骤,主要包括用户或代码触发启动请求后,系统处理并调用Activity的生命周期方法。核心流程如下: 1. **触发启动**:用户操作(如点击按钮)或代码调用`startActivity(Intent)`方法,传入一个Intent对象指定目标Activity。 2. **Intent处理**:系统(通过`ActivityManagerService`,AMS)解析Intent,验证权限和目标是否存在。 3. **任务栈管理**:AMS检查当前任务栈(Task Stack): - 如果目标Activity的启动模式(如standard、singleTop)允许新实例,则创建新Activity实例。 - 否则,可能重用现有实例(如singleTask模式)。 4. **进程创建**:如果目标应用进程未运行,AMS通过`Zygote`创建新进程并启动ApplicationThread。 5. **生命周期调用**:在目标进程中: - `onCreate()`:Activity实例化,初始化UI(如setContentView)。 - `onStart()`:Activity可见但未处于前台。 - `onResume()`:Activity获得焦点,处于前台状态。 6. **UI渲染**:系统更新界面,新Activity显示给用户。 整个流程由AMS协调,涉及Binder进程通信。启动可能导致原Activity调用`onPause()`或`onStop()`(取决于配置)。开发者可通过Intent flags(如FLAG_ACTIVITY_NEW_TASK)控制细节。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值