Android Studio跨APP(进程)发送自定义广播

《第一行代码(第2版)》5.3.1和5.3.2在模拟器上和真机上运行有些问题,这里我讲一下我的解决办法

我们知道注册广播的方式一般有两种:

1.在代码中注册(也被称为动态注册)。

2.AndroidManifest.xml中注册(也被称为静态注册)。

在同一个进程上发送自定义广播并接收:

首先建一个BroadcastTest空项目

第一步:使用Android Studio提供的快捷方式来创建一个广播接收器来准备接收此广播,点击app—>New—>Other—>Broadcast Receiver,这里将广播接收器命名为MyBroadcastReceiver

public class MyBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,"received in MyBroadcastReceiver",Toast.LENGTH_SHORT).show();
    }
}

当MyBroadcastReceiver收到自定义广播时会弹出“received in MyBroadcastReceiver”的提示

第二步:在AndroidManifest.xml中对这个广播接收器进行修改

<manifest ...>

         <application ...>

       <receiver
            android:name=".MyBroadcastReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="com.example.broadcasttest.MY_BROADCAST"/>
            </intent-filter>
        </receiver>

       </application>

</manifest>

这里让MyBroadcastReceiver接收一条值为com.example.broadcasttest.MY_BROADCAST的广播,因此待会儿发送广播时我们需要发出这样的一条广播。

第三步:修改activity_main.xml中的代码

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/button"
    android:text="Send Broadcast"/>
</LinearLayout>

这里定义了一个按钮用于作为发送广播的触发点

第四步:修改MainActivity中的代码

  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
                intent.setComponent(new ComponentName("com.example.broadcasttest",
                       "com.example.broadcasttest.MyBroadcastReceiver"));
                sendBroadcast(intent);
          }
        });

注意:(书上没有)这里在用sendBroadcast(intent)把广播发送出去之前调用了 setComponent方法指定广播接收器,效果图如下(此处我是模拟器测试需要调用该方法,但是真机测试没有该方法也能接收到)

setComponent(new ComponentName(指定接收的包,指定接收器)

跨App(进程)发送自定义广播:(下面的内容部分书上没有)

第一步:需要在上一个项目的AndroidManifest.xml添加

    <uses-permission android:name="com.example.broadcasttest.MY_BROADCAST"/>
    <permission
        android:name="com.example.broadcasttest.MY_BROADCAST"
        android:protectionLevel="signature" >
    </permission>

第二步:需要修改上一个项目的MainActivity

  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //设置你这个广播的action,只有和这个action一样的接受者才能接收广播
                Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
                /*intent.setComponent(new ComponentName("com.example.broadcasttest",
                       "com.example.broadcasttest.MyBroadcastReceiver"));
                sendBroadcast(intent);*/
                sendBroadcast(intent,"com.example.broadcasttest.MY_BROADCAST");
          }
        });

第三步:新建一个项目BroadcastTest2,按照上面第一步新建一个广播接收器AnotherBroadcastReceiver

public class AnotherBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
       // intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        Toast.makeText(context,"received in AnotherBroadcastReceiver",Toast.LENGTH_LONG).show();
    }
}

第四步:修改第二个项目的Manifest.xml

 <uses-permission android:name="com.example.broadcasttest.MY_BROADCAST" />
        <receiver
            android:name=".AnotherBroadcastReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter >
                <action android:name="com.example.broadcasttest.MY_BROADCAST"/>
            </intent-filter>
        </receiver>

最后在模拟器上(真机上测试我只有第一个广播接收器接收到广播)运行第二个项目,跳转到第一个项目,点击按钮,效果如图

注:上面的两个图是从网上截图下来的

发布了12 篇原创文章 · 获赞 8 · 访问量 5672

猜你喜欢

转载自blog.csdn.net/dreamer2333/article/details/98204685