上面学习了线程通过Massage发送字符串消息,Handler接收字符串消息,这样的形式来更新ui,接下来,一起分享怎么把一个对象利用消息机制发送出去,让主线程接收来更新ui。

下面就利用一个服务Server,Handler,Activity,和一个对象类分享具体实现情况。

首先创建一个个类,什么都行。例如:

 package dfrz.me.android.pcfileshare.bean;

 import java.io.Serializable;

 /**
* 描述:广告信息</br>
*/
public class ADInfo implements Serializable{ String id = "";
String url = "";
String content = "";
String type = ""; public String getId() {
return id;
} public void setId(String id) {
this.id = id;
} public String getUrl() {
return url;
} public void setUrl(String url) {
this.url = url;
} public String getContent() {
return content;
} public void setContent(String content) {
this.content = content;
} public String getType() {
return type;
} public void setType(String type) {
this.type = type;
} }

ADInfo

创建一个Activity父类:

import java.util.ArrayList;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
import android.view.Window;
import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
import android.widget.Toast; import dfrz.me.android.pcfileshare.service.MyHandler;
import dfrz.me.android.pcfileshare.service.MyService; public abstract class CustomActivity extends Activity { public static final int LENGTH_LONG = 1;
public static final int LENGTH_SHORT = 0;
public static String LOGCAT_KEY = "folder";
public static ArrayList<CustomActivity> activityList = new ArrayList<CustomActivity>();
public InputMethodManager inputMethodManager;
protected MyService.MyBinder binder = null; private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
Log.d("file", "privateChat-->onServiceDisconnected");
} @Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.d("file", "privateChat-->onServiceConnected");
binder = (MyService.MyBinder) service;
}
}; public void toast(String str,int i){
Toast.makeText(getApplicationContext(),str,i).show();
} /**
* onCreate方法中绑定服务。
* 添加接口等等一些操作。
* @param savedInstanceState
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//getSupportActionBar().hide();
requestWindowFeature(Window.FEATURE_NO_TITLE);
// 启动activity时不自动弹出软键盘
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
//获取系统键盘对象
inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
//将这个Activity加入到消息接收队列中
MyHandler.getInstance().registerActivity(this); activityList.add(this);
try {
while (!bindService(new Intent(this, MyService.class), connection, BIND_AUTO_CREATE)) ; } catch (Exception e) {
Toast.makeText(this, "服务器连接失败!", Toast.LENGTH_SHORT).show();
}
} @Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
try {
//移除队列
MyHandler.getInstance().unRegisterActivity(this);
activityList.remove(this);
unbindService(connection);
} catch (Exception e) {
e.printStackTrace();
}
} public static void finishAll() {
for (Activity activity : activityList) {
if (!activity.isFinishing()) {
activity.finish();
}
}
} /**
* 初始化UI
*/
protected abstract void initView(); /**
* 初始化数据
*/
protected abstract void initData(); /**
* 监听事件
*/ protected abstract void initOnClick(); /**
* 接收消息
* @param bundle
*/
public abstract void recvMessageFormHandler(Bundle bundle); }

Activity父类

编写自己的Handle消息接收,和广播到每个活动界面上,前提是每个Activity都要继承父类,并实现接收消息的方法。

 import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log; import java.util.ArrayList; import dfrz.me.android.pcfileshare.base.CustomActivity; /**
* Created by Administrator on 2016/11/18.
*/
public class MyHandler extends Handler {
private ArrayList<CustomActivity> activityList; private Bundle bundle;
private MyHandler(){
activityList = new ArrayList<CustomActivity>();
} private static MyHandler instance = null; @Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
bundle = msg.getData();
try {
if(activityList.size()>0){
for(CustomActivity customActivity:activityList){
//向每个customActivity内发送消息
customActivity.recvMessageFormHandler(bundle);
}
}
} catch (Exception e) {
// TODO: handle exception
}
} public static MyHandler getInstance(){
if(instance == null){
instance = new MyHandler();
}
return instance;
}
public void registerActivity(CustomActivity activity)
{
Log.d("HANDLER", "add "+activity.toString());
activityList.add(activity);
}
public void unRegisterActivity(CustomActivity activity){
Log.d("clientApp","remove"+activity.toString());
activityList.remove(activity);
}
}

MyHandler

为了方便发送不同的对象消息数据,封装发送消息方法:

 import android.os.Bundle;
