繁体   English   中英

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

[英]BroadcastReceiver registered in AndroidManifest not working

当前行为:消息正在广播,但接收方永远不会收到。 我知道这一点是因为广播了广播员中的打印语句,但接收者中的打印语句从未打印过。 我在想什么/做错了什么?

这是我尝试(多种方式)广播消息的代码段,该消息位于扩展Service IMService类中:

//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>

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

<!-- 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>

这是我的项目的层次结构:

在此处输入图片说明

最后编辑:

如果有人对我使用大写字母表示包裹名称时的确切警告感到好奇,请看以下屏幕截图:

在此处输入图片说明

使用隐式Intent(即未为特定类创建的Intent)时,您要在BroadcastReceiver上进行筛选的操作必须与用于创建Intent的操作完全匹配。 在这种情况下,代码中指定的NEW_FRIEND_REQUEST字符串与清单中的<action>元素不匹配。

同样,当清单中的接收方错误列出时,触发隐式Intent意味着它会无提示地失败,因为系统将无法找到它。 在这种情况下, NotificationReceiver中额外的s是一个问题。 另一个原因是Receiver位于/src的子目录中,因此位于其他软件包中。 通过更改清单中列出的名称以将子目录包括在包名称中,此问题已得到纠正。

最后,看来软件包名称中的大写字母(以及项目目录名称)可能会引起问题,应避免使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM