Android 两个Activity之间信息的交互

出处:http://blog.csdn.net/veryitman/article/details/6611138

 感谢原文作者,整个逻辑很清楚,这备份下

多个 Activity 之间可以通过 Application 共享数据,在这里我就让两个 Activity 共享 Handler(更新UI,我一般使用 Handler),主 Activity 中更新 UI,另一个 Activity 发送更新UI的消息。这样就达到在主Activity更新UI的目的。好吧,具体看代码!

1. 主 Activity 的 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"  
    >  
    <TextView  
        android:id="@+id/tv"    
        android:layout_width="fill_parent"   
        android:layout_height="wrap_content"   
        android:text="changed before: This is MasterActivity!"  
        />  
    <Button   
        android:layout_marginTop="15dip"  
        android:id="@+id/btn_to"    
        android:layout_width="fill_parent"   
        android:layout_height="wrap_content"   
        android:text="To OtherActivity"/>  
      
</LinearLayout>

2. 主 Activity 的Java 代码

 package mark.zhang;  
  
import android.app.Activity;  
import android.content.Intent;  
import android.graphics.Color;  
import android.os.Bundle;  
import android.os.Handler;  
import android.os.Message;  
import android.view.View;  
import android.view.View.OnClickListener;  
import android.widget.Button;  
import android.widget.TextView;  
  
public class MasterActivity extends Activity {  
    // 用于msg.what值  
    private static final int CHANGED = 0x0010;  
      
    private Button btn_to = null;  
    private TextView tv = null;  
      
    private MyHandler handler = null;  
      
    private MyAPP mAPP = null;  
      
  
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  
          
        mAPP = (MyAPP) getApplication();  
        handler = new MyHandler();  
          
        tv = (TextView) findViewById(R.id.tv);  
        btn_to = (Button) findViewById(R.id.btn_to);  
        // 设置监听器  
        btn_to.setOnClickListener(new OnClickListener() {  
  
            @Override  
            public void onClick(View v) {  
                // 设置共享变量  
                mAPP.setHandler(handler);  
                // 启动另一个Activity  
                Intent intent = new Intent(MasterActivity.this,  
                        ToChangeViewActivity.class);  
                startActivity(intent);  
            }  
        });  
    }  
      
    /** 
     * 自己实现 Handler 处理消息更新UI 
     *  
     * @author mark 
     */  
    final class MyHandler extends Handler {  
        @Override  
        public void handleMessage(Message msg) {  
            super.handleMessage(msg);  
            if(msg.what == CHANGED) { // 更新UI  
                tv.setText("changed after: I have be changed by Other Activity!");  
                tv.setBackgroundColor(Color.BLUE);  
                  
                btn_to.setText("I have been changed!");  
                btn_to.setBackgroundColor(Color.RED);  
            }  
        }  
    }  
}

3. 自实现Application

 package mark.zhang;  
  
import mark.zhang.MasterActivity.MyHandler;  
import android.app.Application;  
  
/** 
 * 自己实现Application,实现数据共享 
 *  
 * @author mark 
 * 
 */  
public class MyAPP extends Application {  
    // 共享变量  
    private MyHandler handler = null;  
      
    // set方法  
    public void setHandler(MyHandler handler) {  
        this.handler = handler;  
    }  
      
    // get方法  
    public MyHandler getHandler() {  
        return handler;  
    }  
}

4. 改变主Activity UI 的Activity

该 Activity 是 ToChangeViewActivity,Java、以及布局文件 show.xml 代码如下。

 package mark.zhang;  
  
import mark.zhang.MasterActivity.MyHandler;  
import android.app.Activity;  
import android.os.Bundle;  
import android.view.View;  
import android.view.View.OnClickListener;  
  
public class ToChangeViewActivity extends Activity {  
    private static final int CHANGED = 0x0010;  
      
    private MyAPP mAPP = null;  
      
    private MyHandler mHandler = null;  
      
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.show);  
          
        mAPP = (MyAPP) getApplication();  
        // 获得该共享变量实例  
        mHandler = mAPP.getHandler();  
          
        findViewById(R.id.btn_chang).setOnClickListener(new OnClickListener() {  
              
            @Override  
            public void onClick(View v) {  
                // 发送消息  
                mHandler.sendEmptyMessage(CHANGED);  
                ToChangeViewActivity.this.finish();  
            }  
        });  
    }  
}
 <?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:id="@+id/tv"    
        android:layout_width="fill_parent"   
        android:layout_height="wrap_content"   
        android:text="hello,MasterActivity!"  
        />   
      
    <Button  
        android:id="@+id/btn_chang"    
        android:layout_width="fill_parent"   
        android:layout_height="wrap_content"   
        android:text="change the MasterActivityView..."  
        />   
      
</LinearLayout>

5. 修改manifest.xml文件
这里主要注意两点:

<1> 声明 Application

