android入门到熟练(五)---广播

1.广播类型:标准广播和有序广播。标准广播是异步广播在广播发出之后所有接收器几乎会同一时刻接收到,没有先后顺序,效率高,但无法被截断。有序广播则是同步广播,同一时刻只能一个接收器接收这条消息,等执行完毕后才会继续传递,优先级高的接收器可以先接受,并且可以截断该广播传递。

动态注册案例分析:网络变化提醒

构建响应类:

class  NetworkChangeReciver extends BroadcastReceiver{
        @Override
        public void onReceive(Context context,Intent intent){
            ConnectivityManager connectivityManager=(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo networkInfo=connectivityManager.getActiveNetworkInfo();
            if ((networkInfo!=null&&networkInfo.isAvailable()))
            {
                Toast.makeText(context,"网络可用",Toast.LENGTH_SHORT).show();
            }
            else
            {
                Toast.makeText(context,"网络不可用",Toast.LENGTH_SHORT).show();
            }

}

创建活动时注册响应,并且分类过滤消息

private IntentFilter intentFilter;//过滤消息
    private NetworkChangeReciver networkChangeReciver;

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

intentFilter=new IntentFilter();
        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
        networkChangeReciver=new NetworkChangeReciver();
        registerReceiver(networkChangeReciver,intentFilter);

}

销毁监听器

@Override
    protected void onDestroy()
    {
        super.onDestroy();
        unregisterReceiver(networkChangeReciver);
    }

最后在配置文件中加入权限

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

静态注册案例分析(好处是可以在不启动程序的情况监听广播)开机启动

定义一个监听类

public class BootCompleteReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context,Intent intent)
    {
        Toast.makeText(context,"启动完成",Toast.LENGTH_SHORT).show();
    }
}

修改android配置文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.zhb.test2" >
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

<application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <receiver android:name="com.example.zhb.Com.BootCompleteReceiver">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
        </receiver>

<activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

2.发送标准广播和有序广播

标准广播定义一个接收广播类

public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context,Intent intent)
    {
        String value=intent.getStringExtra("key");
        Toast.makeText(context,value,Toast.LENGTH_SHORT).show();
    }
}

配置配置文件信息

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

发送带数据的消息

Button btnBRCTestOne = (Button) findViewById(R.id.btnBRCTestOne);
        btnBRCTestOne.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
                intent.putExtra("key","我是广播消息哦!");
                sendBroadcast(intent);
            }
        }

有序消息:只需改变一行代码

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.brocasttest);

Button btnBRCTestOne = (Button) findViewById(R.id.btnBRCTestOne);
        btnBRCTestOne.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
                intent.putExtra("key","我是广播消息哦!");
                //sendBroadcast(intent);
                sendOrderedBroadcast(intent,null);
            }
        }
       );
    }

设置优先接收权限

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

截断广播继续传播

public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context,Intent intent)
    {
        String value=intent.getStringExtra("key");
        Toast.makeText(context,value,Toast.LENGTH_SHORT).show();
        abortBroadcast();
    }
}

本地广播:之前的所有广播都是全局广播,即发出的广播可以被任何程序接收,并且也可以接受来至任何程序的广播。这样很容易引起安全性,比如数据被别的程序监听到,或者别的程序不停的发送垃圾广播。因此就有了本地广播机制。发出的广播只能在本应用程序内部传递,接收器也只能接收来自本应用程序发出的广播。本地广播是不能通过静态方法在配置文件中注册的。

public class BrocastTest extends Activity {

private IntentFilter intentFilter;//框架的过滤器
    private LocalReceiver localReceiver;//自定义的接收器
    private LocalBroadcastManager localBroadcastManager;//框架的本地广播管理器

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.brocasttest);

localBroadcastManager=LocalBroadcastManager.getInstance(this);//获取实例
        Button btnBRCTestOne = (Button) findViewById(R.id.btnBRCTestOne);
        btnBRCTestOne.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //发送本地广播
                Intent intent1=new Intent("com.example.broadcasttest.LOCAL_BROADCAST");
                localBroadcastManager.sendBroadcast(intent1);

            }
        }
       );

intentFilter=new IntentFilter();
        intentFilter.addAction("com.example.broadcasttest.LOCAL_BROADCAST");
        localReceiver=new LocalReceiver();
        localBroadcastManager.registerReceiver(localReceiver,intentFilter);

    }

@Override
    protected void onDestroy()
    {
        super.onDestroy();
        localBroadcastManager.unregisterReceiver(localReceiver);
    }

class  LocalReceiver extends BroadcastReceiver
    {
        @Override
        public void onReceive(Context context,Intent intent)
        {
            Toast.makeText(context,"接收到本地广播",Toast.LENGTH_SHORT).show();
        }
    }
}

