Android广播实验

【实验目的】

  1. 了解使用Intent进行组件通信的原理;
  2. 了解Intent过滤器的原理和匹配机制;
  3. 掌握发送和接收广播的方法

【实验内容】

任务1、普通广播;

任务2、系统广播;

任务3、有序广播;

【实验要求】

1、练习使用静态方法和动态方法注册广播接收器

2、练习发送广播消息的方法;

【实验设计】

src/main/java/com/example/broadcastdemo/:包含所有的Java类文件。

MainActivity.java:应用的主活动,负责发送普通和有序广播。

NormalBroadcastReceiver.java:接收普通广播的接收器。

OrderedBroadcastReceiver.java:接收有序广播的接收器。

src/main/res/:包含资源文件。

layout/:包含布局文件。

activity_main.xml:主活动的布局。

activity_second.xml:第二个活动的布局。

mipmap/:包含应用图标资源。

values/:包含字符串和其他资源值。

AndroidManifest.xml:定义应用的配置,包括活动、接收器等组件。

关键组件:

活动(Activity):

MainActivity:定义了发送广播的按钮和逻辑。

SecondActivity:未在代码中定义,但布局文件存在。

广播接收器(BroadcastReceiver):

NormalBroadcastReceiver:接收自定义的普通广播。

OrderedBroadcastReceiver:接收自定义的有序广播。

布局文件(XML):

activity_main.xml和activity_second.xml:定义了用户界面,包含发送广播的按钮。

【实验结果】

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.broadcastdemo">

    <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">

        <activity android:name=".MainActivity"
            android:exported="true"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity android:name=".SecondActivity"
            android:label="@string/app_name" />

        <!-- 普通广播接收器 -->
        <receiver android:name=".NormalBroadcastReceiver"
            android:exported="false">
            <intent-filter>
                <action android:name="com.example.broadcast.normal" />
            </intent-filter>
        </receiver>

        <!-- 系统广播接收器 -->
        <receiver android:name=".SystemBroadcastReceiver"
            android:exported="false">
            <intent-filter>
                <action android:name="android.intent.action.BATTERY_CHANGED" />
            </intent-filter>
        </receiver>

        <!-- 有序广播接收器 -->
        <receiver android:name=".OrderedBroadcastReceiver"
            android:exported="false">
            <intent-filter>
                <action android:name="com.example.broadcast.ordered" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </receiver>
    </application>
</manifest>

MainActivity.java

package com.example.broadcastdemo;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {
    private NormalBroadcastReceiver normalBroadcastReceiver;
    private SystemBroadcastReceiver systemBroadcastReceiver;
    private OrderedBroadcastReceiver orderedBroadcastReceiver;

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

        // 初始化广播接收器
        normalBroadcastReceiver = new NormalBroadcastReceiver();
        systemBroadcastReceiver = new SystemBroadcastReceiver();
        orderedBroadcastReceiver = new OrderedBroadcastReceiver();

        // 设置按钮监听器
        Button sendNormalBtn = findViewById(R.id.send_normal_btn);
        sendNormalBtn.setOnClickListener(view -> sendNormalBroadcast());

        Button sendOrderedBtn = findViewById(R.id.send_ordered_btn);
        sendOrderedBtn.setOnClickListener(view -> sendOrderedBroadcast());
    }

    @Override
    protected void onResume() {
        super.onResume();
        // 动态注册广播接收器
        IntentFilter normalFilter = new IntentFilter("com.example.broadcast.normal");
        registerReceiver(normalBroadcastReceiver, normalFilter);

        IntentFilter systemFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
        registerReceiver(systemBroadcastReceiver, systemFilter);

        IntentFilter orderedFilter = new IntentFilter("com.example.broadcast.ordered");
        registerReceiver(orderedBroadcastReceiver, orderedFilter);
    }

    @Override
    protected void onPause() {
        super.onPause();
        // 动态注销广播接收器
        unregisterReceiver(normalBroadcastReceiver);
        unregisterReceiver(systemBroadcastReceiver);
        unregisterReceiver(orderedBroadcastReceiver);
    }

    // 发送普通广播
    private void sendNormalBroadcast() {
        Intent intent = new Intent("com.example.broadcast.normal");
        sendBroadcast(intent);
    }

    // 发送有序广播
    private void sendOrderedBroadcast() {
        Intent intent = new Intent("com.example.broadcast.ordered");
        sendOrderedBroadcast(intent, null); // null表示没有权限限制
    }
}

