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()獲取上下文並遍歷它。 –