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"><TextViewandroid: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;@Overridepublic 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() {@Overridepublic void onClick(View v) {// 设置共享变量mAPP.setHandler(handler);// 启动另一个ActivityIntent intent = new Intent(MasterActivity.this,ToChangeViewActivity.class);startActivity(intent);}});}/*** 自己实现 Handler 处理消息更新UI* * @author mark*/final class MyHandler extends Handler {@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);if(msg.what == CHANGED) { // 更新UItv.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;@Overrideprotected 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() {@Overridepublic void onClick(View v) {// 发送消息mHandler.sendEmptyMessage(CHANGED);ToChangeViewActivity.this.finish();}});}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><TextViewandroid:id="@+id/tv" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="hello,MasterActivity!"/> <Buttonandroid: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
Handler: Activity 之间通过 Handler 通信相关推荐
- Android面试专题系列(四):Activity之间如何进行通信→LiveDataBus
不诗意的女程序媛不是好厨师~ 转载请注明出处,From李诗雨-https://blog.csdn.net/cjm2484836553/article/details/105147592 <And ...
- 【转】android之在activity中控制另一个activity的UI更新_如何在activity之间传递handler...
来自:http://blog.csdn.net/jason0539/article/details/18055259 遇到一个问题,需要在一个activity中控制另一个acitivity做一些更新, ...
- Fragment与Activity之间的相互通信
https://blog.csdn.net/u012702547/article/details/49786417 https://blog.csdn.net/carson_ho/article/de ...
- 【转】 android之如何在两个activity之间传递handler_利用broadcast广播机制
原文:http://blog.csdn.net/jason0539/article/details/18075293 这算是如何在两个activity之间传递handler的解决方案二了,解决方案一见 ...
- 正确理解 AsyncTask,Looper,Handler三者之间的关系(基于android 4.0)
Looper 和Handler 是理解好AsyncTask的一个基础,我们可以先从这里开始,先给出一个主线程和子线程互相通信的例子. 1 package com.example.loopertest; ...
- 从Android中Activity之间的通信说开来
引言 最近两个星期在研究android的应用开发,学习了android应用开发的基础知识,基本控件,基本布局,基本动画效果,数据存储,http访问internet等等基础知识. android中有一个 ...
- 【Android 应用开发】Activity生命周期 与 Activity 之间的通信
一. Activity生命周期 上图 1. Activity状态 激活状态 : Activity出于前台 , 栈顶位置; 暂停状态 : 失去了焦点 , 但是用户仍然可以看到 , 比如弹出一个对话框 , ...
- Android中BroadCast与Activity之间的通信
在看本文之前,假设你对于Android的广播机制不是非常了解.建议先行阅读我转载的一篇博文:图解 Android 广播机制. 因为本案例比較简单,故直接在此贴出代码,不做过多的阐述. 先上效果截图: ...
- Android(Fragment和Activity之间通信)
Fragment的使用可以让我们的应用更灵活的适配各种型号的安卓设备,但是对于Fragment和Activity之间的通信,很多朋友应该比较陌生,下面我们就通过一个实例来看一看如何实现. 一.Acti ...
最新文章
- 数据由SqlServer2008转移到MySQL的一个方法
- elasticsearch update 无结果
- python中的id()函数及读取list的例子
- ubuntu11.04解决root不能登录的问题
- PAT甲级1077 Kuchiguse:[C++题解]字符串、最长公共后缀
- Redis中的Sentinel 验证
- [Windows驱动开发](二)基础知识——数据结构
- 简单的01背包和完全背包
- java观察者模式在spring中的应用_在Spring中使用观察者模式
- C4D插件:Springy for Mac 动​​画对象添加重叠动作插件
- 金融科技:中国农行研发中心DevOps规划与实践
- 软件_手把手教vscode配置c++,python开发环境
- Java 定时器 Timer 与 定时任务 TimeTask
- gaussian窗口函数_常用窗函数的特点
- lammps建模_LAMMPS之Moltemplate建模教程
- imb服务器怎么拆硬盘,IBM P750更换本地硬盘
- 希捷硬盘校准日志分析
- 【STL容器讲解—栈队列】
- Suspending console(s) (use no_console_suspend to debug) android4.0 OMAP4460
- Cadence 17.2( Allegro PCB ) 使用 Shape Symbol 制作不规则焊盘