`
寻梦者
  • 浏览: 637517 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

android中的BroadcastReceiver

阅读更多

 

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中Broadcastreceiver两种注册方式

    android BroadcastReceiver两种注册方式:1.在AndroidManifest.xml中注册 2.在Activity中注册。两种注册BroadcastReceiver方法的比较: 现在我们了解了两种注册BroadcastReceiver的方法之后,需要考虑一下这两种方法...

    Android中BroadcastReceiver的定义.pdf

    在Android操作系统中,BroadcastReceiver是一个核心组件,它扮演着接收系统或应用程序广播消息的角色。广播接收器允许应用程序对系统事件做出响应,即使应用并未在前台运行。BroadcastReceiver的使用极大地扩展了...

    Android中BroadcastReceiver的创建与使用步骤.pdf

    在Android开发中,BroadcastReceiver(广播接收者)是四大组件之一,它扮演着接收系统或应用广播消息的重要角色。BroadcastReceiver允许开发者在不直接交互的情况下响应系统或自定义事件,从而实现不同组件间的通信...

    Android的BroadcastReceiver简单示例

    在Android系统中,BroadcastReceiver(广播接收者)是四大组件之一,它负责监听系统或应用程序发布的广播消息。BroadcastReceiver能够使应用在不运行的情况下对特定事件做出响应,从而实现跨应用通信。本示例将详细...

    Android中BroadcastReceiver案例讲解

    Android中BroadcastReceiver案例讲解 BroadcastReceiver是Android中的一种机制,它允许应用程序在不同的组件之间进行通信。通过BroadcastReceiver,我们可以在不同组件之间传递信息,例如在注册成功后,通知登陆...

    android BroadcastReceiver实验,短信接收

    在Android开发中,BroadcastReceiver是一种重要的组件,它用于监听系统或应用广播事件并做出响应。在本实验中,我们探讨的是如何创建一个自定义的BroadcastReceiver来接收短信,并根据短信内容展示相应的GIF动画。 ...

    Android \BroadCastReceiver 简介

    在 Android 系统中,`BroadcastReceiver` 是一个关键组件,它允许应用程序对外部事件进行响应,比如系统级别的事件(如电池状态变化、网络连接状态更新)或者自定义事件(例如应用间的通信)。`BroadcastReceiver` ...

    Android-BroadcastReceiver高级应用

    Android-BroadcastReceiver高级应用,详细参见博客:http://www.cnblogs.com/plokmju/p/android_SystemBroadcastReceriver.html

    Android BroadcastReceiver Demo

    在Android系统中,BroadcastReceiver是一种重要的组件,它用于监听并响应系统或应用广播事件。BroadcastReceiver使得应用程序可以在不运行状态下接收并处理系统广播,增强了应用的交互性和响应性。本Demo,"Android ...

    Android学习之BroadcastReceiver总结

    为了指定BroadcastReceiver可以接收哪些类型的广播,需要在BroadcastReceiver中设置IntentFilter。通过添加ACTION、CATEGORY、DATA、TYPE等不同类型的过滤器,可以精确地匹配到想要接收的广播。 五、自定义广播 ...

    详解Android中BroadCastReceiver组件

    在Android开发中,BroadcastReceiver(广播接收者)是不可或缺的一部分,它允许应用程序在不直接交互的情况下接收和响应系统或自定义事件。BroadcastReceiver是Android五种核心组件(Activity、Service、Content ...

    android_broadcastreceiver.rar

    在Android系统中,BroadcastReceiver(广播接收者)是四大组件之一,它负责监听并响应系统或应用程序发布的广播意图(Intent)。BroadcastReceiver可以帮助我们的应用在不运行时也能接收到消息,从而实现后台运行的...

    Android BroadcastReceiver接收收到短信的广播

    在 Android 中,BroadcastReceiver 是四大组件之一,负责接收和处理系统级别的广播信息。这些广播信息可以提供各种系统状态信息,如电量低、存储空间不足、开机自启动等。 在 Android 中,BroadcastReceiver 需要...

    Android中BroadcastReceiver(异步接收广播Intent)的使用

    BroadcastReceiver在Android开发中扮演着重要角色,它是Android系统五大组件(Activity、Service、Content Provider、BroadcastReceiver、IntentReceiver)之一,主要用于异步接收和处理系统或应用广播Intent。...

    android BroadcastReceiver相关测试代码

    在Android开发中,BroadcastReceiver是系统广播机制的重要组成部分,它允许应用程序在不直接交互的情况下接收并响应系统或自定义广播事件。BroadcastReceiver是Android四大组件之一,用于处理系统全局的事件通知。本...

    android BroadcastReceiver 源码

    在Android系统中,BroadcastReceiver是实现跨进程通信和全局事件通知的重要组件。它允许应用程序接收并响应系统或自定义广播事件,即使应用没有在运行。本文将深入探讨`BroadcastReceiver`的源码,帮助你理解其工作...

    Android_BroadcastReceiver_Notification:该项目是 Android 中 BroadcastReceiver 和 Notification 的演示应用程序

    这个项目曾经是Coursera Android课程的作业: : 在这里回答以下问题: 如何动态注册和注销 BroadcastReceiver? 如何将意图过滤器添加到 BroadcastReceiver? 普通广播和有序广播有什么区别? 以及如何使用有序广播...

    深入Android中BroadcastReceiver的两种注册方式(静态和动态)详解

    在Android系统中,广播体现在方方面面,例如当开机完成后系统会产生一条广播,接收到这条广播就能实现开机启动服务的功能;当网络状态改变时系统会产生一条广播,接收到这条广播就能及时地做出提示和保存数据等操作...

Global site tag (gtag.js) - Google Analytics