工作原理是通过封装一个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. Congigure SSL in StoreFront

    StoreFront SSL Requirements StoreFront website must be up and running in http Joined to the domain C ...

  2. 搭建Ceph分布式存储

    环境: 系统 IP地址 主机名(登录用户) 承载角色 Centos 7.4 64Bit 1611 10.199.100.170 dlp(yzyu) ceph-client(root) admin-no ...

  3. 实现Mac主机上的Docker容器中的图形界面显示(运行GUI应用)

    我有一个需求: 一方面,我需要在 Docker 容器环境下运行应用(因为有些环境在 Mac 下很难安装配置,并且希望环境干净隔离). 另一方面,容器中的应用又需要进行图形界面的显示. 由于 Docke ...

  4. pypi 打包分发

    打包Python项目 本教程将指导您如何打包一个简单的Python项目.它将向您展示如何添加必要的文件和结构来创建包,如何构建包以及如何将其上载到Python包索引. 一个简单的项目 本教程使用一个名 ...

  5. 17-C#笔记-类

    1. 构造函数.析构函数 修饰词的作用域仅一行. 类的默认访问标识符是 internal,成员的默认访问标识符是 private. using System; namespace LineApplic ...

  6. 学习:CC断点

    断点介绍: shark恒老师说有四种说法,但是其实都是相同的 第一个读法:普通断点 第二个读法:F2断点 第三个读法:INT3断点( int3其实就是汇编指令 ) 第四个读法:CC断点 (CC其实就是 ...

  7. Struts CRUD

    Struts CRUD 利用struts完成增删改查 思路: 1.导入相关的pom依赖(struts.自定义标签库的依赖) 2.分页的tag类导入.z.tld.完成web.xml的配置 3.dao层去 ...

  8. hdu5111 树链剖分,主席树

    hdu5111 链接 hdu 思路 先考虑序列上如何解决. 1 3 2 5 4 1 2 4 5 3 这个序列变成 1 2 3 4 5 1 3 5 5 2 是对答案没有影响的(显然). 然后查询操作\( ...

  9. ECMAScript6之Class

    1.Class的基本语法 1.1简介 基本上,ES6 的class可以看作只是一个语法糖,它的绝大部分功能,ES5 都可以做到,新的class写法只是让对象原型的写法更加清晰.更像面向对象编程的语法而 ...

  10. Debian使用小计

    1. Debian无法apt install debian安装完成后,如果运行apt install,提示 Media change: please insert the disc labeled ' ...