`

android broadcastReceiver生命周期及两种应用

阅读更多

一: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()启动一个服务,及时服务做这个工作,因此系统知道进程中有活跃的工作在做。

  • 大小: 19.3 KB
分享到:
评论

相关推荐

    BroadcastReceiver的生命周期

    综上所述,BroadcastReceiver在Android开发中扮演着重要角色,它的生命周期管理和正确使用是确保应用能及时、有效地响应广播的关键。同时,理解源码可以帮助我们更好地定制和优化BroadcastReceiver的行为。

    android BroadcastReceiver 源码

    `BroadcastReceiver`的生命周期由`onReceive()`方法定义。当BroadcastReceiver接收到广播时,系统会回调这个方法。由于系统可能在同一时间处理多个广播,因此`onReceive()`的执行必须非常快,通常不超过10秒,否则...

    Android学习之BroadcastReceiver总结

    在Android系统中,BroadcastReceiver(广播接收者)是四大组件之一,它扮演着接收系统或应用广播消息的重要角色。BroadcastReceiver使得应用可以在不运行的情况下,响应系统或其它应用发出的事件,例如系统启动完成...

    Android BroadcastReceiver

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

    《BroadcastReceiver详解》对应源码

    1. **BroadcastReceiver的生命周期**:BroadcastReceiver的生命周期非常短暂,主要包含`onReceive()`方法。当接收到广播时,系统会创建BroadcastReceiver实例并调用该方法。因此,所有的处理逻辑都应该在这个方法中...

    android_Activity生命周期

    Service的生命周期包括startService()和bindService()两种启动方式,分别对应不同的生命周期回调。 BroadcastReceiver用于接收系统或应用广播事件,如网络状态改变、系统重启等。当接收到广播时,BroadcastReceiver...

    android demo,BroadcastReceiver源代码的实现。

    BroadcastReceiver的主要生命周期包含两个方法:onReceive()和onFinish()。其中,onReceive()是核心方法,当BroadcastReceiver接收到匹配的广播时,系统会调用这个方法。在这个方法中,你需要完成相应的处理逻辑,如...

    android_broadcastreceiver.rar

    - 发送广播有两种方式:显式广播和隐式广播。显式广播指定接收者的类名,只能被指定的BroadcastReceiver接收;隐式广播不指定接收者,任何注册了相应IntentFilter的BroadcastReceiver都可以接收。 5. **示例代码**...

    BroadcastReceiver使用demo

    BroadcastReceiver是Android系统中的一个重要组件,它用于接收并响应系统或应用广播事件。在这个"BroadcastReceiver使用demo"中,我们将深入探讨BroadcastReceiver的工作原理、如何创建与注册、以及如何发送和接收...

    Android BroadcastReceiverDemo

    BroadcastReceiver的生命周期非常短暂,onReceive()方法执行完毕后,Receiver就会被销毁。因此,所有的处理工作必须在这个方法内快速完成,避免阻塞UI线程。 此外,理解权限管理对于BroadcastReceiver的使用也非常...

    BroadcastReceiver

    BroadcastReceiver是Android...了解其两种注册方式及其生命周期,对于构建能够灵活响应系统和自定义事件的应用至关重要。在实际开发中,我们需要根据需求选择合适的注册方式,以确保BroadcastReceiver能正确地工作。

    android中的BroadcastReceiver

    BroadcastReceiver的生命周期由onReceive()方法定义,当接收到匹配的广播时,系统会回调此方法,开发者在此处理广播事件。由于该方法执行时间有限(通常不超过10秒),因此不适合进行耗时操作,否则可能导致ANR...

    Android移动应用开发中BroadcastReceiver单元主要内容.pdf

    在Android移动应用开发中,BroadcastReceiver扮演着至关重要的角色,它是Android系统中一种核心的组件,用于接收并响应系统或应用程序发出的广播消息。BroadcastReceiver允许应用程序在后台运行,即使用户并未直接与...

    Android中的BroadcastReceiver注册方式研究.pdf

    在Android应用开发中,BroadcastReceiver(广播接收器)是一个至关重要的组件,用于监听系统或应用程序发布的广播消息。BroadcastReceiver能够接收并处理系统级别的广播事件,如设备启动、网络连接变化等,同时也...

    动态注册broadcastreceiver短信接受

    在Android系统中,BroadcastReceiver是一种用于接收系统广播事件的组件,它可以监听系统或应用程序发出的各种广播意图(Intent)。本主题将深入探讨如何实现动态注册BroadcastReceiver以接收短信。动态注册相比静态...

    Activity生命周期及Intent传值

    理解Activity的生命周期和Intent的传值机制对于Android开发者来说至关重要。 Activity的生命周期分为三个主要阶段:启动(Start)、运行(Running)和销毁(Destroy)。在启动过程中,Activity会经历onCreate()、...

    BroadcastReceiver学习(01)

    在Android系统中,BroadcastReceiver(广播接收者)是四大组件之一,它负责监听并响应系统或应用程序发布的广播意图。BroadcastReceiver允许应用在不运行的情况下接收到消息,从而实现后台通信和事件处理。在这个...

    broadcastReceiver

    广播的发送也有两种方式:无序广播和有序广播。 - **无序广播**:使用`sendBroadcast()`方法发送,特点是广播消息会被所有符合条件的接收者接收,但接收顺序不确定,且无法被拦截。 - **有序广播**:使用`...

Global site tag (gtag.js) - Google Analytics