簡體   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