Activity 之间通过 Handler 通信

参考网址:http://blog.csdn.net/androidbluetooth/article/details/6611138

假设你已经明白下面的内容,那么这篇博客很适合您!

<1> Application 的作用及用法
<2> Activity、Task 以及 Application 之间的关系
<3> Handler 的用法

真的很感谢 anhenzhufeng 这位 CSDN 好友,如果不是他的虚心和认真,恐怕这篇文章难以问世!

再次感谢他在我的博客http://blog.csdn.net/androidbluetooth/article/details/6384641#reply的提问,这篇文章送给他以及有需要的朋友们。希望这篇博客能够帮到您!

读这篇博客之前,我们看看 anhenzhufeng 的问题,见截图,如下:


大致说一下我的思路吧!

多个 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

对于Application可以参考sdk api文档。在这里,我就直接使用,不做解释!

 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. 运行效果

7. 最后思考
这里只是两个Activity之间交互,多个 Activity 之间需要考虑设置 launchMode 即 Activity 的加载模式,更多关于这方面的知识可以参考:
http://blog.csdn.net/androidbluetooth/article/details/6547670
http://download.csdn.net/source/3368975
-----------------------------------------------------------------
有一个问题,如果上面的activity没有finish()的话好像无法刷新前一个activity,不知道有没其他好的办法

posted @ 2012-05-07 16:11  日光之下无新事  阅读(657)  评论(0编辑  收藏  举报