androi-BroadcastReceiver<九>
1.BroadcastReceiver(抽象类)
它android的四大组件之一,所以要在清单文件中注册<receiver>,用来发送消息,只负责发送,不管是否接受到或如何处理。
构造方法:可以自己写一个继承该BroadcastReceiver的类去写入自己想要的内容。
成员方法(只会执行该方法):
void onReceive(Context context, Intent intent) ;//context是指发起该intent的组件(如Activity)
2.BroadcastReceiver生命周期
每当调用BroadcastReceiver时,它就会创建一个该类的对象(执行构造方法),并调用onReceive方法,
之后该对象就被消除。只有再次调用BroadcastReceiver时,才会重新创建一个该类的对象。
1 1 public class TestReceiverActivity extends Activity { 2 2 /** Called when the activity is first created. */ 3 3 private Button bt=null; 4 4 @Override 5 5 public void onCreate(Bundle savedInstanceState) { 6 6 super.onCreate(savedInstanceState); 7 7 setContentView(R.layout.main); 8 8 bt=(Button)findViewById(R.id.bt); 9 9 bt.setOnClickListener(new View.OnClickListener(){ 10 10 11 11 @Override 12 12 public void onClick(View v) { 13 13 // TODO Auto-generated method stub 14 14 //生成一个intent,并设置它的动作,只有与在清单文件中 15 15 //intent-filter里匹配的动作,才会执行包裹该intent-filter的组件(broadcast) 16 16 Intent it=new Intent(); 17 17 it.setAction(Intent.ACTION_EDIT);//该参数(字符串)可以任意内容,只要和intent-filter里的匹配即可 18 18 //发送一个与该intent匹配的broadcast 19 19 sendBroadcast(it); 20 20 } 21 21 22 22 }); 23 23 } 24 24 }
继承BroadcastReceiver类
1 package hq.TestReceiver; 2 3 import android.content.BroadcastReceiver; 4 import android.content.Context; 5 import android.content.Intent; 6 7 public class TestBroadcast extends BroadcastReceiver{ 8 9 public TestBroadcast() 10 { 11 System.out.println("TestBroadcast构造"); 12 } 13 @Override 14 public void onReceive(Context context, Intent intent) { 15 // TODO Auto-generated method stub 16 System.out.println("TestBroadcast-onReceive"); 17 } 18 19 }
清单文件xml
1 <?xml version="1.0" encoding="utf-8"?> 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android" 3 package="hq.TestReceiver" 4 android:versionCode="1" 5 android:versionName="1.0" > 6 7 <uses-sdk android:minSdkVersion="15" /> 8 9 <application 10 android:icon="@drawable/ic_launcher" 11 android:label="@string/app_name" > 12 <activity 13 android:name=".TestReceiverActivity" 14 android:label="@string/app_name" > 15 <intent-filter> 16 <action android:name="android.intent.action.MAIN" /> 17 18 <category android:name="android.intent.category.LAUNCHER" /> 19 </intent-filter> 20 </activity> 21 <receiver 22 android:name=".TestBroadcast" 23 > 24 <intent-filter > 25 <action android:name="android.intent.action.EDIT"/> 26 <category android:name = "android.intent.category.DEFAULT" /> 27 </intent-filter> 28 29 </receiver> 30 </application> 31 32 </manifest>
3.注册BroadcastReceiver的方法
a.在xml注册:如上<receiver/><intent-filter/>,通过intent来找到匹配它的接受器。
b.在应用程序中的代码进行注册:下面两个方法来自Activity(Context组件)
进行注册: registerReceiver(receivedr,filter);//这里filter的action必须是android内部指定已有的。
好处:可以保证在应用程序安装之后,BroadcastReceiver始终处于活动状态,通常用于监听系统状态的改变,
比如说手机的电量,对于这样的BroadcastReceiver,通常是在产生某个特定的系统事件之后,进行相应
的操作,比如说wifi网卡打开时,给用户一个提示
取消注册:registerReceiver(receivedr); //因为你没有xml注册相应的action,则需要系统内置的action帮你
好处:如果一个BroadcastReceiver用于更新UI,那么最好以这种方式注册,
在Activity启动时注册它,在Activity不可见以后取消注册它。
4.显示intent和隐式intent
显示intent:指定调用某个Activity(组件),并直接调用该Activity。
1 //响应按钮btn事件 2 btn.setOnClickListener(new OnClickListener() { 3 @Override 4 public void onClick(View v) { 5 //显示方式声明Intent,直接启动SecondActivity 6 Intent it = new Intent(MainActivity.this,SecondActivity.class); 7 //启动Activity 8 startActivity(it); 9 } 10 });
隐式intent:调用匹配该intent的动作的所有Activity(组件),这些匹配对应的Activity都写在清单文件中。
注意:隐式intent的intent-filter里必须有这个规定的东西:意思是该intent是隐式的方式
<category android:name = "android.intent.category.DEFAULT" />
1、一个 Intent 可以有多个 category,但至少会有一个,也是默认的一个 category。
2、只有 Intent 的所有 category 都匹配上,Activity 才会接收这个 Intent。
参考博客:http://liangruijun.blog.51cto.com/3061169/655132