通过广播实现简单数据交换前后台数据交换BroadcastReceiver

原创 2015年11月17日 17:00:37

通过对BroadcastReceiver的继承,实现从前台传递两个数到后台计算完成后传回前台。从前台onCreate方法中传送数据过去,再在onReceive方法接收后台返回的数据并且通过handler传回主线程再显示,实现图为:


前台java代码为:

package com.pangbao.PangIntentService;

import java.util.Random;


import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {
	Handler handler=null;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		TextView tvA=(TextView) findViewById(R.id.tv_a_id);
		TextView tvB=(TextView) findViewById(R.id.tv_b_id);
		final TextView tvC=(TextView) findViewById(R.id.tv_sum_id);
		Random random = new Random();
		//循环传递100组随机数到后台
		for (int i = 0; i < 100; i++) {
			int a=random.nextInt(11);
			int b=random.nextInt(11);
			//界面显示数据
			tvA.setText(a+"");
			tvB.setText(b+"");
			//获取意图
			Intent service = new Intent(this, PIntentService.class);
			//数据传递,注意键值对要一一对应
			service.putExtra("KEYINT",
					new int[] {a ,b });
			//启动后台服务
			startService(service);
		}
		// for(int i=0;i<100;i++){
		// int a=random.nextInt(11);
		// int b=random.nextInt(11);
		// tvA.setText(a+"");
		// tvB.setText(b+"");
		// try {
		// Thread.sleep(2000);
		// } catch (InterruptedException e) {
		// // TODO Auto-generated catch block
		// e.printStackTrace();
		// }
		// }
		//实例化BroadcastReceiver对象
		PangBroadcast receiver=new PangBroadcast();
		//创建广播接收
		IntentFilter filter=new IntentFilter();
		//频道接收器
		filter.addAction("ACTION");
		//启动接收,开启接收功能
		registerReceiver(receiver, filter);
		//消息机制,更新界面,不会阻塞主线程
		handler=new Handler(){

			@Override
			public void handleMessage(Message msg) {
				// TODO Auto-generated method stub
				super.handleMessage(msg);
				//过滤
				if(msg.what==0){
					int data=(Integer) msg.obj;
					tvC.setText(data+"");
					Log.d("前台获得", data+"");
					Toast.makeText(MainActivity.this, "和为:"+data, Toast.LENGTH_SHORT).show();
				}
				
			}
			
		};
	}
	//广播机制
	//重写两个方法onReceive和onDestroy
	public class PangBroadcast extends BroadcastReceiver{

		@Override
		public void onReceive(Context context, Intent intent) {
			//获取服务端发送的广播数据
			int data=intent.getIntExtra("KEYBROAD", -1);
			//handler消息机制传送数据
			Message msg=handler.obtainMessage();
			msg.what=0;
			msg.obj=data;
			handler.sendMessage(msg);
		}
		
	}
	
	@Override
	protected void onDestroy() {
		super.onDestroy();
		//关闭服务
		Intent service = new Intent(this, PIntentService.class);
		stopService(service);
	}

}
后台java代码:
package com.pangbao.PangIntentService;

import android.app.IntentService;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
//该服务自己动实现线程的系列化,不会出现阻塞主线程onHandleIntent
public class PIntentService extends IntentService {
	//固定写法,super里面可以随意传字符串
	public PIntentService() {
		super("PIntentService");
	}

	public int index = 0;

//	@Override
//	public void onCreate() {
//		// TODO Auto-generated method stub
//		super.onCreate();
//	}

	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {

		return super.onStartCommand(intent, flags, startId);
	}

	@Override
	public IBinder onBind(Intent intent) {
		return null;
	}

