从一个Activity跳转到另一个Activity

本文介绍了如何在Android中通过Intent实现两个Activity之间的页面跳转,并详细阐述了如何在跳转过程中传递数据,包括创建Intent对象、设置键值对、获取目标Activity传来的数据等关键步骤。
第一个Activity
public class activity02 extends Activity {
    /** Called when the activity is first created. */
	private Button myButton = null; //申明为成员变量
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        Button myButton = (Button)findViewById(R.id.myButton);//获得Button
        myButton.setOnClickListener(new MyButtonListener());//将监听器捆绑在myButton上
        TextView myTextView = (TextView)findViewById(R.id.myTextView);
        myTextView.setText("jdfjei");
        myButton.setText("wfisdjf" + "\n" + "test");
        
    }
     class MyButtonListener implements OnClickListener{
                 //设置监听器,然后复写Oclick方法   
	
		@Override
		public void onClick(View v) {
			// TODO Auto-generated method stub
			Intent intent =new  Intent(); //生成Intent对象
			intent.putExtra("testIntent", "123");//加入一组键值对,传递数据
			intent.setClass(activity02.this,OtherActivity.class);//实现跳转功能
			activity02.this.startActivity(intent);
		
		}	
    }
}



另一个Activity
public class OtherActivity extends Activity{
	private TextView myTextView = null;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.other);
		Intent intent = getIntent();
		String value = intent.getStringExtra("testIntent");//取得testIntent的值
		myTextView = (TextView)findViewById(R.id.myTextView);
		myTextView.setText(value);
		
	}

}





