BroadcastReceiver所对应的广播分两类:无序广播和有序广播,我就来先讲讲无序广播与系统广播咯
无序广播的发送:把要发送的信息和用于过滤的信息(如Action、Category)装入一个Intent对象,然后通过调用 Context.sendBroadcast()方法,把 Intent对象以广播方式发送出去。
广播的接收:接收者通过一个继承了BroadcastRecevier的类来实现,覆盖onReceive()方法并且要通过Java或XML方式注册BroadcastReceiver。
src/com/zking/shuanger_android_20/ Activity.java代码如下:
package com.zking.shuanger_android_20;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
public class MainActivity extends AppCompatActivity {
private EditText et_main_content;
private Intent intent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_main_content = (EditText) findViewById(R.id.et_main_content);
intent = new Intent();
//设置广播的名字(设置action行为) 唯一的
intent.setAction("com.zking.shuanger_android_20.SenderContent");
}
/*
* intent 是Android三大基本组件的桥梁
* Activity 、Broadcast(广播)、service(服务)
*
* */
public void send(View view){
String content = et_main_content.getText().toString();
//携带数据
intent.putExtra("content",content);
//发送广播
// sendBroadcast(intent);
}
}
广播事件的接受者(一个继承了BroadcastReceiver的类)
src/com/zking/shuanger_android_20_received_01/MyReceivedOne .java
package com.zking.shuanger_android_20_received_01;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* Created by Pretty Girl on 2017/2/7.
*/
public class MyReceivedOne extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if ("com.zking.shuanger_android_20.SenderContent".equals(intent.getAction())){
String content = intent.getStringExtra("content");
SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
Date date = new Date(System.currentTimeMillis());//获取当前时间
String datetime = format.format(date);
Log.i("test","No.1号接收者收到广播!"+content+"\t"+datetime);
}
}
}
注册广播:
通过XML方式注册BroadcastReceiver(静态广播)。
AndroidManifest.xml:
<!-- 注册广播接收者
1、在XML中配置(静态广播)
2、使用java 代码(动态广播)
-->
<receiver android:name=".MyReceivedOne">
<!--意图过滤器-->
<intent-filter>
<!--配置 广播接收名 -->
<action android:name="com.zking.shuanger_android_20.SenderContent"></action>
</intent-filter>
</receiver>
动态广播的接收与静态广播接收是一样的,所以就讲
通过Java代码方式注册BroadcastReceiver(动态广播)
src/com/zking/shuanger_android_20_received_02/MainActivity .java
package com.zking.shuanger_android_20_received_02;
import android.content.IntentFilter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
private MyReceivedTwo myReceivedTwo;
private IntentFilter intentFilter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myReceivedTwo = new MyReceivedTwo();
intentFilter = new IntentFilter();
intentFilter.addAction("com.zking.shuanger_android_20.SenderContent");
}
@Override
protected void onResume() {
super.onResume();
//注册广播
registerReceiver(myReceivedTwo,intentFilter);
}
@Override
protected void onDestroy() {
super.onDestroy();
//销毁广播
unregisterReceiver(myReceivedTwo);
}
}
讲完自定义广播啦!
那么就接着来讲一个系统广播的例子吧,监听手机的电话状态。
首先,写一个继承了BroadcastReceiver的类用来做测试
src/com/zking/shuanger_android_20_phonestate/MyPhoneState.java
package com.zking.shuanger_android_20_phonestate;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.TelephonyManager;
import android.util.Log;
/**
* Created by Pretty Girl on 2017/2/7.
*/
public class MyPhoneState extends BroadcastReceiver {
private TelephonyManager telephonyManager;
@Override
public void onReceive(Context context, Intent intent) {
if ("android.intent.action.PHONE_STATE".equals(intent.getAction())){
//获取电话号码
String phone = intent.getStringExtra("incoming_number");
Log.i("test","您有电话进来!\t"+phone);
//获取电话状态
//电话管理者
telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
int state = telephonyManager.getCallState();
switch (state) {
case TelephonyManager.CALL_STATE_RINGING:
Log.i("test","来电话了");
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
Log.i("test","通话中");
break;
case TelephonyManager.CALL_STATE_IDLE:
Log.i("test","挂断了");
break;
}
}
}
}
然后在AndroidManifest.xml中配置手机读取电话状态的权限以及注册广播
请看代码:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.zking.shuanger_android_20_phonestate">
<!-- 读取电话状态权限 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<application android:allowBackup="true" android:icon="@mipmap/ic_launcher"
android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- 注册广播 -->
<receiver android:name=".MyPhoneState">
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE"></action>
</intent-filter>
</receiver>
</application>
</manifest>
这样就可以啦,你也快去测试测试吧!
这次的分享就先结束咯,记得关注我哦,还有更多的分享想带给您们,谢谢大家!