Android BroadCastReceiver не работает с пользовательскими действиями

Я пытаюсь реализовать простой BroadCastReceiver с пользовательским действием, которое выводит всплывающее уведомление в методе onReceive() приемника, но по какой-то загадочной причине оно не работает!!

Основное действие имеет только кнопку, которая транслирует намерение при нажатии. Я не уверен, что это проблема с названием действия. Любая помощь будет оценена по достоинству.

Основная деятельность :

   package com.example.tsupt.bcr;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }
    public void broadcastIntent(View view){
        Intent intent = new Intent();
        intent.setAction("com.example.tsupt.bcr.CUSTOM_INTENT");
        sendBroadcast(intent);
    }

}

Широковещательный приемник:

public class BR extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,"It worked",Toast.LENGTH_LONG).show();
        System.out.println("It worked");

}}

Манифест:

   <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.tsupt.bcr">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <receiver android:name="com.example.tsupt.bcr.BR">
                <intent-filter>
                    <action android:name="com.example.tsupt.bcr.CUSTOM_INTENT">
                    </action>
                </intent-filter>

            </receiver>
        </activity>

    </application>

</manifest>

Кнопка из файла макета:

<Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button"
        android:onClick="broadcastIntent"
        tools:layout_constraintTop_creator="1"
        tools:layout_constraintRight_creator="1"
        app:layout_constraintRight_toRightOf="parent"
        android:layout_marginTop="180dp"
        app:layout_constraintTop_toBottomOf="@+id/textView"
        tools:layout_constraintLeft_creator="1"
        app:layout_constraintLeft_toLeftOf="parent" />

person Tareq Sulaiman    schedule 19.09.2017    source источник


Ответы (2)


На самом деле все-таки сработало. Проблема, похоже, связана с моим huawei honor 5x, на котором я тестировал свое приложение. Существует способ экономии заряда батареи, который используют телефоны huawei, и это похоже на источник проблемы.

person Tareq Sulaiman    schedule 20.09.2017
comment
Таким образом, вы могли бы решить проблему, отключив оптимизацию батареи? Какая версия Android у вас была тогда? У меня похожая проблема с кучей телефонов Huawei, и мы не можем заставить ее работать. - person Markus Penguin; 08.03.2018
comment
На самом деле нет, я не мог, Huawei не дает вам контроля над всеми функциями оптимизации батареи. Я только начал использовать другой телефон для тестирования. У меня также было много проблем с телефонами Huawei, работающими в фоновом режиме, поэтому я отказался от использования телефонов Huawei для тестирования приложений Android. - person Tareq Sulaiman; 08.03.2018

В вашем манифесте элемент <receiver> должен быть братом элемента <activity>, а не дочерним:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.tsupt.bcr">

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <receiver android:name="com.example.tsupt.bcr.BR">
        <intent-filter>
            <action android:name="com.example.tsupt.bcr.CUSTOM_INTENT">
            </action>
        </intent-filter>

    </receiver>

</application>

</manifest>
person sdabet    schedule 19.09.2017
comment
Большое спасибо за ответ, но, к сожалению, это тоже не сработало. - person Tareq Sulaiman; 19.09.2017
comment
При запуске приложения я получаю это на мониторе Android: com.example.tsupt.bcr I/SendBroadcastPermission: action:com.example.tsupt.bcr.CUSTOM_INTENT, mPermissionType:0 Означает ли это, что что-то идет не так? - person Tareq Sulaiman; 19.09.2017
comment
Да, это сработало. Проблема была с устройством, на котором я тестировал приложение. - person Tareq Sulaiman; 20.09.2017
comment
Это удивительно, AFAIK элемент получателя игнорируется, если он вложен в элемент действия. - person sdabet; 21.09.2017