时间: 2024-12-06 23:24:22

android入门到熟练(五)---广播的相关文章

android入门到熟练(一)

1.andro系统架构:Linux内核层(提供驱动),系统运行库层和android运行时库(提供C/C++库的主要特性,如SQLite,OpenGL,Webkit等和Dalvik虚拟机),应用框架层,应用层. 2.android四大组件:活动(Activity界面能看到的一切).服务(Service后台运行即使用户退出了应用也会继续运行).广播接收器(BroadcastReceiver可以接收外来广播消息)和内容提供器(Content Provider使程序与程序之间共享数据成为可能). 3.项

android入门到熟练(二)----活动

1.活动创建对于每一个后端java类(继承至Activity或者ActionBarActivity)代码都有一个方法需要被重写[onCreate], 在此方法中可以加载界面资源文件或者绑定元素事件. protected void onCreate(final Bundle savedInstanceState)//一般savedInstanceState为null,除非在返回界面时已经加载了值. 此处展示savedInstanceState不为空的时候获取其中保存的临时数据填充界面 if(sav

android入门到熟练(三)----UI界面

1.TextView 以下只是一部分属性,还有很多属性需要在用到时候再说 <TextView android:textSize="24sp"//文字大小 android:textColor="#00ff00"//文字颜色 android:gravity="center"//排列方向 android:id="@+id/txtMainOne" android:text="这是一个正规的活动界面" andr

Android入门:广播发送者与广播接收者

参考: Android入门:广播发送者与广播接收者 - xiazdong - CSDN博客http://blog.csdn.net/xiazdong/article/details/7768807 一.广播发送者&广播接收者介绍 1.广播接收者 广播接收者简单地说就是接收广播意图的Java类,此Java类继承BroadcastReceiver类,重写: public void onReceive(Context context,Intent intent),其中intent可以获得传递的数据:

【Android的从零单排开发日记】之入门篇(五)——Android四大组件之Service

这几天忙着驾校考试,连电脑都碰不到了,今天总算告一段落了~~Service作为Android的服务组件,默默地在后台为整个程序服务,辅助应用与系统中的其他组件或系统服务进行沟通.它跟Activity的级别差不多,但不能自己运行只能后台运行.service可以在很多场合的应用中使用,比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,再或者在后台记录你地理信息位置的改变等等, 总之服务总是藏在后台的. ps:Service运行在主线程中的,所

&lt;Android基础&gt;(五) 广播机制 Part 1

1)接收系统广播:a.动态注册监听网络变化 b.静态注册实现开机启动 2)发送自定义广播:a.发送标准广播 b.发送有序广播 3)使用本地广播 第五章 5.1 广播机制 Android中的每个程序都可以对自己感兴趣的广播进行注册.发送广播的方法借助Intent,接收广播的方法则为广播接收器(Broadcast Receiver). 广播可分为两种. 1.标准广播 (Normal broadcasts):完全异步执行的广播,在广播发出之后,所有广播几乎会在同一时刻接收到这条广播信息,没有任何先后顺

Android入门(八)广播

原文链接:http://www.orlion.ga/572/ 一.广播机制 Android中的每个应用程序都可以对自己感兴趣的广播进行注册,这样该程序就只会接收到自己所关心的广播内容,这些广 播可能是来自于系统的,也可能是来自于其他应用程序的.Android提供了一套完整的 API,允许应用程序自由地发送和接收广播.发送广播的方法需要借助Intent.而接收广播的方法则需要引入一个新的概念,广播接收器(Broadcast Receiver) 广播可以分为两种类型: 标准广播:是一种完全异步的广播

Android入门:Activity四种启动模式

Android入门:Activity四种启动模式 一.启动模式介绍 启动模式简单地说就是Activity启动时的策略,在AndroidManifest.xml中的标签的android:launchMode属性设置: 启动模式有4种,分别为standard.singleTop.singleTask.singleInstance: 讲解启动模式之前,有必要先讲解一下“任务栈”的概念; 任务栈 每个应用都有一个任务栈,是用来存放Activity的,功能类似于函数调用的栈,先后顺序代表了Activity

Android入门教程之我见

真正的从安卓入门学习到实际工作也差不多一年时间了,也做了几个项目.在这期间经历了一开始学习Android的基本知识后仍旧无从下手,不知道如何开始开发一个app,到现在也开始学会注意Android架构的设计优化,学会开始阅读源码,渐渐地向Android更高级的知识进阶. 首先要感谢一下Google把Android开源了,加上Android开发人员十分活跃且富有分享精神,这才让网上关于Android的资料十分丰富,往往遇到一个问题都能从网上找到答案,这对于初学者特别是靠自学没有人带的情况下提供很多的