import android.os.Message; import java.io.Serializable; /**
* Created by Administrator on 2017/1/16.
*/ public class SendHandlerMsg { private static Message message; /**
* 建立bundle 向 fragment 中发送消息
*
* @param SerializableKey 系列化键值
* @param obj 消息内容,传入时必须先系列化对象,不然数据发送不出去,会导致堵塞异常
* 建立bundle 向 Activity 中发送消息
*
* @param SerializableKey 系列化键值
* @param obj 消息内容
*/
public static void ActivityHandlerMsg(final String SerializableKey, final Object obj) {
new Thread(new Runnable() {
@Override
public void run() {
/**
* myHandler 向CustomActivity中发送消息
* MyHandler myHandler = MyHandler.getInstance();这句
           *必须放在线程内部,如果放在外面会导致getInstance(),Handler实类为空,Handler线程异常
*/
MyHandler myHandler = MyHandler.getInstance();
message = new Message();
Bundle bundle = new Bundle();
bundle.putSerializable(SerializableKey, (Serializable) obj);
message.setData(bundle);
myHandler.sendMessage(message);
}
}).start(); } }

下面用服务简单描述发送消息的过程:

 package dfrz.me.android.pcfileshare.service;

 import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.os.Message;
import android.util.Log; public class MyService extends Service { private MyBinder mybinder = new MyBinder();
// 得到Handler实类
MyHandler myHandler = MyHandler.getInstance(); public class MyBinder extends Binder {
/**
* 消息发送函数
* @param chatMsgEntity
*/
public void sendMsg(final ADInfo data) {
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
ADInfo adInfo = new ADInfo();
adInfo.setId("xxxxxx");
adInfo.setUrl("xxxxxxx");
.......
//发送消息到 Activity
SendHandlerMsg.ActivityHandlerMsg("ACT",adInfo);
}
}).start();
} /**
* 添加其他键值数据
* @param data
*/
public void sendMsg(final ADInfo data) {
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
ADInfo adInfo = new ADInfo();
adInfo.setId("xxxxxx");
adInfo.setUrl("xxxxxxx");
.......
//发送消息到 Activity
SendHandlerMsg.ActivityHandlerMsg("ACTIVITY",adInfo);
}
}).start();
} } public MyService() {
} @Override
public IBinder onBind(Intent intent) {
return mybinder;
} @Override
public void onCreate() { } }

Server

Activity代码展示:

 import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast; import dfrz.me.android.pcfileshare.R;
import dfrz.me.android.pcfileshare.base.CustomActivity; public class MainActivity extends CustomActivity implements View.OnClickListener {
private Button sendMsg1, SendMsg2;
private TextView showMsg; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
initView();
initData();
initOnClick();
} @Override
protected void initView() {
sendMsg1 = (Button) findViewById(R.id.sendMsg1);
sendMsg2 = (Button) findViewById(R.id.sendMsg2);
showMsg = (TextView) findViewById(R.id.showMsg);
} @Override
protected void initData() { } @Override
protected void initOnClick() {
sendMsg1.setOnClickListener(this);
sendMsg2.setOnClickListener(this);
back.setOnClickListener(this);
} @Override
public void recvMessageFormHandler(Bundle bundle) {
ADInfo adInfo = new ADInfo(); adInfo = (ADInfo) bundle.getSerializable("ACTI");
if (adInfo != null) {
showMsg.setText(adInfo.getUrl() + "");
}
// 这里可新new 一个实例接收消息
/**
* ChatMsg chatMsg = new ChatMsg(); chatMsg = (ChatMsg)
* bundle.getSerializable("CHAT"); 先判断chatMsg非空则接收到消息可更新UI
*/
Appinfo adInfo1 = new ADInfo();
adInfo1 = (ADInfo) bundle.getSerializable("ACTI");
if (adInfo1 != null) {
showMsg.setText(adInfo.getUrl() + "");
}
} @Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.sendMsg1:
{ ADInfo adInfo = new ADInfo();
adInfo.setId("xxxxxx");
adInfo.setUrl("xxxxxxx");
.......
binder.sendMsgA(adInfo);}
break;
case R.id.sendMsg2:{
ADInfo adInfo = new ADInfo();
adInfo.setId("1111111");
adInfo.setUrl("1111111111");
.......
binder.sendMsgB(adInfo);}
break;
}
} }

效果怎么样,这就不展示了,仅供参看,如有问题可提出来大家解决,有更好的建议还请各位大神多多指点,毕竟我还新手。thank you!

