`
啸笑天
  • 浏览: 3468125 次
  • 性别: Icon_minigender_1
  • 来自: China
社区版块
存档分类
最新评论

Activity、Bundle、请求码与结果码、Intent、广播、服务 (三)

阅读更多

广播接收者(BroadcastReceiver)

 

广播接收者(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>

 

注:

 

Context.startActivity(Intent)   ----->只能被一个组件(Activity / Service)接受

Context.sendBroadcast(Intent)----->能被订阅了此意图的所有广播接受者所接受



 

例子:使用广播接收者窃 听短信

 

如果你想窃 听别人接收到的短信,达到你不可告人的目的,那么本节内容可以实现你的需求。

当系统收到短信时,会发出一个action名称为android.provider.Telephony.SMS_RECEIVED的广播Intent,该Intent存放了接收到的短信内容,使用名称“pdus”即可从Intent中获取短信内容。

public class IncomingSMSReceiver extends BroadcastReceiver {

private static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";

@Override public void onReceive(Context context, Intent intent) {

if (intent.getAction().equals(SMS_RECEIVED)) {

SmsManager sms = SmsManager.getDefault();

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]);

for (SmsMessage message : messages){

String msg = message.getMessageBody();

String to = message.getOriginatingAddress();

sms.sendTextMessage(to, null, msg, null, null);

}}}}}

在AndroidManifest.xml文件中的<application>节点里对接收到短信的广播Intent进行订阅:

<receiver android:name=".IncomingSMSReceiver">

<intent-filter><action android:name="android.provider.Telephony.SMS_RECEIVED"/></intent-filter></receiver>

在AndroidManifest.xml文件中添加以下权限:

<uses-permission android:name="android.permission.RECEIVE_SMS"/><!-- 接收短信权限 -->

<uses-permission android:name="android.permission.SEND_SMS"/><!-- 发送短信权限 -->

 

 

除了短信到来广播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);
}
}

 



 

  • 大小: 156.3 KB
  • 大小: 80.6 KB
分享到:
评论

相关推荐

    Activity、Bundle、请求码与结果码、Intent、广播、服务 (二)

    在Android应用开发中,Activity、Bundle、请求码与结果码、Intent、广播和服务是核心组件,它们构成了Android应用运行的基本框架。这篇博文将深入探讨这些概念及其相互关系,旨在帮助开发者更好地理解和运用。 首先...

    Activity、Bundle、请求码与结果码、Intent、广播、服务 (四)

    在Android应用开发中,Activity、Bundle、请求码与结果码、Intent、广播和服务是核心组件,它们构成了Android系统运行应用程序的基础框架。这篇文章将深入解析这些概念,并通过源码分析和实用工具来帮助开发者更好地...

    Android Activity和Intent机制学习笔记

    - **启动Service**: 使用`Context.startService()`来启动一个服务,或者使用`Context.bindService()`来与服务进行绑定。 - **发送广播**: 通过`Context.sendBroadcast()`、`Context.sendOrderedBroadcast()`或`...

    Android+Intent机制实例详解.rar

    使用startActivity(Intent)或startActivityForResult(Intent, 请求码)方法启动Activity。startActivityForResult()用于需要接收返回结果的情况。 五、启动Service 使用startService(Intent)或bindService(Intent, ...

    android intent 代码

    显式Intent用于指定要启动的确切组件(Activity或Service),而隐式Intent则是向系统广播一个行动请求,任何符合Intent过滤器的组件都可以响应。 2. 创建Intent 创建Intent非常简单,你可以使用`new Intent()`构造...

    intent的深入分析

    通过Intent,我们可以启动活动(Activity)、服务(Service)或者广播接收器(BroadcastReceiver),传递数据和指令。本篇文章将深入探讨Intent的属性和使用时的注意事项。 一、Intent的基本类型 Intent分为显式...

    036_android_ActivityForResult

    请求码用于确认返回的结果来自哪个`Activity`,结果码表示`Activity`的执行状态(如是否成功),数据则是`Activity`返回的数据,通常是一个`Intent`,可能包含额外的信息。 四、请求码和结果码 请求码是你自定义的...

    Activity之间的调用

    这些模式影响着新Activity的创建方式以及现有Activity如何处理新的Intent请求。 1. standard(默认):每次启动Intent都会创建一个新的Activity实例,即使栈中已有该Activity。 2. singleTop:如果目标Activity已经...

    安卓Android源码——Intent1.rar

    Intent 可用于启动活动(Activity)、服务(Service),传递数据,甚至启动广播接收器(Broadcast Receiver)。本压缩包文件“安卓Android源码——Intent1.rar”很可能包含了有关Intent的源代码分析和示例,帮助...

    Android 获取来电号码和去电号码

    在回调方法`onRequestPermissionsResult()`中处理权限请求的结果。 总的来说,获取Android来电和去电号码涉及了权限管理、广播接收器以及运行时权限等核心知识点。通过这些技术,开发者可以实现电话状态监控,进而...

    Android使用Intent实现Camera功能

    在Android应用开发中,Intent是连接各个组件的重要桥梁,它用于启动活动(Activity)、服务(Service)或广播接收器(Broadcast Receiver)。当我们想要调用系统相机功能时,Intent扮演了关键角色。本教程将深入讲解...

    Android应用开发-系统Activity的调用.pptx

    Intent包含了具体的操作请求信息,可以启动Activity、Service或发送广播。启动Activity有两种方式:直接使用`startActivity(Intent intent)`启动新的Activity,或者在现有Activity中使用`startActivityForResult...

    android 接收屏幕广播例子

    在Android开发中,广播接收器(BroadcastReceiver)是一种重要的组件,它允许应用程序监听并响应系统或自定义事件。本文将详细讲解如何在Android中创建一个接收屏幕状态改变广播的示例。 首先,我们需要理解Android...

    android传值总结

    除了基本的数据传递,还有请求码(requestCode)和结果码(resultCode)的概念。当你使用`startActivityForResult(Intent intent, int requestCode)`启动Activity时,requestCode用于识别哪个按钮或者事件触发了这次...

    intent 调用相机

    在Android应用开发中,Intent是实现组件间通信的关键机制,它可以用来启动活动(Activity)、服务(Service)或者广播接收器(Broadcast Receiver)。当我们想要调用系统相机服务时,Intent的作用尤为显著。本教程将...

    android常用代码.pdf

    - 在父Activity中重写`onActivityResult(int requestCode, int resultCode, Intent data)`方法来接收子Activity返回的结果,通过`requestCode`匹配请求,`resultCode`判断返回状态,`data`获取返回的Intent数据。...

    广播分发代码走读

    `ContextImpl.sendBroadcast()`方法负责获取广播的MIME类型(如果已指定),并通过`ActivityManagerNative.getDefault()`获取`ActivityManagerService`的代理对象,并将广播意图发送给该服务进行进一步处理。...

Global site tag (gtag.js) - Google Analytics