大四实习准备5_android广播机制

2015-5-1

android 广播机制

5.1简介

分为标准广播(Normal broadcasts)(无先后顺序,几乎同时接收,不可截断)和有序广播(Ordered broadcasts)(有先后顺序,可以截断)两种。

5.2接收系统广播

广播接收器对感兴趣的广播进行注册,这样就能监听到对应的广播,并在内部处理相应的逻辑。

注册广播的方式有两种,分别为在代码中注册(动态注册)(缺点:必须在程序启动之后才能接收到广播,因为注册的逻辑是写在onCreat()方法中的)和在AndroidManifest.xml(静态注册)中注册。

创建广播接收器的方法为:新建一个继承自BroadcastReceiver的类,并重写父类的onReceive()方法就行了,监听到广播时对应的处理逻辑就在onReceive()方法中。

5.2.1通过动态注册的方法实现监听网络变化

IntentFilter:组件告诉Android系统自己乐意接收哪些隐式intent(显式的Intent会直接传送到目标组件)

http://blog.csdn.net/today520/article/details/7000048

 1 package com.example.broadcasttest;
 2
 3 import android.app.Activity;
 4 import android.content.BroadcastReceiver;
 5 import android.content.Context;
 6 import android.content.Intent;
 7 import android.content.IntentFilter;
 8 import android.net.ConnectivityManager;
 9 import android.net.NetworkInfo;
10 import android.os.Bundle;
11 import android.view.Menu;
12 import android.view.MenuItem;
13 import android.widget.Toast;
14
15 public class MainActivity extends Activity {
16     private IntentFilter intentFilter;
17     private NetworkChangeReceiver  networkChangeReceiver;
18     @Override
19     protected void onCreate(Bundle savedInstanceState) {
20         super.onCreate(savedInstanceState);
21         setContentView(R.layout.activity_main);
22         intentFilter = new IntentFilter();
23         intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
24         networkChangeReceiver = new NetworkChangeReceiver();
25         registerReceiver(networkChangeReceiver,intentFilter);
26     }
27
28     @Override
29     protected void onDestroy() {
30         // TODO Auto-generated method stub
31         super.onDestroy();
32         unregisterReceiver(networkChangeReceiver);
33     }
34
35     class NetworkChangeReceiver extends BroadcastReceiver{//非静态内部类
36
37         @Override
38         public void onReceive(Context arg0, Intent arg1) {
39             // TODO Auto-generated method stub
40             ConnectivityManager connectivityManager = (ConnectivityManager)
41                     getSystemService(Context.CONNECTIVITY_SERVICE);
42             NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
43             if( networkInfo != null && networkInfo.isAvailable() ){
44                 Toast.makeText(arg0, "network is availbale", Toast.LENGTH_SHORT).show();
45             }else{
46                 Toast.makeText(arg0, "network is unavailbale", Toast.LENGTH_SHORT).show();
47             }
48         }
49
50     }
51 }

MainActivity.class

需在在AndroidManifest.xml中声明

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

5.2.2通过静态注册监听开机启动广播

//开机启动广播只能用静态注册来监听(?)

 1 package com.example.broadtest2;
 2
 3 import android.content.BroadcastReceiver;
 4 import android.content.Context;
 5 import android.content.Intent;
 6 import android.widget.Toast;
 7
 8 public class BootCompleted extends BroadcastReceiver{
 9
10     @Override
11     public void onReceive(Context arg0, Intent arg1) {
12         // TODO Auto-generated method stub
13             Toast.makeText(arg0, "开机啦",Toast.LENGTH_SHORT).show();
14     }
15 }

BootCompleted.class 广播接收器

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
 3     package="com.example.broadtest2"
 4     android:versionCode="1"
 5     android:versionName="1.0" >
 6
 7     <uses-sdk
 8         android:minSdkVersion="8"
 9         android:targetSdkVersion="20" />
10
11     <application
12         android:allowBackup="true"
13         android:icon="@drawable/ic_launcher"
14         android:label="@string/app_name"
15         android:theme="@style/AppTheme" >
16         <activity
17             android:name=".MainActivity"
18             android:label="@string/app_name" >
19             <intent-filter>
20                 <action android:name="android.intent.action.MAIN" />
21
22                 <category android:name="android.intent.category.LAUNCHER" />
23             </intent-filter>
24         </activity>
25         <receiver
26             android:name=".BootCompleted" >
27             <intent-filter>
28                  <action android:name="android.intent.action.BOOT_COMPLETED" />
29             </intent-filter>
30         </receiver>
31     </application>
32     <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
33 </manifest>

