为了监听广播事件,Android中提供了一个BroadcastReceiver组件,该组件可以监听来自系统或者应用程序的广播。当Android系统产生一个广播事件时,可以有多个对应的BroadcastReceiver接受并进行处理。这些广播接收者只需要在清单文件或者代码中进行注册并指定要接受的广播事件,然后创建一个类继承自BroadcastReceiver类,重写onReceiver()方法,在方法中进行处理。
广播接收者之拦截电话实现界面如下:
1.创建程序:程序对应的布局文件(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:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/sdz"
android:padding="15dp"
tools:context=".MainActivity">
<EditText
android:id="@+id/et_ipnumber"
android:layout_width="match_parent"
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>
2.编写页面交互代码:(MainActivity):
package cn.itcast.interceptcall;
import android.Manifest;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private EditText et_ipnumber;
private SharedPreferences sp;
OutCallReceiver outCallReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(ContextCompat.checkSelfPermission(this, Manifest.permission.PROCESS_OUTGOING_CALLS)!= PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.PROCESS_OUTGOING_CALLS},1);
}
et_ipnumber = (EditText) findViewById(R.id.et_ipnumber);
// 创建SharedPreferences对象
sp = getSharedPreferences("config", MODE_PRIVATE);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode){
case 1:if(grantResults.length>0&&grantResults[0]==PackageManager.PERMISSION_GRANTED){
}else{
Toast.makeText(this,"You dennied the permission",Toast.LENGTH_SHORT).show();
}
break;
default:
}
}
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();
}
}
3.运行程序
4.监听广播事件:创建一个广播接收者接受外拨电话的广播。
广播接收者OutCallReceiver代码如下:
package cn.itcast.interceptcall;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
public class OutCallReceiver extends BroadcastReceiver {
@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);
}
}
}
创建完广播之后需要注册,注册代码如下
<receiver
android:name=".OutCallReceiver"
android:enabled="true"
android:exported="true" >
<intent-filter android:priority="1000">
<action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
</intent-filter>
</receiver>
5.测试:
输入需要拦截的号码,按保存拦截号码,会出现是否保存,按下是后,则会提示保存成功。