示例
本示例将向您说明如何创建BroadcastReceiver来拦截自定义意图。熟悉自定义意图后,即可对应用程序进行编程以拦截系统生成的意图。因此,让我们按照以下步骤修改我们在
Hello World示例一章中创建的Android应用程序-
- 您将使用Android Studio创建一个Android应用程序,并将其命名为HelloWorld,位于com.jc2182.demo.helloworld包下。
- 修改主活动文件MainActivity.java以添加broadcastIntent()方法。
- 在com.jc2182.demo.helloworld包下创建一个名为MyReceiver.java的新Java文件, 以定义BroadcastReceiver。
- 应用程序可以处理一个或多个自定义和系统意图,而没有任何限制。您要拦截的每个意图都必须使用<receiver ... />标记注册到您的AndroidManifest.xml文件中
- 修改res/layout/activity_main.xml文件的默认内容,以包括一个用于广播意图的按钮。
- 运行该应用程序以启动Android模拟器并验证在该应用程序中所做更改的结果。
以下是修改后的主要活动文件MainActivity.java的内容。该文件可以包括每个基本生命周期方法。我们添加了broadcastIntent()方法以广播自定义意图。
package com.jc2182.helloworld;
import androidx.appcompat.app.AppCompatActivity;
import android.content.ComponentName;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends AppCompatActivity {
/** 在第一次创建activity时调用。 */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
// 广播自定义意图。
public void broadcastIntent(View view){
Intent intent = new Intent();
intent.setAction("com.test.CUSTOM_INTENT");
// 这里ComponentName 第一个参数是 包名 ,第二个参数是广播接收器的类路径
intent.setComponent(new ComponentName("com.jc2182.helloworld","com.jc2182.helloworld.MyReceiver"));
sendBroadcast(intent);
}
}
以下是MyReceiver.java的内容:
package com.jc2182.helloworld;
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) {
Toast.makeText(context, "检测到意图。", Toast.LENGTH_LONG).show();
}
}
以下将修改AndroidManifest.xml文件的内容 。在这里,我们添加了<receiver ... />标签以包括我们的广播接收器:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.jc2182.helloworld">
<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">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name=".MyReceiver" >
<intent-filter>
<action android:name="com.test.CUSTOM_INTENT">
</action>
</intent-filter>
</receiver>
</application>
</manifest>
以下是res/layout/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:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Broadcast 例子"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:textSize="30dp" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="蝴蝶教程 "
android:textColor="#ff87ff09"
android:textSize="30dp"
android:layout_above="@+id/imageButton"
android:layout_centerHorizontal="true"
android:layout_marginBottom="40dp" />
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageButton"
android:src="@drawable/logo"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/imageButton"
android:layout_centerHorizontal="true"
android:layout_marginTop="55dp"
android:onClick="broadcastIntent"
android:text="广播意图" />
</RelativeLayout>
让我们尝试运行修改后的Hello World!我们刚刚修改的应用程序。我假设您在进行环境设置时已创建了AVD。要从Android Studio运行该应用,请打开您项目的活动文件之一,然后点击Android StudioRun图标工具栏中的“运行” 图标。Android Studio将应用程序安装在您的AVD上并启动它,如果设置和应用程序一切正常,它将显示在“模拟器”窗口下面-
现在启动广播接收器,让我们单击“广播意图”按钮,这将启动广播接收器,一条广播消息将出现在模拟器的底部,如下所示: