学习了Activity组件后,这里再学习下另一个组件Broadcast Receiver组件。这里学习下自定义的Broadcast Receiver。通过按键自己发送广播,然后自己接收广播。新建MyBroadcastReceiver,代码如下:

package com.example.jared.broadcasttest;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast; /**
* Created by jared on 16/2/12.
*/
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "Received from MyBroadcastReceiver",
Toast.LENGTH_LONG).show();
}
}

然后在AndroidManifest中添加receiver标签:

 <receiver android:name=".MyBroadcastReceiver">
<intent-filter>
<action android:name="com.example.broadcasttest.MY_BROADCAST" />
</intent-filter>
</receiver>

这里定义了消息为com.example.broadcasttest.MY_BROADCAST的广播。

修改activity_main.xml如下,添加一个button控件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
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:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="com.example.jared.broadcasttest.MainActivity"> <Button
android:id="@+id/send"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Send myBroadcast"
android:textAllCaps="false"/> </RelativeLayout>

然后修改MainActivity,添加如下:

        send = (Button)findViewById(R.id.send);
send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
sendBroadcast(intent);
}
});

这里用到了Intent,当按下按钮的时候,就会sendBroadcast一条名为com.example.broadcasttest.MY_BROADCAST的广播。

接着运行看下效果:

其实广播是跨进程的,不同进程间也就是不同的app之间是可以互相传递的。这里我们已经安装好了这个Broadcasttest的app,下面再新建一个app,用来接收这条消息。新建BroadcastTest2。

然后添加OtherBroadcastReceiver,代码如下:

package com.example.jared.broadcasttest2;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast; /**
* Created by jared on 16/2/12.
*/
public class OtherBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "receive by OtherBroadcastReceiver!",
Toast.LENGTH_LONG).show();
}
}

添加AndroidManifest代码如下:

  <receiver android:name=".OtherBroadcastReceiver">
<intent-filter>
<action android:name="com.example.broadcasttest.MY_BROADCAST" />
</intent-filter>
</receiver>

然后运行代码,按home键退到后台,接着运行上面已经安装好的app,然后运行,效果如下:

 
    

可以看到两条广播都收到了。而发送的就一次。接着我们来学习下广播接收的优先级,这里只需要修改两个地方,一个是发送的函数,sendBroadcast函数替换成sendOrderedBroadcast,然后在AndroidManifest中添加android:priority属性。然后可以通过abortBroadcast方法将广播截断。还是看下例子吧。

修改BroadcastTest工程的代码,如下:

send = (Button)findViewById(R.id.send);
send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
sendOrderedBroadcast(intent, null);
}
});

修改接收到的广播后截断广播,代码如下:

public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "Received from MyBroadcastReceiver",
Toast.LENGTH_LONG).show();
abortBroadcast();
}
}

修改AndroidManifest添加优先级:

        <receiver android:name=".MyBroadcastReceiver">
<intent-filter android:priority="100">
<action android:name="com.example.broadcasttest.MY_BROADCAST" />
</intent-filter>
</receiver>

然后运行查看效果,只有当前的这个app收到广播,而另一个app没有收到任何广播。也达到了我们的期望。

接下去学习下本地的广播,所谓本地,就是只有当前的app可以收到广播,其他的app是收不到这个广播的。 新建LocalBroadcast工程,编写代码如下:

package com.example.jared.localbroadcast;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast; public class MainActivity extends AppCompatActivity { private IntentFilter intentFilter;
private LocalReceiver localReceiver;
private LocalBroadcastManager localBroadcastManager;
private Button send; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); intentFilter = new IntentFilter();
intentFilter.addAction("com.example.localbroadcast.LOCAL_BROADCAST");
localReceiver = new LocalReceiver();
localBroadcastManager = localBroadcastManager.getInstance(this);
localBroadcastManager.registerReceiver(localReceiver, intentFilter); send = (Button)findViewById(R.id.send);
send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent("com.example.localbroadcast.LOCAL_BROADCAST");
localBroadcastManager.sendBroadcast(intent);
}
}); } @Override
protected void onDestroy() {
super.onDestroy();
localBroadcastManager.unregisterReceiver(localReceiver);
} class LocalReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "LocalReciver received ", Toast.LENGTH_LONG).show();
}
}
}

这里注册了一个LocalBroadcastManager,名字为com.example.localbroadcast.LOCAL_BROADCAST。通过intentfilter动态注册。内部类LocalReceiver继承BroadcastReceiver,并重写了onReceive方法,在该方法中通过Toast消息反馈下收到广播的提醒。

运行效果如下:

关于Broadcast Receiver就基本学习到这里了,先学习基础,以后再深入学习。

明天就上班了,还好过年也学习了一些知识,得加快学完第一行代码,然后继续深入学习,早日可以胜任android开发的工作,早日去做自己想做的事情。

附:参考《第一行代码》

