- 浏览: 465379 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
wwwjiandan:
我现在遇到的问题是将Activity设置为非全屏,且andro ...
Android中软键盘弹出时底部菜单上移问题 -
zjhdreams:
求下载链接
Android 9Patch (NinePatch) -
wtjandjay:
受教了 .......
从程序员到项目经理 -
mr_zhang2011:
将博客搬至CSDN -
fyc0109:
为什么我传过去的值, 有的都不对呢, 顺序也是一样的.就是获得 ...
Android Parcelable序列化自定义类集合在Activity间传递
一:Android 广播的生命周期
一个广播接收者有一个回调方法:void onReceive(Context curContext, Intent broadcastMsg)。当一个广播消息到达接收者是,Android调用它的onReceive()方法并传递给它包含消息的Intent对象。广播接收者被认为仅当它执行这个方法时是活跃的。当onReceive()返回后,它是不活跃的。
有一个活跃的广播接收者的进程是受保护的,不会被杀死。但是系统可以在任何时候杀死仅有不活跃组件的进程,当占用的内存别的进程需要时。
这带来一个问题,当一个广播消息的响应时费时的,因此应该在独立的线程中做这些事,远离用户界面其它组件运行的主线程。如果onReceive()衍生线程然后返回,整个进程,包括新的线程,被判定为不活跃的(除非进程中的其它应用程序组件是活跃的),将使它处于被杀的危机。解决这个问题的方法是onReceive()启动一个服务,及时服务做这个工作,因此系统知道进程中有活跃的工作在做。
Broadcast Receive为广播接收器,它和事件处理机制类似,只不过事件的处理机制是程序组件级别的,广播处理机制是系统级别的。
Broadcast Receiver用于接收并处理广播通知(broadcast announcements)。多数的广播是系统发起的,如地域变换、电量不足、来电来信等。程序也可以播放一个广播。程序可以有任意数量的 broadcast receivers来响应它觉得重要的通知。broadcast receiver可以通过多种方式通知用户:启动activity、使用NotificationManager、开启背景灯、振动设备、播放声音等,最典型的是在状态栏显示一个图标,这样用户就可以点它打开看通知内容。
通常我们的某个应用或系统本身在某些事件(电池电量不足、来电来短信)来临时会广播一个Intent出去,我们可以利用注册一个Broadcast Receiver来监听到这些Intent并获取Intent中的数据。
二:Android 广播应用
android中,不同进程之间传递信息要用到广播,可以有两种方式来实现。
第一种方式:在Manifest.xml中注册广播,是一种比较推荐的方法,因为它不需要手动注销广播(如果广播未注销,程序退出时可能会出错)。
具体实现在Manifest的application中添加:
<receiver android:name=".mEvtReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
上面两个android:name分别是广播名和广播的动作(这里的动作是表示系统启动完成),如果要自己发送一个广播,在代码中为:
Intent i = new Intent("android.intent.action.BOOT_COMPLETED");
sendBroadcast(i);
这样,广播就发出去了,然后是接收。接收可以新建一个类,继承至BroadcastReceiver,也可以建一个BroadcastReceiver的实例,然后得写onReceive方法,实现如下:
protected BroadcastReceiver mEvtReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals("android.intent.action.BOOT_COMPLETED")) {
//Do something
}
}
};
完整实例:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="android.basic.lesson21"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="8" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".MainBroadcastReceiver"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name=".HelloBroadReciever">
<intent-filter>
<action android:name="android.basic.lesson21.Hello88" />
</intent-filter>
</receiver>
</application>
</manifest>
package android.basic.lesson21;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainBroadcastReceiver extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button b1 = (Button) findViewById(R.id.Button01);
b1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 定义一个intent
Intent intent = new Intent().setAction("android.basic.lesson21.Hello88")
.putExtra("yaoyao","yaoyao is 189 days old ,27 weeks -- 2010-08-10");
System.out.println("sendBroadcast");
// 广播出去
sendBroadcast(intent);
}
});
}
}
package android.basic.lesson21;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
public class HelloBroadReciever extends BroadcastReceiver {
public HelloBroadReciever(){
System.out.println("HelloBroadReciever");
}
// 如果接收的事件发生
@Override
public void onReceive(Context context, Intent intent) {
// 对比Action决定输出什么信息
if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) {
Log.i("HelloBroadReciever","BOOT_COMPLETED !!!!!!!!!!!!!!!!!!!!!!!!!");
}
if (intent.getAction().equals("android.basic.lesson21.Hello88")) {
Log.i("HelloBroadReciever","Say Hello to Yaoyao !!!!!!!!!!!!!!!!!!!!!!!!!");
Log.i("HelloBroadReciever", intent.getStringExtra("yaoyao"));
}
Log.i("HelloBroadReciever","onReceive**********");
// 播放一首音乐
// MediaPlayer.create(context, R.raw.babayetu).start();
}
}
第二种方式,直接在代码中实现,但需要手动注册注销,实现如下:(以短信接收为例)
IntentFilter filter = new IntentFilter();
filter.addAction("android.provider.Telephony.SMS_RECEIVED");
registerReceiver(mEvtReceiver, filter); //这时注册了一个recevier ,名为mEvtReceiver,然后同样用上面的方法以重写onReceiver,
最后在程序的onDestroy中要注销广播,实现如下:
@Override
public void onDestroy() {
super.onDestroy();
unregisterReceiver(mPlayerEvtReceiver);
}
以短信接收为例:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="android.basic.lesson21"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="5" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".MainBroadcastReceiver"
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>
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
</manifest>
增加一个短信权限<uses-permission android:name="android.permission.RECEIVE_SMS"/>
package android.basic.lesson21;
import android.app.Activity;
import android.content.IntentFilter;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class MainBroadcastReceiver extends Activity {
/** Called when the activity is first created. */
HelloBroadReciever br;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button b1 = (Button) findViewById(R.id.Button01);
b1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.i("click","OnClick");
br=new HelloBroadReciever();
IntentFilter filter=new IntentFilter();
filter.addAction("android.provider.Telephony.SMS_RECEIVED");
registerReceiver(br, filter);
}
});
}
@Override
public void onDestroy() {
super.onDestroy();
unregisterReceiver(br);
Log.i("br","onDestroy");
}
}
package android.basic.lesson21;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
public class HelloBroadReciever extends BroadcastReceiver {
public HelloBroadReciever(){
System.out.println("HelloBroadReciever");
}
// 如果接收的事件发生
@Override
public void onReceive(Context context, Intent intent) {
// 对比Action决定输出什么信息
if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) {
Log.i("HelloBroadReciever","SMS_RECEIVED !!!!!!!!!!!!!!!!!!!!!!!!!");
}
Log.i("HelloBroadReciever","onReceive**********");
}
}
先按开始键注册广播,然后在Emulator Control设置发短信如图:
按Send,这时HelloBroadReciever的onReceive响应
输出SMS_RECEIVED !!!!!!!!!!!!!!!!!!!!!!!!!
onReceive**********"信息。
一个广播接收者有一个回调方法:void onReceive(Context curContext, Intent broadcastMsg)。当一个广播消息到达接收者是,Android调用它的onReceive()方法并传递给它包含消息的Intent对象。广播接收者被认为仅当它执行 这个方法时是活跃的。当onReceive()返回后,它是不活跃的。
有一个活跃的广播接收者的进程是受保护的,不会被杀死。但是系统可以在任何时候杀死仅有不活跃组件的进程,当占用的内存别的进程需要时。
这带来一个问题,当一个广播消息的响应时费时的,因此应该在独立的线程中做这些事,远离用户界面其它组件运行的主线程。如果onReceive()衍生线程然后返回,整个进程,包括新的线程,被判定为不活跃的(除非进程中的其它应用程序组件是活跃的),将使它处于被杀的危机。解决这个问题的方法是onReceive()启动一个服务,及时服务做这个工作,因此系统知道进程中有活跃的工作在做。
发表评论
-
android Log.isLoggable方法的使用
2014-06-06 15:35 3006android 动态控制logcat日志开关,通过Log. ... -
View not attached to window manager
2013-01-10 11:55 1081View not attached to window man ... -
代码设置android:icon,android:label
2013-01-05 15:26 7998requestWindowFeature( Window.F ... -
Android项目为一个apk设置多个ICON图标和执行入口
2013-01-05 12:13 3881Android开发中,一个工程对应一个AndroidManif ... -
Intent跳转到系统应用中的拨号界面、联系人界面、短信界面及其他
2012-12-04 12:15 01:调用系统发送短信界面 Uri smsT ... -
Android 源码目录结构详解
2012-11-22 17:20 1470这是Android2.1的源代码的 ... -
如何获取android源代码
2012-07-10 17:50 2742如何获取android源代码 研究 ... -
Android uses-permission大全
2012-06-12 17:33 1072android.permission.ACCESS_CHE ... -
Android 应用程序基础(Application Fundamentals)
2012-05-23 17:42 1272Android 应用程序基础(Application Fun ... -
转Android 音乐频谱实现
2012-02-18 23:35 0最近由于需要实现音乐频谱,所以今天就为大家普及一下。 这里实现 ... -
android VideoView本工程mp4文件
2012-01-09 18:42 2707最近在做一个demo,要求播放视频,记录一下。使用的是Vid ... -
关于android播放mp3与歌词同步问题收集
2012-01-09 17:57 1691关于android播放mp3与歌词同步问题收集,有时间再试。 ... -
android使用MediaPlayer播放音乐文件时遇到的问题
2012-01-09 17:38 18386把mp3文件放在Assets文件夹里,然后用MediaPlay ... -
android资源目录---assets与res/raw的不同
2012-01-05 11:49 2382android资源目录---assets与 ... -
Android 的cpu硬盘 内存 网络设置 系统信息 硬件信息
2012-01-04 10:56 1621转载 http://www.cnmsdn.com/html/2 ... -
使用 Android Compatibility Package 来简化开发工作
2012-01-04 10:12 1436转载 http://www.cnmsdn.com/html/2 ... -
Android 9Patch (NinePatch)
2011-12-26 16:06 45411:介绍 NinePatch图片以*.9.png结尾,和普通 ... -
Windows平台下Android源码的下载
2011-12-21 11:06 1263Windows平台下Android源码的下载 ... -
改变MenuItem默认背景
2011-12-07 19:58 1447@Override public boolean onCre ... -
Android横屏竖屏切换
2011-11-10 18:20 107转载 http://blog.csdn.net/leesido ...
相关推荐
综上所述,BroadcastReceiver在Android开发中扮演着重要角色,它的生命周期管理和正确使用是确保应用能及时、有效地响应广播的关键。同时,理解源码可以帮助我们更好地定制和优化BroadcastReceiver的行为。
`BroadcastReceiver`的生命周期由`onReceive()`方法定义。当BroadcastReceiver接收到广播时,系统会回调这个方法。由于系统可能在同一时间处理多个广播,因此`onReceive()`的执行必须非常快,通常不超过10秒,否则...
在Android系统中,BroadcastReceiver(广播接收者)是四大组件之一,它扮演着接收系统或应用广播消息的重要角色。BroadcastReceiver使得应用可以在不运行的情况下,响应系统或其它应用发出的事件,例如系统启动完成...
在Android系统中,BroadcastReceiver(广播接收者)是四大组件之一,它负责监听系统或应用程序发布的广播事件。BroadcastReceiver能够使应用在不运行的情况下对特定事件做出响应,从而实现后台运行的功能。本教程将...
1. **BroadcastReceiver的生命周期**:BroadcastReceiver的生命周期非常短暂,主要包含`onReceive()`方法。当接收到广播时,系统会创建BroadcastReceiver实例并调用该方法。因此,所有的处理逻辑都应该在这个方法中...
Service的生命周期包括startService()和bindService()两种启动方式,分别对应不同的生命周期回调。 BroadcastReceiver用于接收系统或应用广播事件,如网络状态改变、系统重启等。当接收到广播时,BroadcastReceiver...
BroadcastReceiver的主要生命周期包含两个方法:onReceive()和onFinish()。其中,onReceive()是核心方法,当BroadcastReceiver接收到匹配的广播时,系统会调用这个方法。在这个方法中,你需要完成相应的处理逻辑,如...
- 发送广播有两种方式:显式广播和隐式广播。显式广播指定接收者的类名,只能被指定的BroadcastReceiver接收;隐式广播不指定接收者,任何注册了相应IntentFilter的BroadcastReceiver都可以接收。 5. **示例代码**...
BroadcastReceiver是Android系统中的一个重要组件,它用于接收并响应系统或应用广播事件。在这个"BroadcastReceiver使用demo"中,我们将深入探讨BroadcastReceiver的工作原理、如何创建与注册、以及如何发送和接收...
BroadcastReceiver的生命周期非常短暂,onReceive()方法执行完毕后,Receiver就会被销毁。因此,所有的处理工作必须在这个方法内快速完成,避免阻塞UI线程。 此外,理解权限管理对于BroadcastReceiver的使用也非常...
BroadcastReceiver是Android...了解其两种注册方式及其生命周期,对于构建能够灵活响应系统和自定义事件的应用至关重要。在实际开发中,我们需要根据需求选择合适的注册方式,以确保BroadcastReceiver能正确地工作。
BroadcastReceiver的生命周期由onReceive()方法定义,当接收到匹配的广播时,系统会回调此方法,开发者在此处理广播事件。由于该方法执行时间有限(通常不超过10秒),因此不适合进行耗时操作,否则可能导致ANR...
在Android移动应用开发中,BroadcastReceiver扮演着至关重要的角色,它是Android系统中一种核心的组件,用于接收并响应系统或应用程序发出的广播消息。BroadcastReceiver允许应用程序在后台运行,即使用户并未直接与...
在Android应用开发中,BroadcastReceiver(广播接收器)是一个至关重要的组件,用于监听系统或应用程序发布的广播消息。BroadcastReceiver能够接收并处理系统级别的广播事件,如设备启动、网络连接变化等,同时也...
在Android系统中,BroadcastReceiver是一种用于接收系统广播事件的组件,它可以监听系统或应用程序发出的各种广播意图(Intent)。本主题将深入探讨如何实现动态注册BroadcastReceiver以接收短信。动态注册相比静态...
理解Activity的生命周期和Intent的传值机制对于Android开发者来说至关重要。 Activity的生命周期分为三个主要阶段:启动(Start)、运行(Running)和销毁(Destroy)。在启动过程中,Activity会经历onCreate()、...
在Android系统中,BroadcastReceiver(广播接收者)是四大组件之一,它负责监听并响应系统或应用程序发布的广播意图。BroadcastReceiver允许应用在不运行的情况下接收到消息,从而实现后台通信和事件处理。在这个...
广播的发送也有两种方式:无序广播和有序广播。 - **无序广播**:使用`sendBroadcast()`方法发送,特点是广播消息会被所有符合条件的接收者接收,但接收顺序不确定,且无法被拦截。 - **有序广播**:使用`...