Handler应用: Activity 之间通过 Handler 通信
2015-10-23 13:47
483 查看
假设你已经明白下面的内容,那么这篇博客很适合您!
<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
转载地址: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. 运行效果
点击 " 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
转载地址:http://blog.csdn.net/androidbluetooth/article/details/6611138
相关文章推荐
- [Leetcode]Insertion Sort List
- Camera Calibration 相机标定:原理简介(四)
- javascript贪吃蛇小游戏
- APP测试体系
- hdu 1576(A/B)
- Camera Calibration 相机标定:原理简介(四)
- 多附件上传
- Labview 中的类
- [转] 再探java基础——break和continue的用法
- SharePoint 2007 IT Professional --如何进行Search Content?
- android adb常用指令
- gc buffer busy acquire vs release
- js特效——闪电
- HDU 2475 Box [dfs序+splay]
- jxl.write.biff.RowsExceededException: The maximum number of rows permitted on a worksheet been excee
- Linux搭建vsftp
- Boost源码学习二[内存管理一]下
- 【程序员眼中的统计学(8)】统计抽样的运用:抽取样本
- idea快捷键
- Centos7安装MySQL常见问题