Android 消息传递之Bundle的使用——实现object对象传输(二)
上面学习了线程通过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对象传输(二)的更多相关文章
- Android 消息传递之Bundle的使用——实现object对象传输(一)
UI更新--消息处理massage 对于安卓内部消息得处理,实现对界面UI得更新操作,不能在线程中直接更新ui.至于为什么不能,在学习安卓开发的时候,在线程中操作会使程序崩溃. 为什么,可以看看诸多大 ...
- Android消息传递之基于RxJava实现一个EventBus - RxBus
前言: 上篇文章学习了Android事件总线管理开源框架EventBus,EventBus的出现大大降低了开发成本以及开发难度,今天我们就利用目前大红大紫的RxJava来实现一下类似EventBus事 ...
- Android消息传递之EventBus 3.0使用详解
前言: 前面两篇不仅学习了子线程与UI主线程之间的通信方式,也学习了如何实现组件之间通信,基于前面的知识我们今天来分析一下EventBus是如何管理事件总线的,EventBus到底是不是最佳方案?学习 ...
- Android消息传递之Handler消息机制
前言: 无论是现在所做的项目还是以前的项目中,都会遇见线程之间通信.组件之间通信,目前统一采用EventBus来做处理,在总结学习EventBus之前,觉得还是需要学习总结一下最初的实现方式,也算是不 ...
- Android学习笔记_46_Android的intent之间Object、List、List<Object>和全局变量数据的传递(Parcelable Serializable)
转http://blog.csdn.net/pku_android/article/details/7456305 一.传递List<String>和List<Integer> ...
- Android消息传递之组件间传递消息
前言: 上篇学习总结了Android通过Handler消息机制实现了工作线程与UI线程之间的通信,今天来学习一下如何实现组件之间的通信.本文依然是为学习EventBus做铺垫,有对比才能进步,今天主要 ...
- Android开发中Bundle用法包裹数据(转)
Android开发中Bundle用法包裹数据 Bundle的经典用法,包裹数据放入Intent中,目的在于传输数据. SDK 里是这样描述: A mapping from String values ...
- ReactNative生成android平台的bundle文件命令
ReactNative生成android平台的bundle文件命令 2016年11月03日 23:23:28 阅读数:4869 注:如果assets文件没有正确生成,需要手机创建或授权 网上的其它的很 ...
- Android消息传递之EventBus 3.0
Android消息传递之EventBus 3.0使用详解 http://www.cnblogs.com/whoislcj/p/5595714.html EventBus 3.0进阶:源码及其设计模式 ...
随机推荐
- jquery插件推荐
jQuery 是继 prototype 之后又一个优秀的 Javascript 框架.其宗旨是—写更少的代码,做更多的事情.它是轻量级的 js 库(压缩后只有21k) ,这是其它的 js 库所不及的, ...
- ASP.NET MVC IOC 之Ninject攻略
ASP.NET MVC IOC 之Ninject攻略 一.为什么要使用Ninject? 很多其它类型的IOC容器过于依赖配置文件,老是配置,总感觉有点不爽,而且要使用assembly-qualifie ...
- windows 8以上找回开始菜单
步骤如下: 右击任务栏,选择工具栏——新建工具 在工具栏---新建工具栏的输入框中输入,”C:\ProgramData\Microsoft\Windows\Start Menu\Programs,然后 ...
- SZU:B47 Big Integer I
Judge Info Memory Limit: 32768KB Case Time Limit: 10000MS Time Limit: 10000MS Judger: Normal Descrip ...
- 引用动态链接库Dll文件 引用失败 未能添加对HD.dll的引用。请确保此文件可访问并且是一个有效的程序集或COM组件
出现这个问题,是由于使用了非.NET 的动态链接库,需要注册 方法如下: 1.在搜索程序和文件中使用 regsvr32 "D:\Projects\8.01.01.03-重庆大足\lib\Va ...
- avalon1.0正式发布
2013年最后的收成:avalon1.0正式发布 大半年前我就说过,MVVM是前端究极的解决方案,因此之后我大多数时间都在折腾avalon,成立了专门的QQ群与感兴趣的一起讨论.感谢第一批吃螃蟹的人, ...
- MongoDB:利用官方驱动改装为EF代码风格的MongoDB.Repository框架 六:支持多数据库操作
本次主要内容:修正MongoDB.Repository框架对多数据库的支持. 在之前的五篇文章中对MongoDB.Repository框架做了简单的介绍是实现思路.之前是考虑MongoDB.Repos ...
- OAuth的一个.NET开源实现
从编译DotNetOpenAuth中学到的程序集强签名知识 OAuth的一个.NET开源实现,官方网站:http://dotnetopenauth.net/ . 从GitHub签出DotNetOpen ...
- 基于SUSE Linux做NFS文件挂载
linux文件挂载其实和windows文件共享原理差不多,由主机配置一个共享目录,客户端机器可以通过网络访问该共享目录. 下面以SUSE11为例子,简要描述下NFS文件挂载过程: 一.主机端(主机IP ...
- 3分钟教你做一个iphone手机浏览器
3分钟教你做一个iphone手机浏览器 第一步:新建一个Single View工程: 第二步:新建好工程,关闭arc. 第三步:拖放一个Text Field 一个UIButton 和一个 UIWebV ...