首页 / 任务警报

详细介绍:高版本Android跨应用广播通信实例

2025-12-04 09:46:58任务警报 534

在高版本的Android上,应用间发送广播需要特别注意权限和导出设置。以下是完整的发送和接收广播的代码示例:

1. 发送广播的应用AndroidManifest.xml 配置

package="com.example.sender">

android:allowBackup="true"

android:icon="@mipmap/ic_launcher"

android:label="@string/app_name">

android:name=".MainActivity"

android:exported="true">

MainActivity.java

package com.example.sender;

import android.content.Intent;

import android.os.Bundle;

import android.view.View;

import android.widget.Button;

import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity

extends AppCompatActivity {

private static final String CUSTOM_ACTION = "com.example.CUSTOM_BROADCAST";

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

Button sendButton = findViewById(R.id.send_button);

sendButton.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

sendCustomBroadcast();

}

});

}

private void sendCustomBroadcast() {

Intent intent = new Intent(CUSTOM_ACTION);

// 添加接收应用的包名,提高安全性(必要,注意是接收应用的包名,不是发送应用的包名)

intent.setPackage("com.example.receiver");

// 传递数据

intent.putExtra("message", "Hello from sender app!");

intent.putExtra("timestamp", System.currentTimeMillis());

try {

// 发送广播

sendBroadcast(intent);

Toast.makeText(this, "Broadcast sent successfully", Toast.LENGTH_SHORT).show();

} catch (Exception e) {

Toast.makeText(this, "Failed to send broadcast: " + e.getMessage(),

Toast.LENGTH_SHORT).show();

}

}

}

2. 接收广播的应用AndroidManifest.xml 配置

package="com.example.receiver">

android:allowBackup="true"

android:icon="@mipmap/ic_launcher"

android:label="@string/app_name">

android:name=".MainActivity"

android:exported="true">

android:name=".CustomBroadcastReceiver"

android:exported="true"

android:enabled="true">

CustomBroadcastReceiver.java

package com.example.receiver;

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.util.Log;

import android.widget.Toast;

public class CustomBroadcastReceiver

extends BroadcastReceiver {

private static final String TAG = "CustomBroadcastReceiver";

@Override

public void onReceive(Context context, Intent intent) {

if (intent != null &&

"com.example.CUSTOM_BROADCAST".equals(intent.getAction())) {

// 获取传递的数据

String message = intent.getStringExtra("message");

long timestamp = intent.getLongExtra("timestamp", 0);

Log.d(TAG, "Received broadcast: " + message + ", timestamp: " + timestamp);

// 显示通知或Toast

Toast.makeText(context, "Received: " + message, Toast.LENGTH_LONG).show();

// 可以启动Activity或Service来处理数据

Intent activityIntent = new Intent(context, MainActivity.class)

;

activityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

activityIntent.putExtra("received_message", message);

context.startActivity(activityIntent);

}

}

}

MainActivity.java (接收应用的主Activity)

package com.example.receiver;

import android.os.Bundle;

import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity

extends AppCompatActivity {

private TextView messageTextView;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

messageTextView = findViewById(R.id.message_text);

// 检查是否有从广播传递过来的消息

String receivedMessage = getIntent().getStringExtra("received_message");

if (receivedMessage != null) {

messageTextView.setText("Received message: " + receivedMessage);

}

}

}

3. 布局文件发送应用的 activity_main.xml

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"

android:padding="16dp">

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="Sender App"

android:textSize="24sp"

android:layout_marginBottom="32dp" />

android:id="@+id/send_button"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="Send Broadcast" />

接收应用的 activity_main.xml

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"

android:padding="16dp">

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="Receiver App"

android:textSize="24sp"

android:layout_marginBottom="32dp" />

android:id="@+id/message_text"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="Waiting for broadcast..."

android:textSize="16sp" />

4. 安全注意事项使用权限保护(可选)如果需要更高级别的安全保护,可以添加自定义权限:

在接收应用的 AndroidManifest.xml 中添加:

android:name="com.example.receiver.CUSTOM_PERMISSION"

android:protectionLevel="signature" />

在发送应用中:

在发送广播时:

intent.putExtra("message", "Hello from sender app!");

sendBroadcast(intent, "com.example.receiver.CUSTOM_PERMISSION");

关键要点:导出:接收广播的组件必须设置 android:exported="true"安全性:使用特定的包名和自定义Action来避免广播被其他应用拦截权限:根据需要添加适当的权限声明Intent Filter:确保发送和接收的Action字符串完全匹配这样配置后,两个应用就可以在Android高版本上正常发送和接收广播了。