当前位置: 首页 > 知识库问答 >
问题:

使用哪种广播接收器?

邓季
2023-03-14

我在这里读了这个答案,也在这里读了这个答案,我正在努力找出最适合我的情况。

我在onCreate()中启动一个服务,在这里我发出一个HTTP请求,并得到一个id作为响应。然后我广播这个id,并在我的活动中接收它。

问题是,用户显然可以通过打开抽屉并选择一个选项导航到另一个活动,而我可能会错过广播。

很明显,我可以让我的所有活动扩展一个抽象类,这个抽象类扩展了这里提到的Activity,但我不能100%肯定这是最好的解决方案。如果用户在我收到id之前决定退出应用程序怎么办?

编辑:应用程序架构

  • 用户使用打开照相机应用程序并获取图像文件路径的意图捕获图像

问题是:如果uer在quizaActivity上关闭应用程序,而我还没有收到id,或者用户决定使用抽屉进入另一个活动而不添加测验,该怎么办。我仍然需要启动一项服务并上传带有“空测验数据”的id


共有2个答案

林冥夜
2023-03-14

也许你可以发送一个粘性广播。即使活动被销毁,系统也会保留该意图,当您的注册财产接收人收到该意图时,您可以立即收到该意图。

但通知sendStickyBroadcast被弃用,不要忘记声明

android.permission.BROADCAST_STICKY

在你的清单上。xml,如果您决定使用它。

蒋默
2023-03-14

这很好,通过使用抽象类,您可以在其中处理所有操作,并向您的活动发送回调。在我看来,在你上面的问题中使用这个例子就像是EventBus。

更好的是使用特殊类和接口,而不是抽象类,因为您可能需要使用FragmentActivity、AppCombatActivity等。

例如,你有自己的类,它从你的服务接收结果,并向他发送所有注册的活动。调用具有接口的网络请求的结果:

public class NetRequestReceiver extends BroadcastReceiver {

private List<Activities> registeredActivities;

public static void getInstance () {
    //Continue singleton initialing!
    //....
}

@Override
public void onReceive(Context context, Intent intent) {
    for (Activity act : registeredActivities) {
         if (act instanceOf ReceivingCallback) {
             act.onReceiveMessage(intent);
         } else throw Exception("Activity missing ReceivingCallback");
    }
}    

public void registerActivity (Activity, activity) {
    if (!registeredActivities.contains(activity)) {
        registeredActivities.add(activity);
    }
}

public void unRegisterActivity (Activity, activity) {
    if (registeredActivities.contains(activity)) {
        registeredActivities.remove(activity);
    }
}

public interface ReceivingCallback {
    onReceiveMessage (Intent intent);
}

}

然后在所有活动中添加下一个监听器。但是(!)别忘了在你上面注册接收器接收结果的服务!

public class MainActivity extends Activity implements NetRequestReceiver.ReceivingCallback {

public void onStop () {
    super.onStop()
    NetRequestReceiver.getInstance().unRegisterActivity(this);
}

public void onResume () {
    super.onResume()
    NetRequestReceiver.getInstance().registerActivity(this);
}

@Override
public onReceiveMessage (Intent intent) {
   //put here whaterver you want your activity 
   //to do with the intent received
}
}

使用上面的设计,你认为我们得到了什么?我们现在有了单接收器和回调作为接口。所以您可以使用Fragment、Activity、FragmentActivity和其他类,通过广播和(!)从服务接收结果没有复制粘贴相同的行为!

另外,它看起来很不错,因为我们划分了不同的层-表示层、视图层和接收器层。您在服务中调用网络请求。该服务将结果发送到广播,然后他将数据发送到所有注册的活动。

是的,它看起来像是EventBus,但根据您的问题,它正是您需要的,用于侦听从服务到不同活动的连接,并且具有更好的结构。

 类似资料:
  • 问题内容: 有人可以解释和之间的确切区别吗? 在什么情况下我们必须使用每个Receiver类? 问题答案: 和之间只有一个区别。 当您收到内部广播方法时, 假设, BroadcastReceiver : 它 不保证 该 CPU将保持清醒 ,如果你启动一些长时间运行的进程。CPU可能会立即回到睡眠状态。 WakefulBroadcastReceiver : 这是 保证 该 CPU将保持清醒 ,直到你

  • 我是android新手。我的项目有一个活动和一个服务。我的服务有一个广播接收器,而活动有一个广播发送器,它在PeriodSender方法中。动态地,当我注册接收者时,在服务开始时它不会调用,但是如果我在几分钟后发送了一些东西,它就会调用。但是我想在清单中注册它,我已经在清单中包含了接收方的详细信息,但是接收方没有调用。我的接收方类名是MyReceiver21,意图操作是My_ACTION1。实际上

  • 4.2.1.3 内部广播接收器 内部广播接收器是广播接收器,它将永远不会收到从内部应用以外发送的任何广播。 它由几个内部应用组成,用于保护内部应用处理的信息或功能。 要点(接收广播): 定义内部签名权限来接收广播。 声明使用内部签名权限来接收结果。 将导出属性显式设置为true。 需要静态广播接收器定义的内部签名权限。 需要内部签名来注册动态广播接收器。 确认内部签名权限是由内部应用定义的。 尽管

  • 4.2.1.2 公共广播接收器 公共广播接收器是可以从未指定的大量应用程序接收广播的广播接收器,因此有必要注意,它可能从恶意软件接收广播。 要点(接收广播): 将导出属性显式设为true。 小心并安全地处理收到的意图。 返回结果时,不要包含敏感信息。 公共广播接收器的示例代码可以用于静态和动态广播接收器。 PublicReceiver.java package org.jssec.android.

  • 4.2.1.1 私有广播接收器 私人广播接收器是最安全的广播接收器,因为只能接收到从应用内发送的广播。 动态广播接收器不能注册为私有,所以私有广播接收器只包含静态广播接收器。 要点(接收广播): 将导出属性显示设为false 小心并安全地处理收到的意图,即使意图从相同的应用中发送 敏感信息可以作为返回结果发送,因为请求来自相同应用 AndroidManifest.xml <?xml version

  • 问题内容: 好的,我已经尝试了Stack上的所有解决方案,但没有任何效果。我当前的方法从MainActivity注册了“ SmsListener”接收器。我要做的就是初始化onReceive方法。没有错误;它根本不是在广播。我究竟做错了什么?在此处粘贴适用的代码。可能需要的其他任何东西都可以问。 更新:这是一个未解决的类似问题,当 我在Android6.0.1下测试我正在测试的GoogleHang