工作原理是通过封装一个service启动的一个线程产生的随机数封装到intent对象传递给Activity,Activity接受到后讲结果输出到屏幕。

java的代码:

package jm.out;
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.view.View;//引入相关包
import android.view.View.OnClickListener;//引入相关包
import android.widget.Button;//引入相关包
import android.widget.TextView;//引入相关包
//继承自Activity的子类
public class IntentBroadcastActivity extends Activity {
 public static final int CMD_STOP_SERVICE = 0;
 Button btnStart;//开始服务Button对象应用
 Button btnStop;//停止服务Button对象应用
 TextView tv;//TextView对象应用
 DataReceiver dataReceiver;//BroadcastReceiver对象
 @Override
    public void onCreate(Bundle savedInstanceState) {//重写onCreate方法
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);//设置显示的屏幕
        btnStart = (Button)findViewById(R.id.btnStart);
        btnStop = (Button)findViewById(R.id.btnStop);
        tv = (TextView)findViewById(R.id.tv);
        btnStart.setOnClickListener(new OnClickListener() {//为按钮添加点击事件监听  
   @Override
   public void onClick(View v) {//重写onClick方法
    Intent myIntent = new Intent(IntentBroadcastActivity.this, jm.out.MyService.class);
    IntentBroadcastActivity.this.startService(myIntent);//发送Intent启动Service
   }
  });
        btnStop.setOnClickListener(new OnClickListener() {//为按钮添加点击事件监听 
   @Override
   public void onClick(View v) {//重写onClick方法
    Intent myIntent = new Intent();//创建Intent对象
    myIntent.setAction("wyf.wpf.MyService");
    myIntent.putExtra("cmd", CMD_STOP_SERVICE);
    sendBroadcast(myIntent);//发送广播
   }
  });
    } 
 private class DataReceiver extends BroadcastReceiver{//继承自BroadcastReceiver的子类
  @Override
  public void onReceive(Context context, Intent intent) {//重写onReceive方法
   double data = intent.getDoubleExtra("data", 0);
   tv.setText("Service的数据为:"+data);   
  }  
 }
 @Override
 protected void onStart() {//重写onStart方法
  dataReceiver = new DataReceiver();
  IntentFilter filter = new IntentFilter();//创建IntentFilter对象
  filter.addAction("wyf.wpf.Sample_3_6");
  registerReceiver(dataReceiver, filter);//注册Broadcast Receiver
  super.onStart();
 }
 @Override
 protected void onStop() {//重写onStop方法
  unregisterReceiver(dataReceiver);//取消注册Broadcast Receiver
  super.onStop();
 }
} service类: package jm.out; import android.app.Service;//引入相关包
import android.content.BroadcastReceiver;//引入相关包
import android.content.Context;//引入相关包
import android.content.Intent;//引入相关包
import android.content.IntentFilter;//引入相关包
import android.os.IBinder;//引入相关包
//继承自Service的子类
public class MyService extends Service{
 CommandReceiver cmdReceiver;
 boolean flag;
 @Override
 public void onCreate() {//重写onCreate方法
  flag = true;
  cmdReceiver = new CommandReceiver();
  super.onCreate();
 }
 @Override
 public IBinder onBind(Intent intent) {//重写onBind方法
  // TODO Auto-generated method stub
  return null;
 }
 @Override
 public int onStartCommand(Intent intent, int flags, int startId) {//重写onStartCommand方法
  IntentFilter filter = new IntentFilter();//创建IntentFilter对象
  filter.addAction("jm.out.MyService");
  registerReceiver(cmdReceiver, filter);//注册Broadcast Receiver
  doJob();//调用方法启动线程
  return super.onStartCommand(intent, flags, startId);
 }
 //方法:
 public void doJob(){
  new Thread(){
   public void run(){
    while(flag){
     try{//睡眠一段时间
      Thread.sleep(1000);
     }
     catch(Exception e){
      e.printStackTrace();
     }
     Intent intent = new Intent();//创建Intent对象
     intent.setAction("jm.out.IntentBroadcastActivity");
     intent.putExtra("data", Math.random());
     sendBroadcast(intent);//发送广播
    }    
   }
   
  }.start();
 } 
 private class CommandReceiver extends BroadcastReceiver{//继承自BroadcastReceiver的子类
  @Override
  public void onReceive(Context context, Intent intent) {//重写onReceive方法
   int cmd = intent.getIntExtra("cmd", -1);//获取Extra信息
   if(cmd == IntentBroadcastActivity.CMD_STOP_SERVICE){//如果发来的消息是停止服务    
    flag = false;//停止线程
    stopSelf();//停止服务
   }
  }  
 }
 @Override
 public void onDestroy() {//重写onDestroy方法
  this.unregisterReceiver(cmdReceiver);//取消注册的CommandReceiver
  super.onDestroy();
 } 
} xml配置: <?xml version="1.0" encoding="utf-8" ?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
  <Button android:id="@+id/btnStart"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:text="启动服务" />
  <Button android:id="@+id/btnStop"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:text="停止服务" />
  <TextView android:id="@+id/tv"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:text="等待来自Service的数据" />
  </LinearLayout> androidmanifest.xml的配置:   <?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="wyf.wpf" android:versionCode="1" android:versionName="1.0">
