其實所謂的靜態註冊,動態註冊,是指接收廣播的時候,是靜態註冊接收還是動態註冊接收,發送的時候不分靜態,動態
以發送intent爲例,
一共分4種情況,以每次註冊兩個Broadcast爲例:
情況一,註冊2個靜態Broadcast
如果是靜態註冊的,接收的一定是某一個類繼承BroadcastReceiver
2個java文件如下:
BroadcastActivity.java
package com.broad.test1; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.widget.Button; import android.view.View; import android.view.View.OnClickListener; import android.util.Log; //2個靜態註冊 public class BroadcastActivity extends Activity { /** Called when the activity is first created. */ private Button button01; private Button button02; private static final String TAG = "BroadcastActivity"; private static final String INTENAL_ACTION_1 = "su1.bluetooth.true"; private static final String INTENAL_ACTION_2 = "su1.bluetooth.false"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); button01 = (Button) findViewById(R.id.button01); button02 = (Button) findViewById(R.id.button02); button01.setOnClickListener(mybtnListener); button02.setOnClickListener(mybtnListener); } private OnClickListener mybtnListener = new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub if (v.getId() == (R.id.button01)) { Intent intent = new Intent(INTENAL_ACTION_1); // 也可以用mContext.sendBroadcast(intent),mContext.sendBroadcast可以在構造函數裏面初始化, // 有內部類的時候必須用??? sendBroadcast(intent); } else if (v.getId() == (R.id.button02)) { Intent intent = new Intent(INTENAL_ACTION_2); sendBroadcast(intent); } else { Log.v(TAG, "not true not false"); } } }; }
BroadcastRecTest.java
package com.broad.test1; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.util.Log; public class BroadcastRecTest extends BroadcastReceiver { private static final String TAG="BroadcastActivity"; private static final String INTENAL_ACTION_1="su1.bluetooth.true"; private static final String INTENAL_ACTION_2="su1.bluetooth.false"; @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub String action = intent.getAction(); if(action.equals(INTENAL_ACTION_1)){ Log.d(TAG,"surx>>>>>>>>>>>>>>>>>>>>>>>>>>>>>su1.bluetooth.true"); }else if(action.equals(INTENAL_ACTION_2)){ Log.d(TAG,"surx>>>>>>>>>>>>>>>>>>>>>>>>>>>su1.bluetooth.false"); }else{ Log.d(TAG,"surx>>>>>>>>>>>>>>>>>>>>>>>>>>other type intent"); } } }
main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <Button android:id="@+id/button01" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="靜態接收廣播true"/> <Button android:id="@+id/button02" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="靜態接收廣播false"/> </LinearLayout>
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.broad.test1" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".BroadcastActivity" 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="BroadcastRecTest"> <intent-filter> <action android:name="su1.bluetooth.true" /> <action android:name="su1.bluetooth.false" /> </intent-filter> </receiver> </application> <uses-sdk android:minSdkVersion="8" /> </manifest>
運行結果:
注意,靜態註冊的broadcast運行有點慢:
情況2,一個靜態,一個動態註冊Broadcast
BroadcastActivity.java
package com.broad.test1; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.widget.Button; import android.view.View; import android.view.View.OnClickListener; import android.util.Log; //1個動態,1個靜態註冊 public class BroadcastActivity extends Activity { /** Called when the activity is first created. */ private Button button01; private Button button02; private static final String TAG="BroadcastActivity"; private static final String INTENAL_ACTION_1="su2.bluetooth.true"; private static final String INTENAL_ACTION_2="su2.bluetooth.false"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); button01=(Button)findViewById(R.id.button01); button02=(Button)findViewById(R.id.button02); button01.setOnClickListener(mybtnListener); button02.setOnClickListener(mybtnListener); } private OnClickListener mybtnListener=new OnClickListener(){ @Override public void onClick(View v) { // TODO Auto-generated method stub if(v.getId()==(R.id.button01)){ Intent intent= new Intent(INTENAL_ACTION_1); sendBroadcast(intent); }else if(v.getId()==(R.id.button02)){ Intent intent= new Intent(INTENAL_ACTION_2); sendBroadcast(intent); }else{ Log.v(TAG,"not true not false"); } } }; // 接收動態註冊廣播的BroadcastReceiver private BroadcastReceiver bcrIntenal2 = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub //如果有多個動態註冊的廣播,要用if(action.equals()){}else if(action.equals()){}來判斷是哪個 //String action = intent.getAction(); //這裏只有一個,不用判斷了。 Log.v(TAG,"surx>>>>>>>>>>>>>>>>>>>>>>>>>>>dong--su2.bluetooth.false"); } }; //在onStart中動態註冊廣播,當然也可以在onCreate裏面註冊 @Override protected void onStart() { // TODO Auto-generated method stub super.onStart(); //動態註冊 IntentFilter intentFilter= new IntentFilter(INTENAL_ACTION_2); //也可以用這種方法動態註冊多個,說明我可以”接收“這麼多的動態廣播。 /* IntentFilter intentFilter= new IntentFilter(); intentFilter.addAction("action1"); intentFilter.addAction("action2");*/ registerReceiver(bcrIntenal2,intentFilter); } //在onStop中取消註冊廣播,如果在onCreate裏面註冊,那麼在onDestroy裏面取消註冊。 @Override protected void onStop() { // TODO Auto-generated method stub super.onStop(); unregisterReceiver(bcrIntenal2); } }
BroadcastRecTest.java
package com.broad.test1; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.util.Log; public class BroadcastRecTest extends BroadcastReceiver { private static final String TAG="BroadcastActivity"; private static final String INTENAL_ACTION_1="su2.bluetooth.true"; @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub String action = intent.getAction(); if(action.equals(INTENAL_ACTION_1)){ Log.d(TAG,"surx>>>>>>>>>>>>>>>>>>>>>>>>>>>>>su.bluetooth.true"); }else{ Log.d(TAG,"surx>>>>>>>>>>>>>>>>>>>>>>>>>>other type intent--jingtai"); } } }
main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <Button android:id="@+id/button01" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="靜態接收廣播true"/> <Button android:id="@+id/button02" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="動態接收廣播false"/> </LinearLayout>
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.broad.test1" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".BroadcastActivity" 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="BroadcastRecTest"> <intent-filter> <action android:name="su2.bluetooth.true" /> </intent-filter> </receiver> </application> <uses-sdk android:minSdkVersion="8" /> </manifest>
true是靜態註冊的,在Android.xml中註冊的,false是動態註冊的,在java代碼中註冊的
運行結果:
情況三、兩個都是動態註冊的,在同一個Activity裏面既發送,又接收,(當然也可以在不同的java中,一個發送,另一個java接收,哪怕是不同的包)
動態註冊不需要一個類繼承BroadcastReceiver這個類了,直接new一個對象即可
package com.broad.test1; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.widget.Button; import android.view.View; import android.view.View.OnClickListener; import android.util.Log; //兩個動態註冊 public class BroadcastActivity extends Activity { /** Called when the activity is first created. */ private Button button01; private Button button02; private static final String TAG="BroadcastActivity"; private static final String INTENAL_ACTION_1="su3.bluetooth.true"; private static final String INTENAL_ACTION_2="su3.bluetooth.false"; // private static final String BLUETOOTH_PERM = android.Manifest.permission.BLUETOOTH; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); button01=(Button)findViewById(R.id.button01); button02=(Button)findViewById(R.id.button02); button01.setOnClickListener(mybtnListener); button02.setOnClickListener(mybtnListener); } private OnClickListener mybtnListener=new OnClickListener(){ @Override public void onClick(View v) { // TODO Auto-generated method stub if(v.getId()==(R.id.button01)){ Intent intent= new Intent(INTENAL_ACTION_1); sendBroadcast(intent); }else if(v.getId()==(R.id.button02)){ Intent intent= new Intent(INTENAL_ACTION_2); sendBroadcast(intent); }else{ Log.v(TAG,"not true not false"); } } }; // 接收動態註冊廣播的BroadcastReceiver private BroadcastReceiver bcrIntenal2 = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub //如果有多個動態註冊的廣播,要用if(action.equals()){}else if(action.equals()){}來判斷是哪個 String action = intent.getAction(); if(action.equals(INTENAL_ACTION_1)){ Log.v(TAG,"surx>>>>>>>>>>>>>>>>>>>>>>>>>>>dong--su3.bluetooth.true"); }else if(action.equals(INTENAL_ACTION_2)){ Log.v(TAG,"surx>>>>>>>>>>>>>>>>>>>>>>>>>>>dong--su3.bluetooth.false"); } } }; //在onStart中動態註冊廣播,當然也可以在onCreate裏面註冊 @Override protected void onStart() { // TODO Auto-generated method stub super.onStart(); //動態註冊兩個, IntentFilter intentFilter= new IntentFilter(); intentFilter.addAction(INTENAL_ACTION_1); intentFilter.addAction(INTENAL_ACTION_2); registerReceiver(bcrIntenal2,intentFilter); } //在onStop中取消註冊廣播,如果在onCreate裏面註冊,那麼在onDestroy裏面取消註冊。 @Override protected void onStop() { // TODO Auto-generated method stub super.onStop(); unregisterReceiver(bcrIntenal2); } }
main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <Button android:id="@+id/button01" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="動態接收廣播true"/> <Button android:id="@+id/button02" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="動態接收廣播false"/> </LinearLayout>
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.broad.test1" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".BroadcastActivity" 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-sdk android:minSdkVersion="8" /> </manifest>
運行結果:
情況4,sendBroadcast的時候加權限,以2個都動態註冊爲例
package com.broad.test1; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.widget.Button; import android.view.View; import android.view.View.OnClickListener; import android.util.Log; //兩個動態註冊,sendBroadcast的時候加權限 public class BroadcastActivity extends Activity { /** Called when the activity is first created. */ private Button button01; private Button button02; private static final String TAG="BroadcastActivity"; private static final String INTENAL_ACTION_1="su4.bluetooth.true"; private static final String INTENAL_ACTION_2="su4.bluetooth.false"; private static final String BLUETOOTH_PERM = android.Manifest.permission.BLUETOOTH; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); button01=(Button)findViewById(R.id.button01); button02=(Button)findViewById(R.id.button02); button01.setOnClickListener(mybtnListener); button02.setOnClickListener(mybtnListener); } private OnClickListener mybtnListener=new OnClickListener(){ @Override public void onClick(View v) { // TODO Auto-generated method stub if(v.getId()==(R.id.button01)){ Intent intent= new Intent(INTENAL_ACTION_1); sendBroadcast(intent,BLUETOOTH_PERM); }else if(v.getId()==(R.id.button02)){ Intent intent= new Intent(INTENAL_ACTION_2); sendBroadcast(intent,BLUETOOTH_PERM); }else{ Log.v(TAG,"not true not false"); } } }; // 接收動態註冊廣播的BroadcastReceiver private BroadcastReceiver bcrIntenal2 = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub //如果有多個動態註冊的廣播,要用if(action.equals()){}else if(action.equals()){}來判斷是哪個 String action = intent.getAction(); if(action.equals(INTENAL_ACTION_1)){ Log.v(TAG,"surx>>>>>>>>>>>>>>>>>>>>>>>>>>>dong--su4.bluetooth.true"); }else if(action.equals(INTENAL_ACTION_2)){ Log.v(TAG,"surx>>>>>>>>>>>>>>>>>>>>>>>>>>>dong--su4.bluetooth.false"); } } }; //在onStart中動態註冊廣播,當然也可以在onCreate裏面註冊 @Override protected void onStart() { // TODO Auto-generated method stub super.onStart(); //動態註冊兩個,說明我可以”接收“2個這樣Action的動態廣播 IntentFilter intentFilter= new IntentFilter(); intentFilter.addAction(INTENAL_ACTION_1); intentFilter.addAction(INTENAL_ACTION_2); registerReceiver(bcrIntenal2,intentFilter); } //在onStop中取消註冊廣播,如果在onCreate裏面註冊,那麼在onDestroy裏面取消註冊。 @Override protected void onStop() { // TODO Auto-generated method stub super.onStop(); unregisterReceiver(bcrIntenal2); } }
發送的時候加了藍牙權限,
若在使用sendBroadcast()的方法是指定了接收權限,則只有接收方的包內--在AndroidManifest.xml中用<uses- permission>標籤聲明瞭擁有此權限的BroascastReceiver纔會有可能接收到發送來的Broadcast。
同樣,若在註冊BroadcastReceiver時指定了可接收的Broadcast的權限,則只有在接收方的包內的AndroidManifest.xml中 用<uses-permission>標籤聲明瞭,擁有此權限的Context對象所發送的Broadcast才能被這個 BroadcastReceiver所接收。
main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <Button android:id="@+id/button01" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="動態接收廣播true"/> <Button android:id="@+id/button02" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="動態接收廣播false"/> </LinearLayout>
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.broad.test1" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".BroadcastActivity" 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-sdk android:minSdkVersion="8" /> <uses-permission android:name="android.permission.BLUETOOTH"/> </manifest>
注意上面加的藍牙permission權限
運行結果:
總結:
以發送intent爲例,發送廣播都用sendBroadcast(intent);
靜態註冊接收的時候,只需要
(1)得到action,如:
String action = intent.getAction();
(2)判斷action類型,做出相應的動作。
動態註冊接收的時候,需要:
(1) IntentFilter intentFilter= new IntentFilter();
(2)intentFilter.addAction(。。);可以添加多個
(3)註冊接收,registerReceiver(BroadcastReceiver對象,intentFilter);別忘了在其他需要的地方取消註冊接收!!!
(4)得到action,如:
String action = intent.getAction(); (5)判斷action類型,做出相應的動作。