文章目录
广播接收者
Android中的广播接收者就好像我们生活中的收音机一样,Android系统内部已经定义好了发送广播的电台和一些广播事件(外拨电话、短信到来、sd卡的状态等),而Android中我们使用的是 broadcastReceiver去接收系统预定义好的事件。
定义广播接收者的步骤
- 自定义类继承broadcastReceiver类
- 在清单文件中配置receiver
- 并增加相应的权限
ip拨号器的案例
通过将用户输入的区号用SharedPreferences保存,然后如果用户拨打的号码如果以“0”开头,就加上用户输入的区号
activity_main.xml文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/et_num"
android:hint="请输入IP号码"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="click"
android:text="保存"/>
</LinearLayout>
MainActivity类
package com.dsl.ipCall;
import androidx.appcompat.app.AppCompatActivity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
EditText num;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
num = findViewById(R.id.et_num);
}
public void click(View v){
String numIP = num.getText().toString().trim();
if (numIP.equals("")){
SharedPreferences sp = getSharedPreferences("config", 0);
sp.edit().putString("num",numIP).commit();
Toast.makeText(getApplicationContext(),"你使用了默认区号",Toast.LENGTH_SHORT).show();
}else{
SharedPreferences sp = getSharedPreferences("config", 0);
sp.edit().putString("num",numIP).commit();
Toast.makeText(getApplicationContext(),"保存区号成功",Toast.LENGTH_SHORT).show();
}
}
}
广播接收者类
package com.dsl.ipCall;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
public class MyReceiver extends BroadcastReceiver {
//当接收广播的时候调用
@Override
public void onReceive(Context context, Intent intent) {
// TODO: This method is called when the BroadcastReceiver is receiving
// an Intent broadcast.
//把用户输入的IP号码获取出来
SharedPreferences sp = context.getSharedPreferences("config", 0);
String num = sp.getString("num", "");
String currentNum = getResultData();
// System.out.println("currentNum:"+currentNum);
if (currentNum.startsWith("0")){
//修改拨打电话的号码
setResultData(num+currentNum);
}
}
}
清单文件
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.dsl.ipCall">
<!-- 增加外拨电话的权限-->
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<!-- 注册广播接收者-->
<receiver
android:name="com.dsl.ipCall.MyReceiver"
>
<intent-filter>
<!-- 具体定义哪种广播-->
<action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
</intent-filter>
</receiver>
<activity android:name="com.dsl.ipCall.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
短信监听机制
通过广播接收者获取短信的内容和发送的地址
SmSReceiver类
package com.dsl.sms;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.SmsManager;
import android.telephony.SmsMessage;
public class SmSReceiver extends BroadcastReceiver {
//当接收短信的时候执行
@Override
public void onReceive(Context context, Intent intent) {
// System.out.println("hahahahaha");
//获取发送者的号码和发送内容
Object [] objects = (Object[]) intent.getExtras().get("pdus");
for (Object object :objects){
//获取SmsMessage的实例
SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) object);
//获取发送短信的内容和地址
String content = smsMessage.getDisplayMessageBody();
String address = smsMessage.getOriginatingAddress();
System.out.println("内容为:"+content+"--------"+"号码为:"+address);
}
}
}
清单文件
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.dsl.sms">
增加短信接收的权限
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<receiver android:name=".SmSReceiver">
<intent-filter>
定义接收短信的行为
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
有序广播和无序广播
不同点:
- 有序广播可以被终止
- 有序广播的数据可以被修改
- 而无序广播不行
无序广播
无序广播是完全异步执行,发送广播时所有监听这个广播的广播接收者都会接收到此消息,但接收的顺序不确定
自定义无序广播
自定义发送广播
通过按钮的点击发送广播
package com.dsl.customersendbroadcast;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void click (View v){
Intent intent = new Intent();
intent.setAction("com.dsl.customer");
intent.putExtra("name","新闻联播开播了");
sendBroadcast(intent);
}
}
定义广播接收者
package com.dsl.receiverbroadcast;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String name = intent.getStringExtra("name");
Toast.makeText(context.getApplicationContext(),name,Toast.LENGTH_SHORT).show();
}
}
/**
注意要在清单文件中定义的action要和广播设置的action保持一致
*/
有序广播
按照接收者的优先级接收,只有一个广播接收者能接收消息,在此广播接收者中逻辑执行完毕后,才会继续传递。
自定义有序广播
package com.dsl.broadcast;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
//点击发送有序广播
public void click(View v){
Intent intent = new Intent();
intent.setAction("com.dsl.broadcast");
/**
* 第一个参数:意图对象
* 第二个参数:接收的权限
* 第三个参数:最终的接收者
* 第四个参数:handler类型
* 第五个参数:初始码
* 第六个参数:初始化数据
* 第七个参数:额外的初始化
*/
sendOrderedBroadcast(intent,null,new FinalBroadcast(),null,1,"我给你送了1000个快递",null);
}
}
定义最终的接收者用于监听广播
package com.dsl.broadcast;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class FinalBroadcast extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String content = getResultData();
Toast.makeText(context.getApplicationContext(), "最终的接收者:" + content, Toast.LENGTH_SHORT).show();
}
}
定义多个接收者
package com.dsl.receiverorderbroadcast;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class FirstReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//获取广播携带的数据
String content = getResultData();
Toast.makeText(context.getApplicationContext(), "第一个接收者:" + content, Toast.LENGTH_SHORT).show();
//修改数据
setResultData("我接收到800个快递");
}
}
package com.dsl.receiverorderbroadcast;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class SecondReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//获取广播携带的数据
String content = getResultData();
Toast.makeText(context.getApplicationContext(), "第二个接收者:" + content, Toast.LENGTH_SHORT).show();
//终止广播
abortBroadcast();
setResultData("我接收到600个快递");
}
}
```java
package com.dsl.receiverorderbroadcast;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class ThirdReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//获取广播携带的数据
String content = getResultData();
Toast.makeText(context.getApplicationContext(), "第三个接收者:" + content, Toast.LENGTH_SHORT).show();
setResultData("我接收到400个快递");
}
}
```java
package com.dsl.receiverorderbroadcast;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class ForthReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//获取广播携带的数据
String content = getResultData();
Toast.makeText(context.getApplicationContext(), "第四个接收者:" + content, Toast.LENGTH_SHORT).show();
}
}