【问题标题】:Android SDK : Broadcastreceiver Intentservice and configuration changesAndroid SDK:Broadcastreceiver Intentservice 和配置更改
【发布时间】:2013-10-09 08:50:30
【问题描述】:

我正在使用广播接收器来侦听通过 onclick 方法触发的意图服务。这一切都很好,但是如果屏幕旋转,我必须在 onPause 中取消注册(我也在 onDestory 中尝试过),然后在 onResume 中重新注册广播接收器。

我的问题是,在广播接收器未注册/注册期间,intentservice 可以将其广播发送回说它已完成,然后这意味着广播接收器仍然坐在那里等待已经发生的事情。

我曾尝试在广播之前在 intentservice 中使用睡眠,但这绝不是完全证明,好像设备再次旋转存在时间问题。

我从 onClick 启动并注册意图服务和广播接收器,如下所示:

Intent intentMyIntentService = new Intent(myclass.this,myservice.class);
startService(intentMyIntentService);


mybroadcastreciver = new br();
IntentFilter intentFilter = new IntentFilter(myservice.ACTION_ServiceE);
intentFilter.addCategory(Intent.CATEGORY_DEFAULT);
registerReceiver(mybroadcastreciver, intentFilter);

我的 br 方法是广播接收器,它作为它的 onReceive 方法,我使用 onSaveInstanceState 方法处理配置更改,然后检查 onCreate 以查看是否 Bundle != null 然后检索设置的布尔值是否取决于使用它发送给接收者的广播来完成意图服务。

如果屏幕不旋转,这一切都会起作用。但是我知道还有其他方法可以处理屏幕旋转,但我正在编写一个从 API 8 到 17 工作的应用程序。

谢谢

提姆

【问题讨论】:

    标签: android sdk broadcastreceiver intentservice


    【解决方案1】:

    一种方法是在屏幕方向更改时保持相同的BroadcastReceiver 对象:

    1) 返回Activity.onRetainNonConfigurationInstance()中的BroadcastReceiver对象。

    2) 使用(BroadCastReceiver) getLastNonConfigurationInstance()Activity.onCreate() 中获取它。如果未保存,则返回 null

    3) 在onClick()中,如果Activity.onCreate()中没有得到BroadcastReceiver对象,则只创建它。

    【讨论】:

    • 我认为这种方法:onRetainNonConfigurationInstance() 现在已经贬值了。另外我想我可能已经解决了。当我在这些版本的 Android 上进行测试时,API 似乎不喜欢 onReceive 中的 intent.getAction == myservice.ACTION。但是我需要在以后的 API 上对此进行测试
    • @TimCS 由于引入了Fragments,它已被弃用。或者,如果您使用支持包中的Fragments,您也可以使用例如Fragment.setRetainInstance().
    • 谢谢@xizzhu 那么这是否意味着它仍然适用于所有 API 版本?到目前为止,我对它的工作方式没有任何问题,但如果我确实挣扎,那么我会考虑你的建议/回答。
    • 通过 Google Androids 页面阅读此内容时声明如下:注意:虽然您可以返回任何对象,但您永远不应传递与 Activity 绑定的对象,例如 Drawable、Adapter ,视图或与上下文关联的任何其他对象。如果这样做,它将泄漏原始活动实例的所有视图和资源。 (泄漏资源意味着您的应用程序会保留它们并且它们不能被垃圾收集,因此可能会丢失大量内存。)这是否包括广播接收器,因为 onReceive 链接到上下文
    • @TimCS 1) 支持包适用于 Android 1.6 及更高版本。 2)BroadcastReceiver 与“托管”Activity 无关,onReceive() 中传递的Context 基本上是接收器运行的上下文。该警告基本上意味着您永远不应返回指向“托管”Activity 的指针,并且在方向更改后不应使用与该 Activity 相关的任何内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多