Handler: Activity 之间通过 Handler 通信

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

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

点击 " 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


本篇博客源码下载地址:http://download.csdn.net/source/3447670



©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页