上面学习了线程通过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. 【MS SQL】通过执行计划来分析SQL性能

    原文:[MS SQL]通过执行计划来分析SQL性能 如何知道一句SQL语句的执行效率呢,只知道下面3种: 1.通过SQL语句执行时磁盘的活动量(IO)信息来分析:SET STATISTICS IO O ...

  2. Mysql基础之字符集与乱码

    原文:Mysql基础之字符集与乱码 Mysql的字符集设置非常灵活 可以设置服务器默认字符集 数据库默认字符集 表默认字符集 列字符集 如果某一个级别没有指定字符集,则继承上一级. 以表声明utf8为 ...

  3. 安卓推送——个推服务端api使用误区

    首先你需要在个推开放着平台上注册你的应用,以及获得以下几个必要的值APPID |APPKEY | MASTERSECRET,本文假设你已经完成上述步骤以及完成客户端SDK的集成. 原理 个推服务端ap ...

  4. FileWriter字符输出流和FileReader字符输出流

    //FileWriter public class FileWriterDemo { //字符流:适用于文本文件,以字符为单位进行操作,经常和缓冲流一起使用 /**  * 字符流操作步骤:  * 1. ...

  5. Effective C++(12) 复制对象时要复制每一个成员

    问题聚焦: 负责拷贝的两个操作:拷贝构造函数和重载赋值操作符. 一句话总结,确保被拷贝对象的所有成员变量都做一份拷贝. Demo   void logCall(const std::string&am ...

  6. 常用排序算法的python实现和性能分析

    常用排序算法的python实现和性能分析 一年一度的换工作高峰又到了,HR大概每天都塞几份简历过来,基本上一天安排两个面试的话,当天就只能加班干活了.趁着面试别人的机会,自己也把一些基础算法和一些面试 ...

  7. NET系列文章

    NET系列文章 由于博主今后一段时间可能会很忙(准备出书:<.NET框架设计—模式.配置.工具>,外加换了新工作),所以博客会很少更新: 在最近一年左右时间里,博主各种.NET技术类型的文 ...

  8. JAVA学习:多态

    多态:可以理解为事物存在的多种体现形态.   人:男人,女人 动物:猫,狗. 猫 x = new 猫(); 动物 x = new 猫()   1,多态的体现 父类的引用指向了自己的子类对象. 父类的引 ...

  9. RPC(Remote Procedure Call Protocol)

    远程过程调用协议: 1.调用客户端句柄:执行传送参数 2.调用本地系统内核发送网络消息 3.消息传送到远程主机 4.服务器句柄得到消息并取得参数 5.执行远程过程 6.执行的过程将结果返回服务器句柄 ...

  10. 长乐集训2012.7.11 happy(指针技巧的运用)

    题1  Noip的快乐 (happy.pas/c/cpp) [问题描述] 终于到了一年一度的Noip比赛了,多么令人期待和兴奋的一天!其实,人们最高兴的还不是遇见老朋友,而是结交新朋友.可是结交新的朋 ...