NormalBroadcastReceiver.java

package com.example.broadcastdemo;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class NormalBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // 接收到普通广播后的处理逻辑
        Log.d("Broadcast", "Received normal broadcast");
    }
}

OrderedBroadcastReceiver.java

package com.example.broadcastdemo;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class OrderedBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // 接收到有序广播后的处理逻辑
        Log.d("Broadcast", "Received ordered broadcast");
    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/send_normal_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Send Normal Broadcast"
        app:layout_constraintBottom_toTopOf="@+id/send_ordered_btn"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/send_ordered_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Send Ordered Broadcast"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/send_normal_btn" />
</androidx.constraintlayout.widget.ConstraintLayout>

activity_second.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".SecondActivity">

    <Button
        android:id="@+id/send_normal_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Send Normal Broadcast"
        app:layout_constraintBottom_toTopOf="@+id/send_ordered_btn"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/send_ordered_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Send Ordered Broadcast"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/send_normal_btn" />

</androidx.constraintlayout.widget.ConstraintLayout>

【实验分析或心得】

第一部分:Android组件和生命周期

Activity:

MainActivity展示了如何动态注册和注销广播接收器。

活动的生命周期方法(如onCreate、onResume、onPause)用于管理资源和状态。

BroadcastReceiver:

NormalBroadcastReceiver和OrderedBroadcastReceiver展示了如何接收和处理广播。

广播接收器可以是动态注册的,也可以在AndroidManifest.xml中静态声明。

Intent和IntentFilter:

使用Intent发送广播,IntentFilter用于过滤和接收特定的广播。

第二部分:广播机制和应用配置

广播机制:

普通广播(Normal Broadcast):无序发送,所有接收器几乎同时接收。

有序广播(Ordered Broadcast):按优先级顺序发送,可以被拦截和修改。

应用配置:

AndroidManifest.xml定义了应用的组件和权限。

每个组件(如活动、接收器)都需要在清单文件中声明。

资源管理:

布局文件(XML)定义了用户界面,使用ConstraintLayout进行布局设计。

好的,Android Studio 的消息广播实验可以通过以下步骤完成: 1. 创建一个新的项目 在 Android Studio 中创建一个新的项目,并在应用程序的主活动中添加以下代码: ``` public class MainActivity extends AppCompatActivity { private Button broadcastButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); broadcastButton = findViewById(R.id.broadcast_button); broadcastButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent("com.example.broadcast.MY_ACTION"); sendBroadcast(intent); } }); } } ``` 在此代码段中,我们创建了一个按钮,当用户单击按钮时,会发送一个名为“com.example.broadcast.MY_ACTION”的广播。 2. 创建一个广播接收器 在应用程序中创建一个新的广播接收器,以便我们可以接收到发送的广播。为此,请创建一个新的 Java 类,并在其中添加以下代码: ``` public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "Broadcast received!", Toast.LENGTH_SHORT).show(); } } ``` 在此代码段中,我们创建了一个新的广播接收器,并在接收到广播时显示一个短暂的 Toast 消息。 3. 注册广播接收器 在 AndroidManifest.xml 文件中,添加以下内容以注册广播接收器: ``` <receiver android:name=".MyBroadcastReceiver" android:exported="true"> <intent-filter> <action android:name="com.example.broadcast.MY_ACTION" /> </intent-filter> </receiver> ``` 在此代码段中,我们将 MyBroadcastReceiver 类注册为接收名为“com.example.broadcast.MY_ACTION”的广播。 4. 运行应用程序 现在,您可以运行应用程序并单击“发送广播”按钮。您应该能够看到一个短暂的 Toast 消息,指示广播已成功接收。 这就是 Android Studio 中消息广播实验的基本步骤。您可以根据需要进行修改和扩展,以满足您的特定需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值