android BroadcastReceiver兩種注冊方式


1.在AndroidManifest.xml中注冊

   

<receiver android:name=".MyReceiver">
            <intent-filter >
                <action android:name="myaction"/>
            </intent-filter>
        </receiver>

2.在Activity中注冊

                MyReceiver receiver = new MyReceiver();
                IntentFilter filter = new IntentFilter();
                filter.addAction("myaction");
                registerReceiver(receiver, filter);

兩種注冊BroadcastReceiver方法的比較:
現在我們了解了兩種注冊BroadcastReceiver的方法之后,需要考慮一下這兩種方法適用的場合:

i. 第一種注冊的方法可以保證在應用程序安裝之后,BroadcastReceiver始終處於活動狀態,通常用於監聽系統狀態的改變,比如說手機的電量,wifi網卡的狀態(當然,監視這些東西也是取決於軟件的需求)。對於這樣的BroadcastReceiver,通常是在產生某個特定的系統事件之后,進行相應的操作,比如說wifi網卡打開時,給用戶一個提示;

ii. 第二種注冊方法相對第一種要靈活的多,這樣注冊的BroadcastReceiver通常用於更新UI的狀態。一般來說,都是在一個Activity啟動的時候使用這樣的方法注冊BroadcastReceiver,一旦接收到廣播的事件,就可以在onReceive方法當中更新當前的這個Activity當中的控件。但是需要注意的是如果這個Activity不可見了,就應該調用unregisterReceiver方法來解除注冊;

 

函數:

i. registerReceiver(receiver,filter);
這個函數的作用就是將一個BroadcastReceiver注冊到應用程序當中,這個函數接收兩個參數,第一個參數是需要注冊的BroadcastReceiver對象,第二個是一個IntentFilter。第一個參數是非常容易理解的,第二個參數的作用是定義了哪些Intent才能觸發這個注冊的BroadcastReceiver對象。類似於前面所講解的
<intent-filter>標簽的作用;

ii. unregisterReceiver(receiver);
這個方法就非常的簡單了,用於解除BroadcastReceiver的綁定狀態。一旦解除完成,響應的BroadcastReceiver就不會再接收系統所廣播的Intent了。

 

下面是源代碼Demo:

Acitivity:

package com.example.broadcast;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.content.IntentFilter;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity {
    
    Button mybt;
    Intent intent;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mybt = (Button)findViewById(R.id.mybt);
        mybt.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                
                /*注冊BroadcastReceiver有兩種方式:
                一種方式是,靜態的在AndroidManifest.xml中用<receiver>標簽生命注冊,並在標簽內用<intent- filter>標簽設置過濾器。
                另一種方式是,動態的在代碼中先定義並設置好一個 IntentFilter 對象,然后在需要注冊的地方調Context.registerReceiver()方法,
                如果取消時就調用 Context.unregisterReceiver()方法。如果用動態方式注冊的BroadcastReceiver的Context對象被銷毀時,
                BroadcastReceiver也就自動取消注冊了。(特別注意,有些可能需要后台監聽的,如短信消息)*/
//                MyReceiver receiver = new MyReceiver();
//                IntentFilter filter = new IntentFilter();
//                filter.addAction("myaction");
//                registerReceiver(receiver, filter);
                //創建Intent對象
                intent = new Intent();
                //設置Intent的Action屬性
                intent.setAction("myaction");
                //加入信息
                intent.putExtra("msg", "普通廣播");
                //傳送信息
 sendBroadcast(intent);
                
                
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

}

BroadcastReceiver:

package com.example.broadcast;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class MyReceiver extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        Toast.makeText(context,"Action is:"+intent.getAction()
                +"\n msg is:"+intent.getStringExtra("msg") , Toast.LENGTH_LONG)
                .show();
    }

}

Manifest:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.broadcast"
    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" >
        <receiver android:name=".MyReceiver">
            <intent-filter >
                <action android:name="myaction"/>
            </intent-filter>
        </receiver>
        <activity
            android:name="com.example.broadcast.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>
    </application>

</manifest>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM