Android 使用哪种广播接收器?
我已经读了这个答案,也读了这个,我正试图找出什么最适合我的情况 我在Android 使用哪种广播接收器?,android,Android,我已经读了这个答案,也读了这个,我正试图找出什么最适合我的情况 我在onCreate()中启动一个服务,在这里我发出一个HTTP请求,并得到一个id作为响应。然后我广播这个id,并在我的活动中接收它 问题是,用户只需打开抽屉并选择一个选项,显然就可以导航到另一个活动,我可能会错过广播 很明显,我可以让我所有的活动都扩展一个抽象类,这个抽象类扩展了前面提到的Activity,但我不能100%肯定这是最好的解决方案。如果用户在我收到id之前决定退出应用程序怎么办 编辑:应用程序架构 用户使用打开照
onCreate()
中启动一个服务,在这里我发出一个HTTP请求,并得到一个id
作为响应。然后我广播这个id
,并在我的活动中接收它
问题是,用户只需打开抽屉并选择一个选项,显然就可以导航到另一个活动,我可能会错过广播
很明显,我可以让我所有的活动都扩展一个抽象类,这个抽象类扩展了前面提到的Activity
,但我不能100%肯定这是最好的解决方案。如果用户在我收到id之前决定退出应用程序怎么办
编辑:应用程序架构
- 用户使用打开照相机应用程序并获取图像文件路径的意图捕获图像
从用户可以添加有关图像的一些详细信息开始FormActivity
- 用户单击上载,我将用户刚刚输入的数据传递到
QuizActivity
- 在
的quizaActivity
中,我启动onCreate()
,其中我:服务
- 创建一个空的服务器条目,我得到一个
作为响应,然后id
- 将图像上载到服务器
- 创建一个空的服务器条目,我得到一个
- 那个
我从服务器得到一个响应,然后广播它id
注册了一个quizaActivity
,其中接收entrydReceiver
并将其存储在一个私有字段中,直到用户决定离开活动或单击上载测验(当然,如果他为测验输入了数据)id
- 如果用户单击“上载”,我将启动一个带有
和测验数据的id
IntentService
- 如果用户打开抽屉并选择另一个
或单击cancel创建测验,我将启动Activity
以上载带有“空测验数据”的IntentService
,并将用户移动到id
main Activity
问题是:如果uer在
quizaActivity
上关闭应用程序,而我还没有收到id
,或者用户决定使用抽屉进入另一个活动而不添加测验,该怎么办。我仍然需要启动一个服务,上传带有“空测验数据”的id
。也许你可以发送一个粘性广播。即使活动被破坏,系统也会保留它,并且您可以在注册财产时立即收到意图
接受者
但请注意,sendStickyBroadcast已被弃用,请不要忘记声明
android.permission.BROADCAST_STICKY
如果您决定使用它,请在您的AndroidManifest.xml中使用它。通过使用抽象类,您可以在其中处理所有操作,并只向您的活动发送回调,这非常好。在我看来,在你上面的问题中使用这个例子就像是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);
}
}
使用上面的设计,你认为我们得到了什么?我们现在有了单接收器和回调作为接口所以您可以使用Fragment、Activity、FragmentActivity和其他类,通过广播和(!)从服务接收结果,而无需复制粘贴相同的行为强>
另外,它看起来很不错,因为我们划分了不同的层-表示层、视图层和接收器层。您在服务中调用网络请求。该服务将结果发送到广播,然后他将数据发送到所有注册的活动
是的,它看起来像是EventBus,但根据您的问题,它正是您需要的,用于侦听从服务到不同活动的连接,并且具有更好的结构 您为什么不在活动
中进行网络呼叫?活动
是否绝对需要接收id?一般来说,广播是不可能的。@XaverKapeller,这样我也可以“听”其他活动,以防用户决定离开活动
@XaverKapeller不,活动
接收它不是绝对必要的。我只需要它,直到我从用户那里得到一些其他信息,并启动一个IntentService
有更好的方法来做到这一点。当我回家后,我可以写下这个问题的答案,并为你的应用程序建议一个合适的架构。
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
}
}