广播有两种注册方式:动态和静态
在AndroidManifest.xml配置Service
<receiver android:name="com.example.broadcastuse.MyBroadcast">
<intent-filter >
<action android:name="com.lhm.myBroadcast"/>
</intent-filter>
</receiver>
package com.example.broadcastuse;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
public class MyBroadcast extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
String str=intent.getStringExtra("str");
Log.d("lhm", "静态注册的广播接收信息"+str);
}
}
启动方式:
Intent intent=new Intent("com.lhm.myBroadcast");
intent.putExtra("str", "lhm");
sendBroadcast(intent);
直接在java代码配置
package com.example.broadcastuse;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
public class MyBroadcast2 extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
String str=intent.getStringExtra("str2");
Log.d("lhm", "动态注册的广播接收的信息"+str);
}
}
//需要传入两个参数,一个是广播接收者,一个是其对应的意图过滤器
MainActivity.this.registerReceiver(new MyBroadcast2(), new IntentFilter("com.lhm.myBroadcast2"));
Intent intent1=new Intent("com.lhm.myBroadcast2");
intent1.putExtra("str2", "lhm2");
sendBroadcast(intent1);
内部广播不能采用静态注册广播方式,否则会无法实例化,只能采用动态注册方式
class MyBroadcast3 extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
String str3=intent.getStringExtra("str3");
Log.d("lhm", "内部广播采用动态注册"+str3);
}
}
MainActivity.this.registerReceiver(new MyBroadcast3(), new IntentFilter("com.lhm.myBroadcast3"));
Intent intent3=new Intent("com.lhm.myBroadcast3");
intent3.putExtra("str3", "lhm3");
sendBroadcast(intent3);
有序广播,根据优先级获取数据,可以将其他的有序广播处理后的数据显示在其有序广播里
在AndroidManifest.xml添加有序广播序列化
<receiver android:name="com.example.broadcastuse.MyOrderBroadcast">
<intent-filter android:priority="20">
<action android:name="com.lhm.myOrderBroadcast"/>
</intent-filter>
</receiver>
<receiver android:name="com.example.broadcastuse.MyOrderBroadcast2">
<intent-filter android:priority="0">
<action android:name="com.lhm.myOrderBroadcast"/>
</intent-filter>
</receiver>
package com.example.broadcastuse;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
public class MyOrderBroadcast extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
String str=intent.getStringExtra("key");
Log.d("lhm", "MyOrderBroadcast1接收到的数据是"+str);
//处理完第一次接收的数据后,在封装发送给下一个广播
str+="abc";
Bundle b=new Bundle();
b.putString("key2", str);
setResultExtras(b);
//终止广播
// abortBroadcast();
}
}
package com.example.broadcastuse;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
public class MyOrderBroadcast2 extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
String str=intent.getStringExtra("key");
Log.d("lhm", "MyOrderBroadcast2接收到的数据是"+str);
String key2=getResultExtras(true).getString("key2");
Log.d("lhm", "MyOrderBroadcast2接收到处理后的数据是"+key2);
}
}
Intent i=new Intent("com.lhm.myOrderBroadcast");
i.putExtra("key", "lhm");
sendOrderedBroadcast(i, null);
系统广播,大部分是intent的内容不一样,例如检测锂电池
BroadcastReceiver br = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if ((intent.ACTION_BATTERY_CHANGED).equals(intent.getAction())) {
// 获取当前电量
int num = intent.getIntExtra("level", 0);
// 最大的电量
int count = intent.getIntExtra("scale", 100);
Log.d("lhm", "当前电量为" + ((num * 100) / (count)) + "%");
}
}
};
//系统广播不需要发送,只需注册后就能够使用
MainActivity.this.registerReceiver(br, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
整体代码:
activity_main.xml
<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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<Button
android:id="@+id/btn1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="静态注册的发送广播" />
<Button
android:id="@+id/btn2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="动态注册的发送广播" />
<Button
android:id="@+id/btn3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="内部类动态注册的发送广播" />
<Button
android:id="@+id/btn4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="BroadCast" />
<Button
android:id="@+id/btn5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="系统广播,检测电池电量" />
</LinearLayout>
package com.example.broadcastuse;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
public class MyBroadcast extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
String str=intent.getStringExtra("str");
Log.d("lhm", "静态注册的广播接收信息"+str);
}
}
package com.example.broadcastuse;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
public class MyBroadcast2 extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
String str=intent.getStringExtra("str2");
Log.d("lhm", "动态注册的广播接收的信息"+str);
}
}
package com.example.broadcastuse;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
public class MyOrderBroadcast extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
String str=intent.getStringExtra("key");
Log.d("lhm", "MyOrderBroadcast1接收到的数据是"+str);
//处理完第一次接收的数据后,在封装发送给下一个广播
str+="abc";
Bundle b=new Bundle();
b.putString("key2", str);
setResultExtras(b);
//终止广播
// abortBroadcast();
}
}
package com.example.broadcastuse;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
public class MyOrderBroadcast2 extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
String str=intent.getStringExtra("key");
Log.d("lhm", "MyOrderBroadcast2接收到的数据是"+str);
String key2=getResultExtras(true).getString("key2");
Log.d("lhm", "MyOrderBroadcast2接收到处理后的数据是"+key2);
}
}
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.broadcastuse"
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" >
<activity
android:name="com.example.broadcastuse.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="com.example.broadcastuse.MyBroadcast">
<intent-filter >
<action android:name="com.lhm.myBroadcast"/>
</intent-filter>
</receiver>
<receiver android:name="com.example.broadcastuse.MyOrderBroadcast">
<intent-filter android:priority="20">
<action android:name="com.lhm.myOrderBroadcast"/>
</intent-filter>
</receiver>
<receiver android:name="com.example.broadcastuse.MyOrderBroadcast2">
<intent-filter android:priority="0">
<action android:name="com.lhm.myOrderBroadcast"/>
</intent-filter>
</receiver>
</application>
</manifest>
package com.example.broadcastuse;
import android.os.Bundle;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity implements OnClickListener{
private Button btn1,btn2,btn3,btn4,btn5;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn1=(Button) findViewById(R.id.btn1);
btn2=(Button) findViewById(R.id.btn2);
btn3=(Button) findViewById(R.id.btn3);
btn4=(Button) findViewById(R.id.btn4);
btn5=(Button) findViewById(R.id.btn5);
btn1.setOnClickListener(this);
btn2.setOnClickListener(this);
btn3.setOnClickListener(this);
btn4.setOnClickListener(this);
btn5.setOnClickListener(this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn1:
Intent intent=new Intent("com.lhm.myBroadcast");
intent.putExtra("str", "lhm");
sendBroadcast(intent);
break;
case R.id.btn2:
//需要传入两个参数,一个是广播接收者,一个是其对应的意图过滤器
MainActivity.this.registerReceiver(new MyBroadcast2(), new IntentFilter("com.lhm.myBroadcast2"));
Intent intent1=new Intent("com.lhm.myBroadcast2");
intent1.putExtra("str2", "lhm2");
sendBroadcast(intent1);
break;
case R.id.btn3:
//内部广播不能采用静态注册广播方式,否则会无法实例化,只能采用动态注册方式
class MyBroadcast3 extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
String str3=intent.getStringExtra("str3");
Log.d("lhm", "内部广播采用动态注册"+str3);
}
}
MainActivity.this.registerReceiver(new MyBroadcast3(), new IntentFilter("com.lhm.myBroadcast3"));
Intent intent3=new Intent("com.lhm.myBroadcast3");
intent3.putExtra("str3", "lhm3");
sendBroadcast(intent3);
break;
case R.id.btn4:
Intent i=new Intent("com.lhm.myOrderBroadcast");
i.putExtra("key", "lhm");
sendOrderedBroadcast(i, null);
break;
case R.id.btn5:
BroadcastReceiver br = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if ((intent.ACTION_BATTERY_CHANGED).equals(intent.getAction())) {
// 获取当前电量
int num = intent.getIntExtra("level", 0);
// 最大的电量
int count = intent.getIntExtra("scale", 100);
Log.d("lhm", "当前电量为" + ((num * 100) / (count)) + "%");
}
}
};
//系统广播不需要发送,只需注册后就能够使用
MainActivity.this.registerReceiver(br, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
break;
default:
break;
}
}
}