精华内容
下载资源
问答
  • 自定义广播

    2021-05-26 16:31:27
    发送自定义广播自定义广播分为标准(无序)自定义广播以及有序自定义广播:sendBroadcast(Intent intent); //发送标准自定义广播sendOrderedBroadcast(Intent, null); //发送有序自定义广播标准自定义广播是任何满足...

    安卓允许用户发送自定义广播(broadcast),满足接收条件的接收器(receiver)就可以接受自定义广播。

    发送自定义广播

    自定义广播分为标准(无序)自定义广播以及有序自定义广播:

    sendBroadcast(Intent intent); //发送标准自定义广播

    sendOrderedBroadcast(Intent, null); //发送有序自定义广播

    标准自定义广播是任何满足条件的接收器都可以接受。

    有序自定义广播的第二个参数是接受权限,一般为null。有序广播接收器可以设置接收优先级priority,优先级高的先收到广播,并且可以设置截断广播,这样之后的接收器就无法接受广播。

    接受自定义广播

    接受自定义广播一般使用静态接受,即在AndroidManifest.xml中注册接收器,这样应用即使未运行,也可以响应广播:

    ......

    ......

    ......

    示例

    我们新建2个工程:BroadcastTest1和BroadcastTest2。BoardcastTest1的主活动中添加一个按钮发送自定义的广播"Example.MY_Broadcast",然后两个工程中都添加接收器用来接收这个广播,接收后弹出toast通知。项目1的toast要比项目2的先提示。

    先来写项目1发送广播,发送广播要利用Intent类的实例,如下:

    //BroadcastTest1.MainActivity: 项目1的主活动发送广播

    public class MainActivity extends AppCompatActivity {

    @Override

    protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    ... ...

    Button button =(Button)findViewById(R.id.button_broadcast);

    button.setOnClickListener(new View.OnClickListener() {

    @Override

    public void onClick(View v) {

    Intent intent = new Intent("Example.MY_BROADCAST");

    sendOrderedBroadcast(intent, null);

    }

    });

    ... ...

    }

    }

    第一个项目的接收器类,继承BroadcastReceiver并重写其中的onReceive()方法,这个方法就是接收器接收到广播后要执行的,注意的是不要写太多内容,如果onReceive()方法执行时间过长会报错:

    //BroadcastTest1.MyBroadcastReceiver:项目1的接收器类

    public class MyBoardcastReceiver extends BroadcastReceiver {

    @Override

    public void onReceive(Context context, Intent intent) {

    Toast.makeText(context, "BroadcastTest1:Example.MY_BROADCAST", Toast.LENGTH_LONG).show;

    }

    }

    之后要在项目1的主配置文件中注册接收器,并设置优先级为100:

    ......

    ......

    接下来写项目2的接收器,基本上与项目1相同,不过我们不设置优先级,这样一定会先提示项目1的toast。如下:

    //BroadcastTest2.MyBroadcastReceiver:项目2的接收器类

    public class MyBoardcastReceiver extends BroadcastReceiver {

    @Override

    public void onReceive(Context context, Intent intent) {

    Toast.makeText(context, "BroadcastTest2:Example.MY_BROADCAST", Toast.LENGTH_LONG).show;

    }

    }

    ......

    ......

    编译下两个工程测试吧,项目中其他的部分请自行完善。另外,一些非原生安卓ROM实现静态接受广播需要给应用“自动运行”权限。

    关于截断广播

    截断广播在接收器类中使用abortBroadcast()方法,我们修改项目1的接收器类,加上这个方法:

    //BroadcastTest1.MyBroadcastReceiver:项目1的接收器类

    public class MyBoardcastReceiver extends BroadcastReceiver {

    @Override

    public void onReceive(Context context, Intent intent) {

    Toast.makeText(context, "BroadcastTest1:Example.MY_BROADCAST", Toast.LENGTH_LONG).show;

    abortBroadcast();

    }

    }

    再次编译项目1测试,这次只有项目1的toast通知,没有项目2的toast通知。

    展开全文
  • Android自定义广播接收

    2021-06-04 04:20:45
    本文实例为大家分享了Android自定义广播接收的具体代码,供大家参考,具体内容如下实现效果:MainActivity.java代码:package com.henu.broadcastsample;import androidx.appcompat.app.AppCompatActivity;import ...

    本文实例为大家分享了Android自定义广播接收的具体代码,供大家参考,具体内容如下

    实现效果:

    07c2bfa8922a61074393a22b5bc0d174.png

    MainActivity.java代码:

    package com.henu.broadcastsample;

    import androidx.appcompat.app.AppCompatActivity;

    import android.content.Intent;

    import android.content.IntentFilter;

    import android.os.Bundle;

    import android.util.Log;

    import android.view.View;

    import android.widget.Toast;

    public class MainActivity extends AppCompatActivity {

    private MyBroadcastReceiver receiver;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    }

    public void send(View v) {

    //动态注册广播接收

    receiver = new MyBroadcastReceiver();

    String action = "henurjxy";

    IntentFilter intentFilter=new IntentFilter(action);

    registerReceiver(receiver,intentFilter);

    Intent intend = new Intent("henurjxy");

    sendBroadcast(intend);

    }

    //在页面销毁时,注销广播接收者

    @Override

    protected void onDestroy() {

    super.onDestroy();

    unregisterReceiver(receiver);

    }

    }

    MyBroadcastReceiver.java代码:

    package com.henu.broadcastsample;

    import android.content.BroadcastReceiver;

    import android.content.Context;

    import android.content.Intent;

    import android.util.Log;

    import android.widget.Toast;

    public class MyBroadcastReceiver extends BroadcastReceiver {

    public MyBroadcastReceiver(){}

    @Override

    public void onReceive(Context context, Intent intent) {

    Toast.makeText(context,"是我发出的广播哦",Toast.LENGTH_SHORT).show();

    }

    }

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

    时间: 2021-05-11

    展开全文
  • 5.3.1 发送标准广播在发送广播之前,我们还是需要先定义一个广播接收器来准备接收此广播才行,不然发 出去也是白发。因此新建一个 MyBroadcastReceiver 继承自 BroadcastReceiver,代码如下所示:public class ...

    5.3.1    发送标准广播

    在发送广播之前,我们还是需要先定义一个广播接收器来准备接收此广播才行,不然发 出去也是白发。因此新建一个 MyBroadcastReceiver 继承自 BroadcastReceiver,代码如下所示:

    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 中对这个广播接收器进行注册:

    android:versionCode="1" android:versionName="1.0" >

    ……

    ……

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

    接下来修改 activity_main.xml 中的代码,如下所示:

    这里在布局文件中定义了一个按钮,用于作为发送广播的触发点。然后修改 MainActivity中的代码,如下所示:

    public class MainActivity extends Activity {

    ……

    @Override

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

    Button button = (Button) findViewById(R.id.button);

    button.setOnClickListener(new OnClickListener() {

    @Override

    public void onClick(View v) {

    Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");

    }

    });

    ……

    sendBroadcast(intent);

    }

    ……

    }

    可以看到,我们在按钮的点击事件里面加入了发送自定义广播的逻辑。首先构建出了一 个 Intent 对象,并把要发送的广播的值传入,然后调用了 Context 的 sendBroadcast()方法将广 播发送出去,这样所有监听 com.example.broadcasttest.MY_BROADCAST 这条广播的广播接 收器就会收到消息。此时发出去的广播就是一条标准广播。

    重新运行程序,并点击一下 Send Broadcast 按钮,效果如图 5.7 所示。

    6af25274bb26fd1f06cadfb982006877.png

    图   5.7

    这样我们就成功完成了发送自定义广播的功能。另外,由于广播是使用 Intent 进行传递 的,因此你还可以在 Intent 中携带一些数据传递给广播接收器。

    5.3.2    发送有序广播

    广播是一种可以跨进程的通信方式,这一点从前面接收系统广播的时候就可以看出来 了。因此在我们应用程序内发出的广播,其他的应用程序应该也是可以收到的。为了验证这 一点,我们需要再新建一个 BroadcastTest2 项目。

    将项目创建好之后,还需要在这个项目下定义一个广播接收器,用于接收上一小节中的 自定义广播。新建 AnotherBroadcastReceiver 继承自 BroadcastReceiver,代码如下所示:

    public class AnotherBroadcastReceiver extends BroadcastReceiver {

    @Override

    public void onReceive(Context context, Intent intent) { Toast.makeText(context, "received in AnotherBroadcastReceiver",

    Toast.LENGTH_SHORT).show();

    }

    }

    这 里 仍 然 是 在 广 播 接 收 器 的 onReceive() 方 法 中 弹 出 了 一 段 文 本 信 息 。 然 后 在AndroidManifest.xml 中对这个广播接收器进行注册,代码如下所示:

    android:versionCode="1"

    android:versionName="1.0" >

    ……

    ……

    可 以 看 到 , AnotherBroadcastReceiver 同 样 接 收 的 是 com.example.broadcasttest. MY_BROADCAST 这条广播。现在运行 BroadcastTest2 项目将这个程序安装到模拟器上,然 后重新回到 BroadcastTest 项目的主界面,并点击一下 Send Broadcast 按钮,就会分别弹出两 次提示信息,如图 5.8 所示。

    9df203effc2cd7bd80ca7e1a3afdc114.png

    图   5.8

    这样就强有力地证明了,我们的应用程序发出的广播是可以被其他的应用程序接收到的。

    不过到目前为止,程序里发出的都还是标准广播,现在我们来尝试一下发送有序广播。 关闭 BroadcastTest2 项目,然后修改 MainActivity 中的代码,如下所示:

    public class MainActivity extends Activity {

    ……

    @Override

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

    Button button = (Button) findViewById(R.id.button);

    button.setOnClickListener(new OnClickListener() {

    @Override

    public void onClick(View v) {

    Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");

    }});

    sendOrderedBroadcast(intent, null);

    }

    ……

    }

    可 以 看 到 , 发 送 有 序 广 播 只 需 要 改 动 一 行 代 码 , 即 将 sendBroadcast() 方 法 改 成 sendOrderedBroadcast()方法。sendOrderedBroadcast()方法接收两个参数,第一个参数仍然是 Intent,第二个参数是一个与权限相关的字符串,这里传入 null 就行了。现在重新运行程序, 并点击 Send Broadcast 按钮,你会发现,两个应用程序仍然都可以接收到这条广播。

    看上去好像和标准广播没什么区别嘛,不过别忘了,这个时候的广播接收器是有先后顺 序的,而且前面的广播接收器还可以将广播截断,以阻止其继续传播。

    那么该如何设定广播接收器的先后顺序呢?当然是在注册的时候进行设定的了,修改AndroidManifest.xml 中的代码,如下所示:

    android:versionCode="1" android:versionName="1.0" >

    ……

    ……

    可以看到,我们通过 android:priority 属性给广播接收器设置了优先级,优先级比较高的 广播接收器就可以先收到广播。这里将 MyBroadcastReceiver 的优先级设成了 100,以保证它 一定会在 AnotherBroadcastReceiver 之前收到广播。

    既然已经获得了接收广播的优先权,那么 MyBroadcastReceiver 就可以选择是否允许广 播继续传递了。修改 MyBroadcastReceiver 中的代码,如下所示:

    public class MyBroadcastReceiver extends BroadcastReceiver {

    @Override

    public void onReceive(Context context, Intent intent) { Toast.makeText(context, "received in MyBroadcastReceive",

    Toast.LENGTH_SHORT).show();

    abortBroadcast();

    }

    }

    如果在 onReceive()方法中调用了 abortBroadcast()方法,就表示将这条广播截断,后面的 广播接收器将无法再接收到这条广播。现在重新运行程序,并点击一下 Send Broadcast 按钮, 你 会 发 现 , 只 有 MyBroadcastReceiver 中 的 Toast 信 息 能 够 弹 出 , 说 明 这 条 广 播 经 过 MyBroadcastReceiver 之后确实是终止传递了。

    展开全文
  • 项目升级到9.0后,静态注册的自定义广播无法接收,需要改为动态注册;此外,接收到开机广播和点击运行APP(被强制停止后再次启动)时都需要注册,需要避免重复注册。避免重复注册的方法借鉴了单例模式,代码如下:...

    项目升级到9.0后,静态注册的自定义广播无法接收,需要改为动态注册;此外,接收到开机广播和点击运行APP(被强制停止后再次启动)时都需要注册,需要避免重复注册。

    避免重复注册的方法借鉴了单例模式,代码如下:public static class TaskBroadcast extends BroadcastReceiver {

    private TaskBroadcast()

    {

    IntentFilter intentFilter = new IntentFilter();

    intentFilter.addAction(POLL_START_TIMER_BC);

    MyApplication.getContext().registerReceiver(this, intentFilter);

    Log.e(TAG, "TaskBroadcast create");

    }

    private static TaskBroadcast receiver = null;

    private static class innerc{

    static TaskBroadcast receiver = new TaskBroadcast();

    }

    public static void registerTaskBroadCast() {

    Log.w(TAG, "registerTaskBroadCast");

    receiver = innerc.receiver;

    return;

    }

    public static void unRegisterTaskBroadCast() {

    Log.w(TAG, "unRegisterTaskBroadCast");

    if (receiver != null) {

    MyApplication.getContext().unregisterReceiver(receiver);

    }

    }

    @Override

    public void onReceive(Context context, Intent intent) {

    String action = intent.getAction();

    Log.w(TAG, "taskBroadcast:" + action);

    if (POLL_START_TIMER_BC.equals(action)){

    startPoll(context, null);

    }

    }

    }

    内部类innerc的静态变量receiver只会初始化一次,所以构造函数TaskBroadcast()只会执行一次。

    展开全文
  • BroadcastReceiver广播接收者: 负责页面间通信(如两个acticity之间),系统和APP通信,APP和APP通信,比如监听网络连接状态变化,就是通过BroadcastReceiver广播接收者来实现的 部分文字转载自...
  • Android广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的就是广播接收者(广播接收器)。 广播作为Android组件间的通信方式,可以使用的场景如下: 1.同一app内部的同一组件内的消息...
  • 先新建一个广播接收器用于来接收自定义广播:public class MyReceiver extends BroadcastReceiver {public MyReceiver() {}@Overridepublic void onReceive(Context context, Intent intent) {Toast.makeText...
  • 自定义广播分两个步骤:1、发送广播 2、接收广播一、先看如何接收广播:我使用的是Android Studio,File->New->Other->Broadcast Receiver,先创建一个广播类,这个创建的类会自动帮我们继承...
  • 二、自定义BroadcastRecevier private BroadcastReceiver myReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Bundle mybundle = intent.getExtras(); ...
  • 发送自定义广播 布局文件:activity_main.xml 在界面上加一个button和一个textview 2,主界面程序:MainActivity 运行时动态发送广播 动态注册广播接收者:在程序里动态注册一个广播接收者,不同于在清单文件里...
  • 主要实现了监听网络变化的广播自定义广播,用隐士的intent实现拨打电话的功能 NetBroadcastActivity import android.Manifest; import android.content.BroadcastReceiver; import android.content.Context; ...
  • 工做中遇到这样一个需求,须要为按键添加一个亲情号,提供一个接口启动内置的APK,思考再三决定更改Framework,利用广播机制去实现。android1、代码动态自主启动内置APKweb咱们都知道Android系统为咱们提供了不少...
  • 我的原始需求是在PDA上...然后尝试在java层拿到扫描结果后,我进行了一次广播发送,java代码如下public static final String SCANNER_RESULT = "android.intent.action.MY_BROADCAST";final Intent intent = new In...
  • protected-broadcast 系统应用自定义广播规范一、android:sharedUserId=”android.uid.system”系统中所有使用android.uid.system作为共享UID的APK,都会首先在manifest节点中增加 android:sharedUserId=”android....
  • 自定义通知栏图标?不是很简单么。自定义布局都不在话下!是的,有xml布局文件当然一切都很简单,如果不给你布局文件用呢?听我慢慢道来!首先怎么创建一个通知呢?1.new 一个Notificationn=newNotification(android....
  • 泰凌微8258入门教程 进阶篇⑨——Mesh 发送自定义广播
  • Android O对隐式广播进行了限制, 其限制链接说明如下: 广播限制 上面所说即:若App的TargetSDK达到了26, 我们正常静态注册的广播就没有用了。能用的仅有以下豁免的Broadcast, 包括我们自己正常发广播,如果不...
  • --- a/sprd/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/sprd/frameworks/base/services/core...@@ -16048,7 +16048,11 @@ public class ActivityManagerService ext
  • 自定义广播与广播类型 文章目录 前言 一、广播机制是什么? 二、使用步骤 1.item(.xml) 2.java代码(Activity) 总结 前言 广播是运用组件之间传递消息的机制 一、广播机制是什么 分为自定义广播...
  • 本篇博客主要介绍如何解决Android7.0新增的广播权限验证问题,这个还得从一个项目上说起,在项目上需要使用广播进行跨进程通信,在7.0之前的版本测试都是OK,在7.0上搞死接收不到发送的广播,关键不是这个,关键是...
  • 第一步:自定义广播 /*** *@Constants.ACTION_SEND_MSG是自定义的action名 *例如:android.intent.action.PACKAEG_REMOVED *@Constants.KEY_CONTENT是自定义的key值(KEY-VALUE) */ //该函数绑定点击事件 ...
  • 广播发送者 接收者广播接收者广播接收者简单地说就是接收广播意图的Java类,此Java类继承BroadcastReceiver类,重写:public void onReceive(Context context,Intent intent),其中intent可以获得传递的数据;广播...
  • Android 自定义广播

    2021-03-02 08:44:50
    一、activity_broadcast.xml 代码 二、MyBroadcastActivity.java 代码 // 自定义广播 public void sendMyBroadcast(View view){ // 手动发送自定义广播 Intent intent = new Intent(); // 设置自定义发送广播的标识 ...
  • 20120415/.classpath20120415/.project20120415/.settings/org.eclipse.jdt.core.prefs20120415/AndroidManifest.xml20120415/bin/20120415.apk20120415/bin/classes/com/Bc/bcv/C20120415broadcastReceiver$1.class...
  • 解决发送自定义广播无法收到的问题 参考了 https://blog.csdn.net/kongqwesd12/article/details/78998151 方法一: 使用动态广播,不在AndroidManifest.xml文件中对Broadcast Receicer进行静态注册,取而代之使用在代码...
  • 《第一行代码(第2版)》5.3.1和5.3.2在模拟器上和真机上运行有些问题,...在同一个进程上发送自定义广播并接收:首先建一个BroadcastTest空项目第一步:使用Android Studio提供的快捷方式来创建一个广播接收器来准...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 81,923
精华内容 32,769
关键字:

自定义广播