最近看了下关于广播方面的东西,加深了理解,也纠正了自己以前的不正确的看法。
关于广播有2中注册方式,一种是在代码中注册,也叫动态注册,另一种是在AndroidManifest里面注册,也叫静态注册。
不管在哪个里面注册,都需要发送广播sendBroadcast()。广播发送的是一个Intent,intent里面一般是action。
如果是在代码里面注册,一般在onResume()方法里面注册。
1 @Override 2 protected void onResume() { 3 // TODO Auto-generated method stub 4 5 myReceiver = new MyReceiver(); 6 IntentFilter filter = new IntentFilter(); 7 //向过滤器中添加action 8 filter.addAction("com.android.shang"); 9 //注册广播 10 registerReceiver(myReceiver, filter); 11 12 Intent intent = new Intent(); 13 intent.setAction("com.android.xiang"); 14 //发送广播 15 sendBroadcast(intent); 16 super.onResume(); 17 }
在onPause()方法里面要取消注册。
1 @Override 2 protected void onPause() { 3 // TODO Auto-generated method stub 4 unregisterReceiver(myReceiver); 5 super.onPause(); 6 }
当然,也可以在xml文件中注册:
1 <receiver 2 android:name=".MyBrocastReceiverTest"> 3 <intent-filter> 4 <action android:name="com.android.xiang"></action> 5 </intent-filter> 6 </receiver>
如果发送的广播的action已经注册了,那么在onReceive()方法中就会接收到发过来的广播,继而做出一些处理。
你可以写出一个内部类:
1 class MyReceiver extends BroadcastReceiver { 2 3 @Override 4 public void onReceive(Context context, Intent intent) { 5 // TODO Auto-generated method stub 6 //从这里的log中可以看到是否接受到了广播 7 System.out.println("intent = " + intent); 8 } 9 10 }
当然也可以单独写一个类:
package com.android.TestBrocastReceiver; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; public class MyBrocastReceiverTest extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub System.out.println("intent = " + intent); } }
一般如果在代码里面注册,就把广播写在代码里面,在xml文件中注册就单独写一个类。
注册在代码里面:
1 package com.android.TestBrocastReceiver; 2 3 import android.app.Activity; 4 import android.content.BroadcastReceiver; 5 import android.content.Context; 6 import android.content.Intent; 7 import android.content.IntentFilter; 8 import android.os.Bundle; 9 10 public class TestBrocastReceiver extends Activity { 11 12 MyReceiver myReceiver; 13 14 @Override 15 public void onCreate(Bundle savedInstanceState) { 16 super.onCreate(savedInstanceState); 17 setContentView(R.layout.main); 18 } 19 20 @Override 21 protected void onPause() { 22 // TODO Auto-generated method stub 23 unregisterReceiver(myReceiver); 24 super.onPause(); 25 } 26 27 @Override 28 protected void onResume() { 29 // TODO Auto-generated method stub 30 31 myReceiver = new MyReceiver(); 32 IntentFilter filter = new IntentFilter(); 33 //向过滤器中添加action 34 filter.addAction("com.android.shang"); 35 //注册广播 36 registerReceiver(myReceiver, filter); 37 38 Intent intent = new Intent(); 39 intent.setAction("com.android.xiang"); 40 //发送广播 41 sendBroadcast(intent); 42 super.onResume(); 43 } 44 45 class MyReceiver extends BroadcastReceiver { 46 47 @Override 48 public void onReceive(Context context, Intent intent) { 49 // TODO Auto-generated method stub 50 //从这里的log中可以看到是否接受到了广播 51 System.out.println("intent = " + intent); 52 } 53 } 54 }
注册在xml文件中:
在xml文件中注册,写上一个广播类,然后在activity中发送广播就可以了。
有时系统会发出一些广播,比如说时间的变化等,时间走一秒就会发一个广播,这时我们可以监听这个广播,然后在接收器中做处理就可以了,而不需要在发广播了。