<2> 注册 ToChangeViewActivity

代码,如下:

 <?xml version="1.0" encoding="utf-8"?>  
<manifest xmlns:android="http://schemas.android.com/apk/res/android"  
      package="mark.zhang"  
      android:versionCode="1"  
      android:versionName="1.0">  
    <uses-sdk android:minSdkVersion="7" />  
  
    <application android:name=".MyAPP" android:icon="@drawable/icon" android:label="@string/app_name">  
        <activity android:name=".MasterActivity"  
                  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=".ToChangeViewActivity"></activity>  
  
    </application>  
</manifest>

6. 运行效果

点击 " To OtherActivity",进入 ToChangeViewActivity

再点击“ change the MasterActivityView...”

改变效果

7. 最后思考

这里只是两个Activity之间交互,多个 Activity 之间需要考虑设置 launchMode 即 Activity 的加载模式,更多关于这方面的知识可以参考:

http://blog.csdn.net/androidbluetooth/article/details/6547670

http://download.csdn.net/source/3368975

时间: 2024-10-12 08:59:28

Android 两个Activity之间信息的交互的相关文章

Android两个Activity之间的数据交换

1. 不带数据 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); next=(Button)findViewById(R.id.next); next.setOnClickListener(new Button.OnClickListener() { @Override

Android中两个Activity之间简单通信

在Android中,一个界面被称为一个activity,在两个界面之间通信,采用的是使用一个中间传话者(即Intent类)的模式,而不是直接通信. 下面演示如何实现两个activity之间的通信. 信息的发起者为Test,接收者为Target,代码如下: Test类: 1 package com.example.testsend; 2 3 import android.content.Intent; 4 import android.support.v7.app.AppCompatActivit

Android Bundle类,通过bundle实现在两个activity之间的通讯

根据google官方的文档(http://developer.android.com/reference/android/os/Bundle.html) Bundle类是一个key-value对,“A mapping from String values to various Parcelable types.” 类继承关系: java.lang.Object     android.os.Bundle Bundle类是一个final类:public final classBundleexten

Android中在两个Activity之间进行数据传递

首先声明,此篇文章是我原先的CSDN上面的博客,由于种种原因,不想再使用csdn博客,于是就将其文章搬至现在的cnblog. 大家好,今天我终于开通了自己的博客,很开心能和大家共同分享我的学习经验,希望我们可以共同进步哦,废话不多说了,看一下我今天学习android遇到的一些问题和解决办法吧 首先先把我使用的eclipse的版本贴出来:adt-bundle-windows-x86-20130917 这是一个集成的版本,不需要配置SDK和ADT,但是需要手动配置JDK哦! 其实,不同版本的ecli

Android两个页面之间的切换效果工具类

import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.os.Build; import android.widget.Toast; public class ActivityAnimationUtil { private Context context; pr

两个Activity之间共享数据、互相访问的另一种方式的实现

本帖最后由 勇敢的心_ 于 2010-9-29 11:51 编辑本人从windows编程转过来学习Android开发,一直在想如果两个Activity之间能够像C#或delphi中的Form一样,可以直接访问其成员(字符.数值.成员对象等),并能调用其公开的方法,那应该比用Intent来传递数据直接方便的多,于是偿试了如下办法,测试基本没有问题,发出来大家讨论一下.本人学习android不久,幼稚的地方希望大家不要见笑原理:假设有两个Activity:ActivityMain 和 Activit

借助Intent实现Android工程中Activity之间Java对象的传递——实现Parcelable接口

借助Intent实现Android工程中Activity之间Java对象的传递有两种方式:一种所传递对象实现了Serializable接口:另一种是所传递对象实现了Parcelable接口,本博客总结传递对象实现Parcelable接口的情况下如何实现Java对象传递: 代码1.添加名为"User.java"的文件: package com.ghj.vo; import android.os.Parcel; import android.os.Parcelable; public cl

借助Intent实现Android工程中Activity之间Java对象的传递——实现Serializable接口

借助Intent实现Android工程中Activity之间Java对象的传递有两种方式:一种所传递对象实现了Serializable接口:另一种是所传递对象实现了Parcelable接口,本博客总结传递对象实现Serializable接口的情况下如何实现Java对象传递: 代码1.添加名为"User.java"的文件: package com.ghj.vo; import java.io.Serializable; public class User implements Seria

Android——Fragment和Activity之间的通信+Frangment生命周期

Android--Fragment和Activity之间的通信+Frangment生命周期 Fr'agment和Activity之间的通信 1.在Fragment中声明一个接口. 2.在Activity中实现在Fargment中声明的接口. 3.在Fragment中声明一个接口对象. 4.在Frangment的生命周期Onattach方法中判断当前Activity是否实现了此Fragment中声明的接口.如果已实现,就把当前Activity转换成接口对象. 5.调用Activity中实现的方法=