Android 消息传递之Bundle的使用——实现object对象传输(二)的更多相关文章

  1. Android 消息传递之Bundle的使用——实现object对象传输(一)

    UI更新--消息处理massage 对于安卓内部消息得处理,实现对界面UI得更新操作,不能在线程中直接更新ui.至于为什么不能,在学习安卓开发的时候,在线程中操作会使程序崩溃. 为什么,可以看看诸多大 ...

  2. Android消息传递之基于RxJava实现一个EventBus - RxBus

    前言: 上篇文章学习了Android事件总线管理开源框架EventBus,EventBus的出现大大降低了开发成本以及开发难度,今天我们就利用目前大红大紫的RxJava来实现一下类似EventBus事 ...

  3. Android消息传递之EventBus 3.0使用详解

    前言: 前面两篇不仅学习了子线程与UI主线程之间的通信方式,也学习了如何实现组件之间通信,基于前面的知识我们今天来分析一下EventBus是如何管理事件总线的,EventBus到底是不是最佳方案?学习 ...

  4. Android消息传递之Handler消息机制

    前言: 无论是现在所做的项目还是以前的项目中,都会遇见线程之间通信.组件之间通信,目前统一采用EventBus来做处理,在总结学习EventBus之前,觉得还是需要学习总结一下最初的实现方式,也算是不 ...

  5. Android学习笔记_46_Android的intent之间Object、List、List<Object>和全局变量数据的传递(Parcelable Serializable)

    转http://blog.csdn.net/pku_android/article/details/7456305 一.传递List<String>和List<Integer> ...

  6. Android消息传递之组件间传递消息

    前言: 上篇学习总结了Android通过Handler消息机制实现了工作线程与UI线程之间的通信,今天来学习一下如何实现组件之间的通信.本文依然是为学习EventBus做铺垫,有对比才能进步,今天主要 ...

  7. Android开发中Bundle用法包裹数据(转)

    Android开发中Bundle用法包裹数据 Bundle的经典用法,包裹数据放入Intent中,目的在于传输数据. SDK 里是这样描述: A mapping from String values ...

  8. ReactNative生成android平台的bundle文件命令

    ReactNative生成android平台的bundle文件命令 2016年11月03日 23:23:28 阅读数:4869 注:如果assets文件没有正确生成,需要手机创建或授权 网上的其它的很 ...

  9. Android消息传递之EventBus 3.0

    Android消息传递之EventBus 3.0使用详解 http://www.cnblogs.com/whoislcj/p/5595714.html EventBus 3.0进阶:源码及其设计模式 ...

随机推荐

  1. 【转】删除修改Eclipse里的SVN账户

    转自http://msongli.iteye.com/blog/1186648 引自: http://wanghongxu.iteye.com/blog/539806 http://jxdwuao.i ...

  2. bootstrap弹出框

    要想使用Bootstrap Popover(弹出框)则必须引入其依赖的文件: jquery.js这个必须的(还是要写在其他js前面,bootstrap是依赖jquery的哦) bootstrap-to ...

  3. 开发框架(OrchardNoCMS)介绍(一)

    基于ASP.NET MVC的热插拔模块式开发框架(OrchardNoCMS)介绍(一) Orchard CMS是针对CMS开发的,对于很多开发需求来说,内容管理这块儿可能并不需要,而需要它的模块式开发 ...

  4. [转]编译 JavaScriptCore For iOS

    from: http://phoboslab.org/log/2011/06/javascriptcore-project-files-for-ios github: https://github.c ...

  5. [google面试CTCI] 1-4.判断两个字符串是否由相同字符组成

    [字符串与数组] Q:Write a method to decide if two strings are anagrams or not 题目:写一个算法来判断两个字符串是否为换位字符串.(换位字 ...

  6. C# list distinct操作

    使用代理实现对C# list distinct操作   范型在c#编程中经常使用,而经常用list 去存放实体集,因此会设计到对list的各种操作,比较常见的有对list进行排序,查找,比较,去重复. ...

  7. Orchard网上商店模块

    从头开始编写一个Orchard网上商店模块(1) - 介绍 原文地址:http://skywalkersoftwaredevelopment.net/blog/writing-an-orchard-w ...

  8. python(学习之路一)

    ''' Created on 2013-5-3 @author: lixingle ''' #输出的练习 length=3 width=4; area=length*width print(area) ...

  9. SqlBulkCopy实现大容量数据快速插入数据库中

    一般情况下,我们手写sqlhelper类,在此类中定义一个数据插入到数据库的一个方法.将数据库连接密封在using()的语句中.using显示了Idispose接口.可以及时释放数据库连接资源.代码如 ...

  10. IOS7学习之路二(处理ios6到ios7后UITableView的两个显示问题)

    1.在ios6开发的项目,当用ios7的虚拟机显示的时候会出现UINavigationItem遮挡TableView的问题: 下面是对比显示效果: 我的处理方法是: 在UITableViewContr ...