我在实现广播接收器时遇到了问题。
我在Fragment类中有这个函数:
public void reloadMessages() {
List<SmsList> values = smsToSmsList(getAllSms());
mPostAdapter.clear();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
mPostAdapter.addAll(values);
} else {
for (SmsList smsList : values) {
mPostAdapter.add(smsList);
}
}
mPostAdapter.notifyDataSetChanged();
Log.d(null, "reloadMessages");
}
我从广播接收器呼叫它:
private BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
mainFragment.reloadMessages();
Log.d("myactivity", "broadcast received");
}
};
使用调试器进行分析表明正确调用了此函数,但没有任何反应。 我执行了一个测试并从onclick函数调用该函数,它可以正常工作。
有什么问题?
我尝试使用runOnUiThread()并使用Handler但没有任何变化。
答案 0 :(得分:-1)
在API级别11之前,您无法在onReceive()方法中执行任何异步操作,因为一旦onReceive()方法完成,就允许Android系统回收该组件。如果您有可能长时间运行的操作,则应该触发服务。
从Android API 11开始,您可以调用goAsync()方法。此方法返回PendingResult类型的对象。 Android系统将接收器视为活动,直到您在此对象上调用PendingResult.finish()。使用此选项,您可以在接收器中触发异步处理。
您需要做的是启动一项服务,该服务将在广播事件时执行此类操作:
new BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent intent = new Intent(context, CustomService.class);
context.startService(intent);
}
}
编辑:
您可能遗漏了有关此事的内容,例如正确声明xml组件以及有关广播接收和服务的权限。
我强烈建议您按照this教程进行操作,因为它会让您了解这些工作原理。