標籤:android style blog class code java
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(); }}
Service發送廣播:
Intent intent = new Intent(); intent.setAction("com.he.chat.receiveNewMessage");//建立過濾條件 intent.putExtra("key", "newMessage");//傳遞參數 intent.putExtra("sender", msg.getSender());//傳遞參數 sendBroadcast(intent);
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>