AndroidManifest.xml 这里需对开机启动做权限声明&静态注册广播

这里MainActivity.class中不用写跟广播有关系的内容。

5.3发送自定义广播

5.3.1发送标准广播

1 Intent intent = new Intent("lalala");//自定义的广播名
2 intent.putExtra("key", "get lalala BroadCast~");//可以附带些数据
3 sendBroadcast(intent);

例子:采用静态注册的方法,点击按钮发送一个自定义的广播,MainActivity中就是发送了下广播,没有直接涉及到diy_broadcastReceiver.class。

 1 package com.example.broadcasttest;
 2
 3 import android.app.Activity;
 4 import android.content.Intent;
 5 import android.os.Bundle;
 6 import android.view.Menu;
 7 import android.view.MenuItem;
 8 import android.view.View;
 9 import android.view.View.OnClickListener;
10 import android.widget.Button;
11
12 public class MainActivity extends Activity {
13
14     Button bt;
15     @Override
16     protected void onCreate(Bundle savedInstanceState) {
17         super.onCreate(savedInstanceState);
18         setContentView(R.layout.activity_main);
19         bt = (Button) findViewById(R.id.button1);
20         bt.setOnClickListener(new OnClickListener() {
21
22             @Override
23             public void onClick(View arg0) {
24                 // TODO Auto-generated method stub
25                 Intent intent = new Intent("lalala");
26                 intent.putExtra("key", "get lalala BroadCast~");
27                 sendBroadcast(intent);
28             }
29         });
30     }
31 }

MainActivity.class

 1 package com.example.broadcasttest;
 2
 3 import android.content.BroadcastReceiver;
 4 import android.content.Context;
 5 import android.content.Intent;
 6 import android.widget.Toast;
 7
 8 public class diy_broadcastReceiver extends BroadcastReceiver{
 9
10     @Override
11     public void onReceive(Context arg0, Intent arg1) {
12         // TODO Auto-generated method stub
13         String s = arg1.getExtras().getString("key");//或者arg1.getStringExtra("key");
14         Toast.makeText(arg0, s, Toast.LENGTH_SHORT).show();
15     }
16
17 }

diy_broadcastReceiver.class

 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     tools:context="${relativePackage}.${activityClass}" >
 6
 7     <TextView
 8         android:id="@+id/textView1"
 9         android:layout_width="wrap_content"
10         android:layout_height="wrap_content"
11         android:text="@string/hello_world" />
12
13     <Button
14         android:id="@+id/button1"
15         android:layout_width="match_parent"
16         android:layout_height="wrap_content"
17         android:layout_alignParentLeft="true"
18         android:layout_below="@+id/textView1"
19         android:layout_marginTop="19dp"
20         android:text="Send BroadCast" />
21
22 </RelativeLayout>

activity_main.xml

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
 3     package="com.example.broadcasttest"
 4     android:versionCode="1"
 5     android:versionName="1.0" >
 6
 7     <uses-sdk
 8         android:minSdkVersion="8"
 9         android:targetSdkVersion="20" />
10
11     <application
12         android:allowBackup="true"
13         android:icon="@drawable/ic_launcher"
14         android:label="@string/app_name"
15         android:theme="@style/AppTheme" >
16         <activity
17             android:name=".MainActivity"
18             android:label="@string/app_name" >
19             <intent-filter>
20                 <action android:name="android.intent.action.MAIN" />
21
22                 <category android:name="android.intent.category.LAUNCHER" />
23             </intent-filter>
24         </activity>
25         <receiver
26             android:name=".diy_broadcastReceiver" >
27             <intent-filter>
28                 <action android:name="lalala" />
29             </intent-filter>
30         </receiver>
31     </application>
32
33 </manifest>

AndroidManifest.xml

别的应用,如果静态注册了同样的广播,也会进行相应的操作。

问题:

一个广播接收器注册了多个广播,怎样根据广播来源的不同,进行不同的操作?

5.3.2发送有序广播

//..........

时间: 2024-10-11 13:28:57

大四实习准备5_android广播机制的相关文章

Android中使用广播机制退出多个Activity

谷歌百度一下,Android中退出多个Activity的方法,大家讨论的很多. 在实习的时候,看到公司的项目退出多个Activity,是采用LinkedList方法,毕业设计的时候,也参照了那种方法.完成之时,无意在网上看到的可以使用广播机制退出Activity.看了一部分人的博客.文章等教程,发现也是摘抄的“很随便”,说的不详细,或不能实现. 看了他们的意思,写了demo,大家看看吧.主要代码如下:(不方便看的直接下整个工程) 为了代码的简洁性,抽取出一个基类BaseActivity(自定义的

转: 从现实生活中理解什么是广播机制

来自:http://blog.sina.com.cn/s/blog_714338950100p4km.html 一听到广播我们第一感觉就会联想到小时候村里面的广播,每逢村里有什么活动都是通过广播发送的.收听收音机也是一种广播,在收音机中有很多个广播电台,每个广播电台播放的内容都不相同.接收广播时广播(发送方)并不在意我们(接收方)接收到广播时如何处理.好比我们收听交通电台的广播,电台中告诉我们现在在交通状况如何,但它并不关心我们接收到广播时做如何做出处理,这不是广播应该关心的问题,OK,到这里我

Android广播机制(转)

1.Android广播机制概述 Android广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的就是广播接收者(广播接收器).广播作为Android组件间的通信方式,可以使用的场景如下:1.同一app内部的同一组件内的消息通信(单个或多个线程之间): 2.同一app内部的不同组件之间的消息通信(单个进程): 3.同一app具有多个进程的不同组件之间的消息通信: 4.不同app之间的组件之间消息通信: 5.Android系统在特定情况下与App之间的消息通

转载__广播机制

http://www.cnblogs.com/RMBP975/archive/2013/03/12/2955733.html Android广播机制简介 Android中的广播跟传统意义上的电台广播类似,广播机制最大的特点就是发送方并不关心接收方是否接到数据,也不关心接收方是如何处理数据的.另外,广播可以被不只一个应用程序所接收,当然也可能不被任何应用程序所接收. Android广播机制的三要素 Android广播机制包含三个基本要素:广播(Broadcast) - 用于发送广播:广播接收器(B

Android学习总结——本地广播机制

为了简单解决广播的安全性问题,Android引入了一套本地广播机制,使用这个机制发出的广播只能在程序的内部进行传递,只能接受来自本应用程序发出的广播.否则当我们发送一些携带关键数据的广播可能被截获,一些恶意程序也可能向我们的广播接收器中发送各种垃圾广播. 用法如下:(主要就是使用LocalBroadcastManager来对广播进行管理,并提供注册广播和发送广播的方法). package com.example.xch.localbroadcast; import android.content

详解广播机制,Broadcast Receiver,Android进阶必备知识(一)。

直奔主题,关于广播的一些定义什么的我觉得只要是一名合格的初级android开发这都知道吧,我下面要做的就是怎么去使用broadcast receiver. 1.怎么去监听系统广播? Android系统有很多内置的系统广播:电话,短信,时间,地区,电池电量,网络变化等等...那么我们怎么去在我们的应用中实现监听呢?下面我们以监听手机网络发生改变的广播进行监听,都知道广播有两种注册方式,在这里我使用的代码注册的方式,为的是能更好的去理解广播运行机制.在代码中注册一定要注意在你使用完毕的时候一定要反注

安卓开发_深入理解广播机制

一.Broadcast(广播) 在Android中,有一些操作完成以后,会发送广播,比如说发出一条短信,或打出一个电话,如果某个程序接收了这个广播,就会做相应的处理.这个广播跟我们传统意义中的电台广播有些相似之处.之所以叫做广播,就是因为它只负责“说”而不管你“听不听”,也就是不管你接收方如何处理.另外,广播可以被不只一个应用程序所接收,当然也可能不被任何应用程序所接收. (百度百科) 二.BroadcastReceiver(广播接收器) 1.自定义BroadcastReceiver 自定义广播

Android总结篇系列:Android广播机制

1.Android广播机制概述 Android广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的就是广播接收者(广播接收器).广播作为Android组件间的通信方式,可以使用的场景如下:1.同一app内部的同一组件内的消息通信(单个或多个线程之间): 2.同一app内部的不同组件之间的消息通信(单个进程): 3.同一app具有多个进程的不同组件之间的消息通信: 4.不同app之间的组件之间消息通信: 5.Android系统在特定情况下与App之间的消息通

android: 广播机制

记得在我上学的时候,每个班级的教室里都会装有一个喇叭,这些喇叭都是接入到学校 的广播室的,一旦有什么重要的通知,就会播放一条广播来告知全校的师生.类似的工作机 制其实在计算机领域也有很广泛的应用,如果你了解网络通信原理应该会知道,在一个 IP 网络范围中最大的 IP 地址是被保留作为广播地址来使用的.比如某个网络的 IP 范围是 192.168.0.XXX,子网掩码是 255.255.255.0,那么这个网络的广播地址就是 192.168.0.255. 广播数据包会被发送到同一网络上的所有端口,