	@Override
	protected void onHandleIntent(Intent intent) {
		//接收前台消息,
		int data[]=intent.getIntArrayExtra("KEYINT");
		Log.d("后台服务", data[0]+"+"+data[1]);
		//匹配广播,
		Intent intentBroad=new Intent();
		intentBroad.setAction("ACTION");
		//发送广播到前台
		intentBroad.putExtra("KEYBROAD", (data[0]+data[1]));
		sendBroadcast(intentBroad);
		try {			
			Thread.sleep(2000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
//		final int id = index++;
//
//		Log.d("线程启动", id + "");
//
//		try {
//			Thread.sleep(1000);
//		} catch (InterruptedException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		}
//		Log.d("线程结束", id + "");

	}

}

xml界面代码:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.pangbao.PangIntentService.MainActivity" >

    <TextView
        android:id="@+id/tv_a_id"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:text="@string/hello_world" />
    <TextView
        android:id="@+id/tv_b_id"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:text="@string/hello_world" />
    <TextView
        android:id="@+id/tv_sum_id"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:text="@string/hello_world" />

</LinearLayout>


版权声明:本文为博主原创文章,未经博主允许不得转载。

使用存储过程实现数据的交换

使用存储过程实现数据的交换  USE [student] GO /****** Object:  StoredProcedure [dbo].[sp_MenuTree_Sort]    Scri...
  • guoyang9108
  • guoyang9108
  • 2011年11月30日 19:46
  • 289

几种数据交换格式

主要包括以下三种: · XML · JSON · YAML   XML     XML是当前编程中最为流行的数据交换格式,拥有跨平台、跨...
  • u013700340
  • u013700340
  • 2014年07月30日 13:29
  • 1912

公共数据交换解决方案

公共数据交换解决方案要实现的目标:l         为整个项目系统提供统一的数据交换标准、规范及开发平台;l         为各个系统之间、异构数据库之间、不同网络系统之间的信息提供整合手段;l ...
  • sanwawa
  • sanwawa
  • 2006年06月04日 21:03
  • 3778

[MFC] 编辑框间数据交换 [大三TJB_708]

高手莫笑! 基于VS2010MFC的对话框项目。包括可编辑框属性设置,数据由可编辑框流向成员变量,数据由成员变量流向可编辑框。控件与控件的数据交换核心在控件与对应数据成员变量之间的数据交换。首先,类向...
  • misskissC
  • misskissC
  • 2013年01月22日 18:43
  • 5996

数据交换平台的架构设计

说到架构设计,不敢妄自牛逼。只能默默地向Linux致敬,没有强大的linux系统,我们做的架构设计,做的程序一天说不定挂几次。...
  • san1156
  • san1156
  • 2014年10月29日 12:53
  • 2621

各个层使用的是哪个数据交换设备

网络互联设备:集线器(物理层) 网桥 (数据链路层) 交换机(数据链路层) 路由器(网络层) 网关 (高层) 交换机(Switch)是工作在第二层即数据链路层的一种设备,它根据MAC地址对数据帧进行...
  • ws891033655
  • ws891033655
  • 2014年02月26日 22:41
  • 1177

MFC-对话框与数据交换

       对话框是非常重要的一种窗体,就我看过的应用,除了MDI程序,对话框比文档视图框架用得更多。原因大概有两个,首先对话框可以利用资源编辑器来编辑,这就有了一点快速开发的感觉,尽管比真正的快速...
  • linzhengqun
  • linzhengqun
  • 2007年12月10日 10:12
  • 6014

数据交换之前后端数据格式转换(一)

前后端之间数据交换常用json格式,调用webService进行数据交换xml占了许多。所以今天要记录的是我们通过传入的json或者xml 转换为对象,进行一系列数据计算,再拼接成json或者xml...
  • qq_31663903
  • qq_31663903
  • 2016年10月18日 00:05
  • 872

当前较为流行的数据交换格式

简要概述当前最为流行的三种数据交换格式(JSON、XML、YAML)。
  • Unique_Sirius
  • Unique_Sirius
  • 2017年04月19日 18:54
  • 813

交换机的广播风暴

网吧行业竞争的加剧,出现了一些规模比较大的网吧。目前在网吧行业内,百台以上的网吧已经随处可见了。由于网吧在进行网络建设时,缺乏专业的网络技术支持,使得网吧的网络故障频繁出现。在网吧的网络故障中,由于网...
  • u010486124
  • u010486124
  • 2014年06月17日 19:58
  • 968
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:通过广播实现简单数据交换前后台数据交换BroadcastReceiver
举报原因:
原因补充:

(最多只允许输入30个字)