通过广播实现简单数据交换前后台数据交换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>


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

ASP.NET中使用JSON方便实现前台与后台的数据交换

一、前台向后台请求数据 在页面加载时,有时需要对一些表单进行初始化,此时可以利用JQuery的 get 函数向后台发起异步请求: //初始化函数 function initSettings()...

sprngMVC和json实现前台和后台数据交换

springMVC框架下JQuery传递并解析Json数据 分类: 【综合问题】2014-04-23 10:20 7238人阅读 评论(6) 收藏 举报 json作为一种轻量级的数据交...

ASP.NET中使用JSON方便实现前台与后台的数据交换

一、前台向后台请求数据 在页面加载时,有时需要对一些表单进行初始化,此时可以利用JQuery的 get 函数向后台发起异步请求:...

extjs与后台数据交换的一些测试类

  • 2009年08月01日 10:46
  • 4.67MB
  • 下载

flash与后台数据交换方法整理2-Flash Remting篇

二、Flash Remoting   Flash Remoting这种数据接口是四个之中效率最高的!   其优点:     1.支持数据类型比较多(Converting from applica...

flash与后台数据交换方法整理3-WebService篇

三、WebService       个人觉得WebService的数据访问速度,仅次于Remoting,但WebService是一种通用型的接口,一般服务端技术都支持的!       WebSe...

flash与后台数据交换方法整理1-LoadVars篇

最近有一些网友总是询问flash与后台数据交互的问题,因此我就做了一些总结和整理,也想方便大家了!   目前据我所知,Flash与后台数据交互共有下列几种方法(如果你觉得不全,你可告知一下,我会添...

iOS开发中大部分App的网络数据交换是基于HTTP协议的。本文将简单介绍在Swift中使用HTTP进行网络请求的几种方法。

iOS开发中大部分App的网络数据交换是基于HTTP协议的。本文将简单介绍在Swift中使用HTTP进行网络请求的几种方法。 注意:网络请求完成后会获得一个NSData类型的返回数据,如果数据格...

Struts2整合jQuery和JSON进行简单的异步数据交换入门教程

最近做项目的时候,需要用到JSON和jQuery进行异步数据交换 在网上查了好久,搞了一天多才写出来,所以拿出来和大家分享一下 好了,废话到此为止 1. 搭建Struts2运行环境 引...

JSON 在Ajax数据交换中的简单运用

这篇文章是从网络上摘的,感觉乱乱的,就整理了下。写的时候,也遇到了些问题,就是 prototype.js和json.js的冲突. 关于冲突,请参考我的另一个博文prototype.js 和json.j...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:通过广播实现简单数据交换前后台数据交换BroadcastReceiver
举报原因:
原因补充:

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