故作坚强 2014-08-14
BroadcastReceiver作为四大组件之一,觉得跟Activity最大的区别是不怎么跟用户交互,跟Service最大区别是可以广播,将信息发送给诸多用户。
BroadcastReceiver也就是“广播接收者”的意思,顾名思义,它就是用来接收来自系统和应用中的广播。
在Android系统中,广播体现在方方面面,例如当开机完成后系统会产生一条广播,接收到这条广播就能实现开机启动服务的功能;当网络状态改变时系统会产生一条广播,接收到这条广播就能及时地做出提示和保存数据等操作;当电池电量改变时,系统会产生一条广播,接收到这条广播就能在电量低时告知用户及时保存进度,等等。
Android中的广播机制设计的非常出色,很多事情原本需要开发者亲自操作的,现在只需等待广播告知自己就可以了,大大减少了开发的工作量和开发周期。而作为应用开发者,就需要数练掌握Android系统提供的一个开发利器,那就是BroadcastReceiver。下面我们就对BroadcastReceiver逐一地分析和演练,了解和掌握它的各种功能和用法。
BroadcastReceiver的缺点:效率非常低,如果传递小信息还可以,如果是大规模信息的话就不能胜任了,否则会导致应用非常非常卡。
下面贴个小例子的代码:
import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; public class MyBR extends BroadcastReceiver{ public static final String Action = "com.example.l303boardcast.intent.action.MyBR"; @Override public void onReceive(Context arg0, Intent arg1) { System.out.println("BroadcastReceiver:value="+arg1.getStringExtra("txt")); } }
静态注册
静态注册是在AndroidManifest.xml文件中配置的,置了以上信息之后,只要是android.intent.action.MY_BROADCAST这个地址的广播,MyReceiver都能够接收的到。注意,这种方式的注册是常驻型的,也就是说当应用关闭后,如果有广播信息传来,MyReceiver也会被系统调用而自动运行。
<application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.l303boardcast.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> <receiver android:name="MyBR"></receiver> </application>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity" > <Button android:id="@+id/but1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="发广播" /> <Button android:id="@+id/but2" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="绑定广播" /> <Button android:id="@+id/but3" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="解除广播 " /> </LinearLayout> [size=large][color=green]动态注册[/color] 动态注册需要在代码中动态的指定广播地址并注册,通常我们是在Activity或Service注册一个广播,下面我们就来看一下注册的代码:(绑定广播触发动态注册的事件)[/size]
import android.app.Activity; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; public class MainActivity extends Activity implements OnClickListener{ private MyBR mybr = new MyBR(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.but1).setOnClickListener(this); findViewById(R.id.but2).setOnClickListener(this); findViewById(R.id.but3).setOnClickListener(this); } @Override public void onClick(View arg0) { switch (arg0.getId()) { case R.id.but1: Intent intent = new Intent(MyBR.Action); intent.putExtra("txt", "吊炸天"); sendBroadcast(intent); break; case R.id.but2: registerReceiver(mybr, new IntentFilter(MyBR.Action)); break; case R.id.but3: unregisterReceiver(mybr); break; default: break; } } }
上面是个小例子,补充一下普通广播跟有序广播的区别:
上面的例子就是普通广播:普通广播对于多个接收者来说是完全异步的,通常每个接收者都无需等待即可以接收到广播,接收者相互之间不会有影响。对于这种广播,接收者无法终止广播,即无法阻止其他接收者的接收动作。
有序广播:
有序广播比较特殊,它每次只发送到优先级较高的接收者那里,然后由优先级高的接受者再传播到优先级低的接收者那里,优先级高的接收者有能力终止这个广播。
现在这三个接收者的<intent-filter>多了一个android:priority属性,并且依次减小。这个属性的范围在-1000到1000,数值越大,优先级越高。
<intent-filter android:priority="998"> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter>