在AndroidManifest中注册的BroadcastReceiver无法正常工作

时间:2015-03-05 03:08:07

标签: java android xml

当前行为: 消息正在广播,但接收者永远不会得到它们。我知道这是因为打印了广播公司的打印声明,但接收器中的打印声明从未打印过。我错过了什么/做错了什么?

这里是我尝试(多种方式)广播消息的片段,该消息位于名为IMService的类中,扩展了Service

//NEW_FRIEND_REQUEST is a String
Log.i( "MY_TAG", "broadcasting received friend request");

Intent i = new Intent( NEW_FRIEND_REQUEST, null, null, NotificationReceiver.class );

i.putExtra( USER_ID, user.username() );  
sendBroadcast(i);

i = new Intent( NEW_FRIEND_REQUEST );

i.putExtra( USER_ID, user.username() );  
sendBroadcast(i);

i = new Intent( this, NotificationReceiver.class );

i.putExtra( USER_ID, user.username() );  
sendBroadcast(i);

广播接收器(它是一个独立的类,又不是内部类):

public class NotificationReceiver extends BroadcastReceiver 
{
    @Override
    public void onReceive(Context context, Intent intent) 
    {
         Log.i("MY_TAG", "friends broadcast receiver received a friend request message");
    }
}

的AndroidManifest.xml:

<uses-sdk
    android:minSdkVersion="10"
    android:targetSdkVersion="21" />

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >

    <receiver android:name="NotificationsReceiver" >
        <intent-filter>
            <action  android:name="IMService.NEW_FRIEND_REQUEST" />
        </intent-filter>
    </receiver>

    <activity
        android:name="activities.MainActivity"
        android:configChanges="orientation|screenSize"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name="activities.Login"
        android:configChanges="orientation|screenSize"
        android:label="@string/title_activity_login" >
    </activity>
    <activity
        android:name="activities.Register"
        android:configChanges="orientation|screenSize"
        android:label="@string/title_activity_register" >
    </activity>
    <activity
        android:name=".HttpRequest"
        android:configChanges="orientation|screenSize"
        android:label="@string/title_activity_signin" >
    </activity>
    <activity
        android:name=".Messaging"
        android:configChanges="orientation|screenSize"
        android:label="@string/title_activity_messaging" >
    </activity>

    <service android:name=".IMService" />

    <activity
        android:name=".FriendList"
        android:configChanges="orientation|screenSize"
        android:label="@string/title_activity_friend_list" >
    </activity>
    <activity
        android:name="activities.Home"
        android:configChanges="orientation|screenSize"
        android:label="@string/title_activity_home"
        android:windowSoftInputMode="stateAlwaysHidden" >
    </activity>
    <activity
        android:name="activities.Friends"
        android:configChanges="orientation|screenSize"
        android:label="@string/title_activity_friends"
        android:windowSoftInputMode="stateAlwaysHidden" >
    </activity>
    <activity
        android:name="activities.FriendRequests"
        android:configChanges="orientation|screenSize"
        android:label="@string/title_activity_friend_requests" >
    </activity>
    <activity
        android:name="activities.PrivateChat"
        android:configChanges="orientation|screenSize"
        android:label="@string/title_activity_private_chat"
        android:windowSoftInputMode="stateAlwaysHidden" >
    </activity>
    <activity
        android:name="activities.RandomChat"
        android:configChanges="orientation|screenSize"
        android:label="@string/title_activity_random_chat" >
    </activity>
    <activity
        android:name="activities.Groups"
        android:configChanges="orientation|screenSize"
        android:label="@string/title_activity_groups" >
    </activity>
    <activity
        android:name="activities.GroupChat"
        android:configChanges="orientation|screenSize"
        android:label="@string/title_activity_group_chat"
        android:windowSoftInputMode="stateAlwaysHidden" >
    </activity>
    <activity
        android:name="activities.UserProfile"
        android:configChanges="orientation|screenSize"
        android:label="@string/title_activity_user_profile" >
    </activity>
    <activity
        android:name=".Messages"
        android:label="@string/title_activity_messages" >
    </activity>
</application>

</manifest>

编辑: 在阅读了迈克的评论后,我尝试了以下两件事(单独),但接收者仍然没有收到消息:

<!-- no filter -->
<receiver android:name="NotificationReceiver" />

<!-- with a filter, and I changed the value of NEW_FRIEND_REQUEST to 
    public static final String NEW_FRIEND_REQUEST = "new_friend_request"; -->

<receiver android:name="NotificationReceiver" >
        <intent-filter>
            <action  android:name="new_friend_request" />
        </intent-filter>
</receiver>

这是我项目的层次结构:

enter image description here

上次修改:

对于任何对我使用大写字母作为包名的确切警告的人,这里有一个屏幕截图:

enter image description here

1 个答案:

答案 0 :(得分:1)

当使用隐式Intent - 即,没有为特定类创建的Intent时 - 您在BroadcastReceiver上过滤的操作必须与用于创建Intent的操作完全匹配。在这种情况下,代码中指定的NEW_FRIEND_REQUEST字符串与清单中的<action>元素不匹配。

此外,当清单中错误地列出Receiver时,触发意味着它的隐式Intent将无声地失败,因为系统将无法找到它。在这种情况下,s中的额外NotificationReceiver是一个问题。另一个是Receiver位于/src的子目录中,因此位于不同的包中。通过更改清单中列出的名称以在程序包名称中包含子目录来更正此问题。

最后,看起来包名中的大写字母 - 以及项目目录名 - 可能会导致问题,应该避免使用。