这个实验描述了Activity之间外一种切换方式,通常Activity的切换方式是Activity1通过startActivity切换到Activity2, Activity2再通过startActivity切换到其他的Activity,但是有的时候我们需要启动一个新的Activity获取用户的输入,然后返回到原来的Activity,比如activity一个通讯录列表,我们通过一个增加按钮打开一个activity让用户输入新的联系人,输入后再返回通讯录列表。 这个时候,我们可以通过startActivityForResult(Intent, int)方法启动新的Activity,新的Activity通过setResult(int, Intent)方法返回老的Activity,这个时候会触发老的Activity的onActivityResult(int, int, Intent)方法,我们可以在这个方法的实现中处理返回事件。 startActivityForResult(Intent, int),其中int为Request Code,也是onActivityResult的第一个参数,通常一个Activity不仅仅只触发一个获取事件,比如上面提到的通讯录,可能会有一个增加联系人的事件,也可能会有一个修改联系人或给指定联系人增加一个电话的事件,但我们只有一个onActivityResult方法,所以我们需要这么一个Request Code区分是哪个事件的返回,这个值是用户自己定义的,而且完全是用户自己进行管理,很人性化。 setResult(int, Intent),其中的int是Result Code,它表示的是返回的状态,也是onActivityResult的第二个参数。这个参数需要特别注意一下,android为这个值提供了三个默认的常量。我们先看前两个,RESULT_CANCELEDRESULT_OK,这个从字面上很好理解,一个是运行取消,一个是运行成功返回,当用户按BACK键时,Result Code就是RESULT_CANCELED。但我们看看他们分别对应的值,就会发现奇怪的地方,RESULT_CANCELED=0,RESULT_OK=-1!!!在其他系统中OK通常都是1,而在android,它是-1,这是为什么呢,来让我们看看第三个默认的常量,RESULT_FIRST_USER=1,明白了吧!android把所有大于0的数字都留给了用户自己,多么人性化啊!但是要注意了,如我前面所说,大部分系统都喜欢将大于0作为正确返回,小于0作为错误返回,所以很多人(包括我),喜欢用if(result > 0)表示返回成功,这个在android是不通行的,一定要特别注意!
<think>我们正在讨论Android中Activity之间的相互跳转,使用Intent实现。用户的问题中提到了两个Activity:DetailActivityPhoneActivity。在DetailActivity中,用户点击返回按钮时,会创建一个新的Intent跳转回PhoneActivity,并传递一些数据。 但是,用户之前的问题是关于在DetailActivity中设置flag="used"时报错。根据我们的分析,这是因为在匿名内部类(OnClickListener)中访问了外部方法的局部变量,而Java要求这些变量必须是final或等效final的。在onCreate方法中定义的String flag="unused"是一个局部变量,然后在common_used按钮的点击事件中尝试修改它(flag="used"),这会导致编译错误。 现在,用户的问题转向了如何实现两个Activity之间的相互跳转,特别是使用Intent。我们注意到在DetailActivity中,返回按钮的点击事件中使用了以下代码跳转回PhoneActivity: ```java Intent intent_back = new Intent(DetailActivity.this, PhoneActivity.class); intent_back.putExtra("position", positon); intent_back.putExtra("flag", flag); startActivity(intent_back); ``` 这里,我们通过Intent传递了两个数据:positionflag。 因此,我们需要回答用户关于如何实现两个Activity之间相互跳转的问题,同时要考虑到之前遇到的flag变量问题。 解决方案: 1. 对于flag变量的问题,我们建议将其改为DetailActivity的成员变量,这样在内部类中就可以修改它了。 2. 对于Activity之间的相互跳转,我们使用Intent,并传递数据。 下面我们详细说明如何实现两个Activity之间的相互跳转。 步骤: 1. 从Activity A跳转Activity B(携带数据) 2. 从Activity B跳转Activity A(携带数据) 注意:在Android中,Activity之间跳转都是通过Intent实现的。每次跳转都是一个新的Intent,即使跳转回之前的Activity,也会创建一个新的实例(除非我们设置特定的启动模式)。但通常,我们不希望创建多个相同的Activity,所以我们可以使用finish()来结束当前的Activity,返回到上一个Activity。或者,我们可以使用startActivityForResult来启动Activity B,并在Activity B结束时返回结果给Activity A。 然而,在用户提供的代码中,DetailActivity跳转回PhoneActivity时,是使用startActivity(intent_back)来启动一个新的PhoneActivity实例。这可能会导致PhoneActivity的多个实例。为了避免这种情况,我们可以考虑以下两种方式: 方式一:使用finish()结束当前Activity,这样就会回到上一个Activity(即PhoneActivity),但这种方式不能传递数据给上一个Activity(因为上一个Activity已经存在,不会重新创建)。所以,如果我们需要传递数据回去,最好使用startActivityForResult。 方式二:使用startActivityForResult启动DetailActivity,然后在DetailActivity中设置结果并finish(),这样PhoneActivity的onActivityResult方法就会被调用,从而获取数据。 但是,在用户提供的代码中,DetailActivity跳转回PhoneActivity时,传递了数据并启动了一个新的PhoneActivity。如果用户希望回到之前的PhoneActivity并传递数据,那么应该使用方式二。 然而,我们注意到在DetailActivity中,返回按钮的点击事件中创建了一个新的Intent,跳转到PhoneActivity,并传递了两个数据。这将会创建一个新的PhoneActivity实例,而不是回到之前的那个。所以,如果用户希望避免创建多个PhoneActivity,应该使用finish()来结束DetailActivity,这样就会回到之前的PhoneActivity,同时使用startActivityForResult来传递数据。 下面我们分别介绍两种常用的跳转方式: 1. 普通跳转(携带数据): - 从Activity A跳转Activity B(不返回结果) ```java // 在Activity A中 Intent intent = new Intent(ActivityA.this, ActivityB.class); intent.putExtra("key", value); // 传递数据 startActivity(intent); ``` - 在Activity B中,如果需要跳转Activity A(并传递数据),可以同样使用Intent,但这样会创建新的Activity A实例。为了避免这种情况,我们可以在Activity B中调用finish()来销毁自己,这样就会回到Activity A,但这样无法传递数据给Activity A(除非使用startActivityForResult)。 2. 使用startActivityForResult进行跳转(推荐用于需要返回结果的场景): - 在Activity A中启动Activity B,并等待结果: ```java // 在Activity A中 Intent intent = new Intent(ActivityA.this, ActivityB.class); startActivityForResult(intent, REQUEST_CODE); // REQUEST_CODE是一个自定义的请求码,用于识别返回结果 ``` - 在Activity B中,设置要返回的结果,并结束自己: ```java // 在Activity B中 Intent resultIntent = new Intent(); resultIntent.putExtra("key", value); // 返回数据 setResult(RESULT_OK, resultIntent); // 设置结果码Intent finish(); // 结束Activity B,返回Activity A ``` - 在Activity A中重写onActivityResult方法,接收返回的数据: ```java @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE) { if (resultCode == RESULT_OK) { // 处理返回的数据 String value = data.getStringExtra("key"); } } } ``` 针对用户代码中的问题,我们建议修改: 在DetailActivity中,返回按钮的点击事件应该设置结果并结束自己,而不是启动一个新的PhoneActivity。但是,用户代码中跳转的目标是PhoneActivity,而DetailActivity是从PhoneActivity跳转过来的。所以,我们可以假设PhoneActivity是使用startActivityForResult启动DetailActivity的。 修改步骤: 1. 在PhoneActivity中,启动DetailActivity时使用startActivityForResult。 2. 在DetailActivity中,返回按钮点击时,设置结果并调用finish()。 3. 在PhoneActivity中,重写onActivityResult来接收数据。 但是,用户代码中DetailActivity的返回按钮点击事件中,传递了两个数据:positionflag。我们可以通过结果Intent返回这两个数据。 修改DetailActivity的返回按钮点击事件: ```java back.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 创建Intent用于返回数据 Intent resultIntent = new Intent(); resultIntent.putExtra("position", positon); resultIntent.putExtra("flag", flag); setResult(RESULT_OK, resultIntent); finish(); // 结束当前Activity,返回PhoneActivity } }); ``` 同时,在PhoneActivity中,启动DetailActivity时使用startActivityForResult: ```java // 假设在PhoneActivity中有一个方法启动DetailActivity Intent intent = new Intent(PhoneActivity.this, DetailActivity.class); intent.putExtra("name", name); // 传递数据到DetailActivity intent.putExtra("number", number); intent.putExtra("position", position); // 传递位置 startActivityForResult(intent, REQUEST_CODE_DETAIL); // 请求码 ``` 然后,在PhoneActivity中处理结果: ```java @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE_DETAIL) { if (resultCode == RESULT_OK) { String position = data.getStringExtra("position"); String flag = data.getStringExtra("flag"); // 使用这些数据更新UI或逻辑 } } } ``` 外,关于flag变量的问题,我们需要将flag改为成员变量: 在DetailActivity中: ```java public class DetailActivity extends AppCompatActivity { private String flag = "unused"; // 成员变量 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_detail); // ... 其他代码 common_used.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { flag = "used"; // 修改成员变量,不会报错 } }); // ... 其他代码 } } ``` 这样,在返回按钮的点击事件中,我们使用的flag就是修改后的成员变量。 总结: 1. 使用startActivityForResultsetResult、finish来实现Activity之间的相互跳转并传递数据,避免创建多个实例。 2. 将需要修改的局部变量改为成员变量,以解决内部类中修改局部变量的问题。 以上是实现Activity之间相互跳转并传递数据的推荐方法。</think>### Android 使用 Intent 实现 Activity 相互跳转 在 Android 中,使用 Intent 实现 Activity 之间的相互跳转需要掌握以下核心要点: #### 1. **基本跳转实现** 两个 Activity 相互跳转的基本模式: ```java // ActivityA 跳转ActivityB public class ActivityA extends AppCompatActivity { public void jumpToB(View view) { Intent intent = new Intent(this, ActivityB.class); startActivity(intent); } } // ActivityB 跳转ActivityA public class ActivityB extends AppCompatActivity { public void jumpToA(View view) { Intent intent = new Intent(this, ActivityA.class); startActivity(intent); } } ``` #### 2. **数据传递机制** 使用 `putExtra()` 传递数据,通过 `getStringExtra()` 接收数据: ```java // 发送数据 Intent intent = new Intent(ActivityA.this, ActivityB.class); intent.putExtra("USER_NAME", "张三"); intent.putExtra("USER_AGE", 25); startActivity(intent); // 接收数据(在ActivityB的onCreate中) Bundle extras = getIntent().getExtras(); if (extras != null) { String name = extras.getString("USER_NAME"); int age = extras.getInt("USER_AGE"); } ``` #### 3. **避免创建多实例** 使用 `FLAG_ACTIVITY_REORDER_TO_FRONT` 避免重复创建 Activity: ```java // 在ActivityB中返回ActivityA Intent intent = new Intent(this, ActivityA.class); intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); startActivity(intent); ``` #### 4. **双向数据传递(推荐方案)** 使用 `startActivityForResult()` 实现双向数据传递: ```java // ActivityA 启动 ActivityB 并等待结果 private static final int REQUEST_CODE = 1; public void startBForResult(View view) { Intent intent = new Intent(this, ActivityB.class); startActivityForResult(intent, REQUEST_CODE); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) { String result = data.getStringExtra("RESULT_DATA"); // 处理返回数据 } } // ActivityB 返回数据给 ActivityA public void returnToA(View view) { Intent resultIntent = new Intent(); resultIntent.putExtra("RESULT_DATA", "处理完成"); setResult(RESULT_OK, resultIntent); finish(); // 关闭当前Activity } ``` #### 5. **AndroidManifest 配置** 确保所有 Activity 都在 `AndroidManifest.xml` 中注册: ```xml <application> <activity android:name=".ActivityA" android:label="主界面"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".ActivityB" android:label="详情界面"/> </application> ``` #### 6. **解决变量作用域问题** 针对您原始代码中的 `flag` 问题,解决方案如下: ```java public class DetailActivity extends AppCompatActivity { // 将flag改为成员变量 private String flag = "unused"; @Override protected void onCreate(Bundle savedInstanceState) { // ...其他代码不变... common_used.setOnClickListener(v -> flag = "used"); back.setOnClickListener(v -> { Intent intent_back = new Intent(this, PhoneActivity.class); intent_back.putExtra("flag", flag); // 传递成员变量 startActivity(intent_back); }); } } ``` ### 关键注意事项 1. **数据大小限制**:Intent 传递数据不宜超过 1MB,大文件应使用文件路径 2. **生命周期管理**:跳转时注意 Activity 的生命周期变化 3. **任务栈管理**:使用 `android:launchMode` 控制 Activity 启动模式 4. **数据类型支持**:Intent 支持基本类型、String、Parcelable Serializable 对象 通过以上方法,您可以实现 Android 应用中 Activity 之间的灵活跳转数据传递[^1][^2][^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值