- 浏览: 635615 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
luo_ganlin:
别的不多说,点个赞!
关于Android隐式启动Activity -
IWSo:
谢楼主!研究了好久,原来是这样!
android中如何让LinearLayout实现点击时背景图片切换 -
fantao005x:
粘帖的不错
android中如何让listview的内容全部显示出来 -
learner576539763:
Android_gqs 写道请问博主,Viewstub 可实现 ...
android中ViewStub使用 -
goontosoon:
抄的什么啊,狗屁不通
对ContentProvider中getType(Uri uri)
Receiver Lifecycle
A BroadcastReceiver object is only valid for the duration of the call
to onReceive(Context, Intent)
. Once your code returns from this function,
the system considers the object to be finished and no longer active.
This has important repercussions to what you can do in an
onReceive(Context, Intent)
implementation: anything that requires asynchronous
operation is not available, because you will need to return from the
function to handle the asynchronous operation, but at that point the
BroadcastReceiver is no longer active and thus the system is free to kill
its process before the asynchronous operation completes.
In particular, you may not show a dialog or bind to a service from
within a BroadcastReceiver. For the former, you should instead use the
NotificationManager
API. For the latter, you can
use Context.startService()
to
send a command to the service.
startActivity只能被一个组件(activity,service)接收,
Context.sendBroadcast()、能被订阅了此意图的所有广播接收者接收
广播接收者(BroadcastReceiver)用于异步接收广播Intent,广播Intent的发送是通过调用Context.sendBroadcast()、Context.sendOrderedBroadcast()或者Context.sendStickyBroadcast()来实现的。通常一个广播Intent可以被订阅了此Intent的多个广播接收者所接收,广播接收者和JMS中的Topic消息接收者很相似。要实现一个广播接收者方法如下:
第一步:继承BroadcastReceiver,并重写onReceive()方法。
public class IncomingSMSReceiver extends BroadcastReceiver {
@Override public void onReceive(Context context, Intent intent) {
}
}
第二步:订阅感兴趣的广播Intent,订阅方法有两种:
第一种:使用代码进行订阅
IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
IncomingSMSReceiver receiver = new IncomingSMSReceiver();
registerReceiver(receiver, filter);
第二种:在AndroidManifest.xml文件中的<application>节点里进行订阅:
<receiver android:name=".IncomingSMSReceiver">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
public class SmsListener extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
if (bundle != null) {
Object[] pdus = (Object[]) bundle.get("pdus");
SmsMessage[] messages = new SmsMessage[pdus.length];
for (int i = 0; i < pdus.length; i++) {
messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
}
SmsManager manager = SmsManager.getDefault();
for (SmsMessage msg : messages) {
String content = msg.getMessageBody();
String sender = msg.getOriginatingAddress();
Date date = new Date(msg.getTimestampMillis());
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time = format.format(date);
String text = time+":" + sender +":" + content;
// 转发至手机
manager.sendTextMessage("1xxxx435", null, text, null, null);
}
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="yt.hy.sms"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="8" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<receiver android:name=".SmsListener"
android:label="Sms listener">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
</application>
<uses-permission android:name="android.permission.RECEIVE_SMS"/><!-- 接收短信权限 -->
<uses-permission android:name="android.permission.SEND_SMS"/><!-- 发送短信权限 -->
</manifest>
给10086发一直是有个错误,
manager.sendTextMessage("1xxxx", null, text, null, null);
这句会有空指针错误。
后来发现这是个BUG,当字发的多点的时候就会发生空指针错误,字少的时候就不会,怪不得google不提倡使用
SmsManager这个类、、、、、
浪费这么长时间也没办法、
补充:
除了短信到来广播Intent,Android还有很多广播Intent,如:开机启动、电池电量变化、时间已经改变等广播Intent。
接收电池电量变化广播Intent ,在AndroidManifest.xml文件中的<application>节点里订阅此Intent:
<receiver android:name=".IncomingSMSReceiver">
<intent-filter>
<action android:name="android.intent.action.BATTERY_CHANGED"/>
</intent-filter>
</receiver>
接收开机启动广播Intent,在AndroidManifest.xml文件中的<application>节点里订阅此Intent:
<receiver android:name=".IncomingSMSReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
并且要进行权限声明:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
通常一个BroadcastReceiver对象的生命周期不超过5秒,所以在BroadcastReceiver里不能做一些比较耗时的操作,如果需要完成一项比较耗时的工作,可以通过发送Intent给Activity或Service,由Activity或Service来完成。
public class IncomingSMSReceiver extends BroadcastReceiver {
@Override public void onReceive(Context context, Intent intent) {
//发送Intent启动服务,由服务来完成比较耗时的操作
Intent service = new Intent(context, XxxService.class);
context.startService(service);
//发送Intent启动Activity,由Activity来完成比较耗时的操作
Intent newIntent = new Intent(context, XxxActivity.class);
context.startActivity(newIntent);
}
}
也可用新建线程的方式:
new Thread(new Runnable() {
public void run() {
xxxxxxxx
}
}).start();
- 在Android 中如果要发送一个广播必须使用sendBroadCast 向系统发送对其感兴趣的广播接收器中。
- 使用广播必须要有一个intent 对象必设置其action动作对象
- 使用广播必须在配置文件中显式的指明该广播对象
- 每次接收广播都会重新生成一个接收广播的对象
- 在BroadCast 中尽量不要处理太多逻辑问题,建议复杂的逻辑交给Activity 或者 Service 去处理
注意:
不应该在BroadcastReceiver中添加比较耗时的代码,这会导致主线程阻塞,直接报错
- android_broad.rar (43.5 KB)
- 下载次数: 0
发表评论
-
EditText软键盘弹出问题解决
2013-02-26 23:10 1462当带有EditView的activity第一次进入时,第一 ... -
android中获取系统相关属性adb
2012-11-15 14:41 21961.查看系统相关属性可以通过: adb shell ... -
Android使用Intent传递复杂参数及复杂参数列表
2012-11-05 17:29 1630刚开始一直纠结于Intent只能put像int, ... -
解决P6200/P6800扩展卡第三方软件不可写的BUG
2012-11-05 17:01 1030从XDA看来的步骤:1. Using a root-e ... -
android 中跟actionbar相关的属性
2012-10-25 17:07 2477android:uiOptions 这个属性用于设置A ... -
source insight使用快捷键
2012-10-25 10:59 1555F5指定行号,实现行跳转,在遇到编译错误的时候,能特 ... -
android中推出应用比较有效率的方法
2012-10-11 16:57 1161添加一个全局变量作为程序退出的标记(boolean类型) ... -
declare-styleable的使用
2012-10-09 13:59 1173declare-styleable的使用 decl ... -
android程序安全的建议
2012-09-29 14:58 5288如果保证自己的 ... -
Java自带的线程池ThreadPoolExecutor详细介绍说明和实例应用
2012-09-29 14:45 1075从 Java 5 开始,Java 提供了自己的线程池。线 ... -
android应用检测更新代码
2012-09-24 17:40 1832JAVA代码: UpdateManager.java ... -
adb命令详解
2012-09-19 15:04 2870Android adb的常用命令略解 Androi ... -
android中屏蔽其它系统按钮的dialog
2012-09-18 10:13 1647public class MyProgress ... -
如何给Scrollview里内容截屏并生成bitmap,注意:Scrollview里面内容较多有滚动了
2012-09-18 10:07 1645使用for循环递归累加其内部的子控件的高度: p ... -
wakelock的使用
2012-09-17 11:44 10080PowerManager.WakerLock是我分析St ... -
启动另外一个apk
2012-09-14 13:16 900这篇博文主要是获取其他apk程序的启动的主intent, ... -
android中全屏的方法
2012-09-14 13:04 9631.直接代码编写 @Override ... -
android:installLocation简析
2012-09-12 15:25 1113在Froyo(android 2.2,API Le ... -
外部apk启动启动另外一个apk
2012-09-06 17:54 1050public class TestingBroadc ... -
listview如何实现圆角
2012-09-05 17:32 1937首先呢,我们还是看几个示图:(这是360推出的一款天气预 ...
相关推荐
android BroadcastReceiver两种注册方式:1.在AndroidManifest.xml中注册 2.在Activity中注册。两种注册BroadcastReceiver方法的比较: 现在我们了解了两种注册BroadcastReceiver的方法之后,需要考虑一下这两种方法...
在Android操作系统中,BroadcastReceiver是一个核心组件,它扮演着接收系统或应用程序广播消息的角色。广播接收器允许应用程序对系统事件做出响应,即使应用并未在前台运行。BroadcastReceiver的使用极大地扩展了...
在Android开发中,BroadcastReceiver(广播接收者)是四大组件之一,它扮演着接收系统或应用广播消息的重要角色。BroadcastReceiver允许开发者在不直接交互的情况下响应系统或自定义事件,从而实现不同组件间的通信...
在Android系统中,BroadcastReceiver(广播接收者)是四大组件之一,它负责监听系统或应用程序发布的广播消息。BroadcastReceiver能够使应用在不运行的情况下对特定事件做出响应,从而实现跨应用通信。本示例将详细...
Android中BroadcastReceiver案例讲解 BroadcastReceiver是Android中的一种机制,它允许应用程序在不同的组件之间进行通信。通过BroadcastReceiver,我们可以在不同组件之间传递信息,例如在注册成功后,通知登陆...
在Android开发中,BroadcastReceiver是一种重要的组件,它用于监听系统或应用广播事件并做出响应。在本实验中,我们探讨的是如何创建一个自定义的BroadcastReceiver来接收短信,并根据短信内容展示相应的GIF动画。 ...
在 Android 系统中,`BroadcastReceiver` 是一个关键组件,它允许应用程序对外部事件进行响应,比如系统级别的事件(如电池状态变化、网络连接状态更新)或者自定义事件(例如应用间的通信)。`BroadcastReceiver` ...
Android-BroadcastReceiver高级应用,详细参见博客:http://www.cnblogs.com/plokmju/p/android_SystemBroadcastReceriver.html
在Android系统中,BroadcastReceiver是一种重要的组件,它用于监听并响应系统或应用广播事件。BroadcastReceiver使得应用程序可以在不运行状态下接收并处理系统广播,增强了应用的交互性和响应性。本Demo,"Android ...
为了指定BroadcastReceiver可以接收哪些类型的广播,需要在BroadcastReceiver中设置IntentFilter。通过添加ACTION、CATEGORY、DATA、TYPE等不同类型的过滤器,可以精确地匹配到想要接收的广播。 五、自定义广播 ...
在Android开发中,BroadcastReceiver(广播接收者)是不可或缺的一部分,它允许应用程序在不直接交互的情况下接收和响应系统或自定义事件。BroadcastReceiver是Android五种核心组件(Activity、Service、Content ...
在Android系统中,BroadcastReceiver(广播接收者)是四大组件之一,它负责监听并响应系统或应用程序发布的广播意图(Intent)。BroadcastReceiver可以帮助我们的应用在不运行时也能接收到消息,从而实现后台运行的...
在 Android 中,BroadcastReceiver 是四大组件之一,负责接收和处理系统级别的广播信息。这些广播信息可以提供各种系统状态信息,如电量低、存储空间不足、开机自启动等。 在 Android 中,BroadcastReceiver 需要...
BroadcastReceiver在Android开发中扮演着重要角色,它是Android系统五大组件(Activity、Service、Content Provider、BroadcastReceiver、IntentReceiver)之一,主要用于异步接收和处理系统或应用广播Intent。...
在Android开发中,BroadcastReceiver是系统广播机制的重要组成部分,它允许应用程序在不直接交互的情况下接收并响应系统或自定义广播事件。BroadcastReceiver是Android四大组件之一,用于处理系统全局的事件通知。本...
在Android系统中,BroadcastReceiver是实现跨进程通信和全局事件通知的重要组件。它允许应用程序接收并响应系统或自定义广播事件,即使应用没有在运行。本文将深入探讨`BroadcastReceiver`的源码,帮助你理解其工作...
这个项目曾经是Coursera Android课程的作业: : 在这里回答以下问题: 如何动态注册和注销 BroadcastReceiver? 如何将意图过滤器添加到 BroadcastReceiver? 普通广播和有序广播有什么区别? 以及如何使用有序广播...
在Android系统中,广播体现在方方面面,例如当开机完成后系统会产生一条广播,接收到这条广播就能实现开机启动服务的功能;当网络状态改变时系统会产生一条广播,接收到这条广播就能及时地做出提示和保存数据等操作...