Android在Service中註冊動態廣播接收者

Android廣播分爲動態、靜態廣播。

廣播接收器註冊一共有兩種形式 : 靜態註冊和動態註冊.

兩者及其接收廣播的區別:

1.動態註冊的廣播 永遠要快於 靜態註冊的廣播,不管靜態註冊的優先級設置的多高,不管動態註冊的優先級有多低>\

2.動態註冊廣播不是 常駐型廣播 ,也就是說廣播跟隨activity的生命週期。注意: 在activity結束前,移除廣播接收器。

靜態註冊是常駐型 ,也就是說當應用程序關閉後,如果有信息廣播來,程序也會被系統調用自動運行。

3.同種廣播如果在同一個優先級下,誰先啓動的快,誰將先接收到廣播。

廣播的有序無序傳播詳見我的博客:點擊打開鏈接

下面主要說下動態廣播的註冊流程。

首先動態廣播是不需要在Manifest文件中進行註冊的,這與靜態廣播有很大的區別。

<span style="font-size:12px;"><?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.itheima.register"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.itheima.register.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <service android:name="com.itheima.register.RegisterService"></service>
    </application>

</manifest></span>
   其次動態廣播通常註冊在Service的onCreate方法當中,在Service銷燬的時候,會解除註冊。
<span style="font-size:12px;">package com.itheima.register;
import android.app.Service;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.IBinder;

public class RegisterService extends Service {

	private ScreenReceiver receiver;
	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void onCreate() {
		super.onCreate();
		//1.創建廣播接收者對象
		receiver = new ScreenReceiver();
		//2.創建intent-filter對象
		IntentFilter filter = new IntentFilter();
		filter.addAction(Intent.ACTION_SCREEN_OFF);
		filter.addAction(Intent.ACTION_SCREEN_ON);
		
		//3.註冊廣播接收者
		registerReceiver(receiver, filter);
		
	}
	@Override
	public void onDestroy() {
		super.onDestroy();
		//解除註冊
		unregisterReceiver(receiver);
	}
}</span>
下面是監聽屏幕開關的廣播;

<span style="font-size:12px;">public class ScreenReceiver extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		// TODO Auto-generated method stub
		String action = intent.getAction();
		if(Intent.ACTION_SCREEN_OFF.equals(action)){
			System.out.println("屏幕關閉");
		}
		else if(Intent.ACTION_SCREEN_ON.equals(action)){
			System.out.println("屏幕打開");
		}
	}

}</span>
在Android 3.1系統之後,靜態廣播默認會被後臺回收掉的,這部分知識詳見我的博文:點擊打開鏈接。因此,靜態廣播多數是不安全的,所以建議建立動態廣播,並且與Service進行綁定,這樣做有利於長時間的後臺監聽。在Activity中註冊廣播接收者建議在onResume()當中進行註冊。在onDestroy()進行銷燬。






發佈了15 篇原創文章 · 獲贊 7 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章