1

我有一个MyBroadcastReceiver类实现,我试图在运行时注册一个广播接收器:我的注册广播接收机有什么问题?

String MY_ACTION = "DUMMY"; 
MyBroadcastReceiver receiver = new MyBroadcastReceiver(); 
IntentFilter intentFilter = new IntentFilter(MY_ACTION); 
Log.i(TAG, "intentFilter: " + intentFilter.getAction(0)); 
Intent intent = context.registerReceiver(receiver, intentFilter); 
Log.i(TAG, "intent returned after registering:" + intent); 
Intent queryIntent = new Intent(MY_ACTION); 
PackageManager pm = context.getPackageManager(); 
List<ResolveInfo> resolveInfos = pm.queryBroadcastReceivers(queryIntent, 0); 
Log.i(TAG, "list of receivers:" + resolveInfos.toString()); 

我跑了广播从亚行外壳:

am broadcast \ 
-n com.foo.foo.foo/.MyBroadcastReceiver \ 
-a DUMMY 

我也有一些日志。我在我的onReceive()(在MyBroadcast Receiver里面实现)。

public class MyBroadcastReceiver extends BroadcastReceiver { 
@Override 
public void onReceive(Context context, Intent intent) { 
    Log.i(TAG, "in Broadcasting Receiver anyway"); 
    if (intent != null) { 
    ... 
    } 
} 

}

结果是:

  • intentFilter.getAction的日志(0)给出正确的行动
  • 意图的登记后的日志使空
  • 我从日志中获得空的接收者列表。
  • 而的onReceive从未进入(从日志中我可以看到 那)

我想有我寄存器部分的一些错误? 任何提示/建议将高度赞赏!

回答

0

此代码:

Intent intent = context.registerReceiver(receiver, intentFilter); 

将返回null因为它只返回 “粘性” 的广播。这是正确的,因为你不发送“粘性”广播。

此代码:

List<ResolveInfo> resolveInfos = pm.queryBroadcastReceivers(queryIntent, 0); 

应该返回一个空列表,因为这个代码仅返回已注册的清单与<receiver>标签BroadcastReceiver秒,用于动态不返回任何注册BroadcastReceiver s,这你MyBroadcastReceiver是。

我不知道为什么onReceive()没有被调用。请发布您的MyBroadcastReceiver代码。我没有看到任何明显的。你可以试试这个ADB命令:

am broadcast -a DUMMY 

您也可以尝试这个代码后加

sendBroadcast(queryIntent); 

Intent queryIntent = new Intent(MY_ACTION); 

,看看这个调用你onReceive()

+0

谢谢。用MyBroadcastReceiver的代码更新了问题。 –

+0

在我的回答结尾添加了另一个想法。另外,你的代码'context.registerReceiver()'中的'context'是什么?你是从“活动”还是“服务”调用这个或者什么? –

+0

通过使用context.getApplicationContext()获取上下文并遍历它。 –