广播接收者简介:
为了监听来自系统或应用程序的广播事件,Android系统提供了BroadcastReceiver(广播接收者)组件。
广播接收者创建:
右击—-包名—-new—-Other—-Broadcast Receiver—-名字自取、其他默认
默认:继承BroadcastReceiver类,重写onReceive()方法
public class MyReceiver extends BroadcastReceiver {
public MyReceiver() {
}
@Override
public void onReceive(Context context, Intent intent) {
throw new UnsupportedOperationException("Not yet implemented");
}
}
静态注册(自动):
<?xml version="1.0" encoding="utf-8"?>
<manifest ......>
<application ......>
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true">
</receiver>
</application>
</manifest>
enabled:用于选择广播接收者是否可以由系统实例化
exported:用于选择是否接受当前程序之外的广播
动态注册:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MyReceiver receiver=new MyReceiver();
String action="android.provider.Telephoto.SMS_RECEIVED";
IntentFilter intentFilter=new IntentFilter(action);
registerReceiver(receiver,intentFilter);
}
protected void onDestroy()
{
super.onDestroy();
unregisterReceiver(receiver);
}
案例:拦截电话
activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/sdz"
android:padding="15dp"
tools:context="cn.edu.bzu.myapplication.MainActivity">
<EditText
android:id="@+id/et_ipnumber"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="请输入拦截号码" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/et_ipnumber"
android:layout_centerHorizontal="true"
android:background="#ACD6FF"
android:onClick="click"
android:paddingLeft="5dp"
android:paddingRight="5dp"
android:text="保存拦截号码"
android:textSize="16sp" />
</RelativeLayout>
MainActivity:点击保存拦截号码按钮时事件处理
package cn.edu.bzu.myapplication;
import android.content.SharedPreferences;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private EditText et_ipnumber;
private SharedPreferences sp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_ipnumber = (EditText) findViewById(R.id.et_ipnumber);
//创建SharedPreferences对象
sp = getSharedPreferences("config", MODE_PRIVATE);
}
public void click(View view) {
//获取用户输入的拦截号码
String number = et_ipnumber.getText().toString().trim();
//创建Editor对象,保存用户输入的拦截号码
SharedPreferences.Editor editor = sp.edit();
editor.putString("number", number);
editor.commit();
Toast.makeText(this, "保存成功", Toast.LENGTH_SHORT).show();
}
}
MyReceiver:创建广播接收者MyReceiver
package cn.edu.bzu.myapplication;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
public class MyReceiver extends BroadcastReceiver {
public MyReceiver() {
}
@Override
public void onReceive(Context context, Intent intent) {
//获取拨打的电话号码
String outcallnumber = getResultData();
//创建SharedPreferences对象,获取拦截号码
SharedPreferences sp = context.getSharedPreferences("config", Context.MODE_PRIVATE);
String number = sp.getString("number", "");
//判断是否是拦截电话号码
if (outcallnumber.equals("number")) {
//清楚电话
setResultData(null);
}
}
}
注册广播接受者:
<?xml version="1.0" encoding="utf-8"?>
<manifest ......>
<application ......>
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.NEW_OUTGOING_CALL" />
</intent-filter>
</receiver>
</application>
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
</manifest>
:广播接收者对应的动作。意图过滤器,电话播出的过滤器。
:权限设置