-<application android:icon="@drawable/icon" android:label="@string/app_name">
-<activity android:name=".Sample_3_6" android:label="@string/app_name">
-<intent-filter>
  <action android:name="android.intent.action.MAIN" />
  <category android:name="android.intent.category.LAUNCHER" />
  </intent-filter>
  </activity>
-<service android:name=".MyService" android:process=":remote">
-<intent-filter>
 <actionandroid:name="wyf.wpf.MyService" />
  </intent-filter>
  </service>
  </application>
  <uses-sdk android:minSdkVersion="7" />
  </manifest>
要注意的是红色代码,只有这样才可以让service在activity退出后还能运行,保证了主线程停止,service还能在后台运行。

intent 和 Broadcast Receiver之间的通信的更多相关文章

  1. Intent实现Activity组件之间的通信

    今天讲解的是使用Intent实现Activity组件之间的通信. 一.         使用Intent显式启动Activity,Activity1àActivity2 1.             ...

  2. Android应用程序组件之间的通信Intent和IntentFilter

    Android应用程序的基本组件,这些基本组建除了Content Provider之外,几乎全部都是依靠Intent对象来激活和通信的. 下面介绍Intent类,并通过例子来说明Intent一般用法 ...

  3. Android中Intent具体解释(二)之使用Intent广播事件及Broadcast Receiver简单介绍

    通过第一篇的解说,我们已经看到了怎样使用Intent来启动新的应用程序组件,可是实际上他们也能够使用sendBroadcast方法来在组件间匿名的广播消息. 作为一个系统级别的消息传递机制,Inten ...

  4. Android中BroadCast与Activity之间的通信

    在看本文之前,假设你对于Android的广播机制不是非常了解.建议先行阅读我转载的一篇博文:图解 Android 广播机制. 因为本案例比較简单,故直接在此贴出代码,不做过多的阐述. 先上效果截图: ...

  5. 使用Broadcast实现android组件之间的通信 分类: android 学习笔记 2015-07-09 14:16 110人阅读 评论(0) 收藏

    android组件之间的通信有多种实现方式,Broadcast就是其中一种.在activity和fragment之间的通信,broadcast用的更多本文以一个activity为例. 效果如图: 布局 ...

  6. 使用Broadcast实现android组件之间的通信

    android组件之间的通信有多种实现方式,Broadcast就是其中一种.在activity和fragment之间的通信,broadcast用的更多本文以一个activity为例. 效果如图: 布局 ...

  7. Android学习笔记八:用Broadcast Receiver跨进程(跨app)通信

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/7515194.html 在前面介绍四大组件的时候提到了可以对外部事件进行过滤的Broadcast Receive ...

  8. Broadcast Intent & Broadcast Receiver

    当Android系统发生某种状况,必须通知所有程序进行处理时,例如电量不足等,可利用Broadcast Intent对象的功能来进行信息广播. 运行机制包括两部:送出Intent对象的程序:监听广播信 ...

  9. 我的Android 4 学习系列之Intent 和 Broadcast Reciever

    目录 Intent 简介 使用隐式和显式Intent启动Activity.子Acitivity和Service 使用Linkify 使用Broadcast Intent 广播事件 使用 Pending ...

随机推荐

  1. Nginx 高级配置-变量使用

    Nginx 高级配置-变量使用 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.  nginx的变量可以在配置文件中引用,作为功能判断或者日志等场景使用,变量可以分为内置变量和自定义变 ...

  2. centos7静黙安装Oracle11.2.0软件响应文件oracle_install.rsp

    oracle.install.responseFileVersion=/oracle/install/rspfmt_dbinstall_response_schema_v11_2_0 oracle.i ...

  3. update mantis_bug_table

    update mantis_bug_table set mantis_bug_table.original_due_date=mantis_bug_table.due_date ,) ,);

  4. python的continue和pass的区别

    a = 'pythyon' i = 2 for element in a: if element == 'y': pass i = 3 else: print(element+str(i)) 结果: ...

  5. JanusGraph入门,schema及数据模型

    5.Schema和数据建模 每个JanusGraph都有一个schema,该schema由edge labels,property keys,和vertex组成.JanusGraph schema可以 ...

  6. JDOJ 2982: 最大连续子段和问题

    洛谷 P1115 最大子段和 洛谷传送门 JDOJ 2982: 最大连续子段和问题 JDOJ传送门 题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大. 输入格式 第一行是一个正整数NN, ...

  7. Java 字符流读写文件

    据说,java读写文件要写很多,贼麻烦,不像c艹,几行代码就搞定.只能抄抄模板拿来用了. 输入输出流分字节流和字符流.先看看字符流的操作,字节转化为字符也可读写. 一.写入文件 1.FileWrite ...

  8. Shell里的特殊符号

    Shell里的特殊符号: (1)单引号: 由单引号括起来的符号都作为普通字符处理,他们都失去了特殊意义. (2)双引号: 除美元符号($).倒引号.反斜线(\)仍保留特殊含义外,其余符号都作为普通字符 ...

  9. ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于GPRS模块(Air202,SIM800)AT指令TCP透传方式,MQTT通信控制升级

    实现功能概要 这节和上一节的功能一样(只不过上节是利用Wi-Fi模块,这节是利用GPRS模块) 用户程序里面加入MQTT通信,执行用户程序的时候, 通过接收MQTT的升级命令实现升级. 凡是可以实现M ...

  10. 洛谷P1531 I Hate It题解

    题目背景 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少.这让很多学生很反感. 题目描述 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的 ...