Android开发学习之路--Broadcast Receiver之初体验的更多相关文章

  1. Android开发学习之路--数据持久化之初体验

    上班第一天,虽然工作上处于酱油模式,但是学习上依旧不能拉下,接着学习android开发吧,这里学习数据持久化的 知识. 其实数据持久化就是数据可以保存起来,一般我们保存数据都是以文件,或者数据库的形式 ...

  2. Android开发学习之路--百度地图之初体验

    手机都有gps和网络,通过gps或者网络可以定位到自己,然后通过百度,腾讯啊之类的地图可以显示我们的地理位置.这里学习下百度地图的使用.首先就是要申请开发者了,这个详细就不多讲了.http://dev ...

  3. Android开发学习之路--Content Provider之初体验

    天气说变就变,马上又变冷了,还好空气不错,阳光也不错,早起上班的车上的人也不多,公司来的同事和昨天一样一样的,可能明天会多一些吧,那就再来学习android吧.学了两个android的组件,这里学习下 ...

  4. Android开发学习之路--网络编程之初体验

    一般手机都是需要上网的,一般我们的浏览器就是个webview.这里简单实现下下功能,先编写Android的layout布局: <?xml version="1.0" enco ...

  5. Web开发学习之路--Springmvc+Hibernate之初体验

    本来想继续学习android的,可是用到了android和服务器交互,需要实现个login的功能,苦于没有这么个环境,那就只能自己来搭建了.既然已经基本上可以玩web了,那么接下来使用web开源的框架 ...

  6. Android开发学习之路--网络编程之xml、json

    一般网络数据通过http来get,post,那么其中的数据不可能杂乱无章,比如我要post一段数据,肯定是要有一定的格式,协议的.常用的就是xml和json了.在此先要搭建个简单的服务器吧,首先呢下载 ...

  7. Android开发学习之路--Activity之初体验

    环境也搭建好了,android系统也基本了解了,那么接下来就可以开始学习android开发了,相信这么学下去肯定可以把android开发学习好的,再加上时而再温故下linux下的知识,看看androi ...

  8. Android开发学习之路-RecyclerView滑动删除和拖动排序

    Android开发学习之路-RecyclerView使用初探 Android开发学习之路-RecyclerView的Item自定义动画及DefaultItemAnimator源码分析 Android开 ...

  9. Android开发学习之路--基于vitamio的视频播放器(二)

      终于把该忙的事情都忙得差不多了,接下来又可以开始good good study,day day up了.在Android开发学习之路–基于vitamio的视频播放器(一)中,主要讲了播放器的界面的 ...

随机推荐

  1. JQuery插件的写法和规范

    首先,在具体说明编写插件之前,我们先假定一个使用场景:有一个HTML页面(或.aspx页面),页面上放置了一个5行3列的表格,即:<table></table>标记,具体代码如 ...

  2. Spring中@Autowired与@Resource的区别

    1.@Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上. 2.@Autowired默认按类型装配(这个注解是属业spring的),默认情况下必 ...

  3. 注解式Schedule配置定时任务

    @Component public class ScheduledTasks { @Autowired private ActivityService activityService; // 1000 ...

  4. 继承自 DevExpress 17.2 的自定义控件如何在工具箱显示

    最近把DevExpress版本从13.1升级到了17.2,结果发现继承自DevExpress的自定义控件居然在工具箱中消失了,弄了两天还是没有任何头绪,部分自定义Dev控件可以正常出现,但大部分自定义 ...

  5. exp和imp的工作原理

    --1.exp和imp的输入都是名字和值对: 如:exp parameter_name=value 或exp parameter_name=(value1,value2,value3..) --2.e ...

  6. django之数据库orm

    一.数据库的配置 1 django默认支持sqlite,mysql, oracle,postgresql数据库. <1>sqlite django默认使用sqlite的数据库,默认自带sq ...

  7. MongoDB Limit与Skip方法

    MongoDB Limit() 方法 如果你需要在MongoDB中读取指定数量的数据记录,可以使用MongoDB的Limit方法,limit()方法接受一个数字参数,该参数指定从MongoDB中读取的 ...

  8. JavaScript for 循环

    循环可以将代码块执行指定的次数. JavaScript 循环 如果您希望一遍又一遍地运行相同的代码,并且每次的值都不同,那么使用循环是很方便的. 我们可以这样输出数组的值: 一般写法: documen ...

  9. 关于云Linux部署tomcat服务器(Maven的多模块war包)

    博主的运行环境: 电脑系统: Linux mint 18 JDK版本: java version "1.8.0_171" Maven版本:  Apache Maven 3.5.3 ...

  10. Netty 4源码解析:服务端启动

    Netty 4源码解析:服务端启动 1.基础知识 1.1 Netty 4示例 因为Netty 5还处于测试版,所以选择了目前比较稳定的Netty 4作为学习对象.而且5.0的变化也不像4.0这么大,好 ...