Приемник вещания не работает - почему так? - PullRequest
0 голосов
/ 10 апреля 2019

Я изучаю Android.Я пытаюсь реализовать пользовательский статический приемник широковещания, но он не работает.Я ищу проблему в Google, но не могу найти решение этой проблемы.Я работаю на Android 7.0 Минимальный уровень 24 Целевой уровень 28

Фактически, MyStaticReceiver не запускается, когда я запускаю Activity (без журнала) MyDynamicReceiver работает отлично

У вас есть решение?

AndroidManifest.xml:

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

    <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="test.receiver.MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <receiver
            android:name=".MyStaticReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="@string/StaticAction" />
            </intent-filter>
        </receiver>
    </application>

</manifest>

MainActivity.java:

public class MainActivity extends Activity {
    public final static boolean Debug = true;
    public final static String TAG = "TagDebug";

    private MyDynamicReceiver dynamicReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ComponentName receiver = new ComponentName(this, MyStaticReceiver.class);
        PackageManager pm = this.getPackageManager();
        pm.setComponentEnabledSetting(receiver,
                PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
                PackageManager.DONT_KILL_APP);
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (Debug) Log.i(TAG, "MainActivity:onResume");
        configureDynamicReceiver();
    }

    @Override
    protected void onDestroy(){
        super.onDestroy();
        if (Debug) Log.i(TAG, "MainActivity:onDestroy");
        unregisterReceiver(dynamicReceiver);
    }

    public void onClickButton(View v) {
        if (Debug) Log.i(TAG, "MainActivity:onClickButton");
        Intent staticIntent = new Intent();
        staticIntent.setAction(getString(R.string.StaticAction));
        sendBroadcast(staticIntent);

        Intent dynamicIntent = new Intent();
        dynamicIntent.setAction(getString(R.string.DynamicAction));
        sendBroadcast(dynamicIntent);
    }

    public void configureDynamicReceiver() {
        if( dynamicReceiver == null ) {
            dynamicReceiver = new MyDynamicReceiver();
        }
        IntentFilter filter = new IntentFilter(getString(R.string.DynamicAction));
        registerReceiver(dynamicReceiver, filter);
    }
}

MyStaticReceiver.java (MyDynamicReceiver такой же ...)

public class MyStaticReceiver extends BroadcastReceiver {
    public final static boolean Debug = true;
    public final static String TAG = "TagDebug";

    public MyStaticReceiver() {
        if (Debug) Log.i(TAG, "MyStaticReceiver");
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        if (Debug) Log.i(TAG, "MyStaticReceiver:onReceive");
    }
}

1 Ответ

1 голос
/ 10 апреля 2019

Вы действительно отправляете неявную трансляцию , поэтому получатель, объявленный в манифесте, не будет работать.

Если ваше приложение предназначено для Android 8.0 (уровень API 26) или вышеВы не можете использовать манифест, чтобы объявить получателя для большинства неявных трансляций (трансляций, которые не ориентированы конкретно на ваше приложение).Вы по-прежнему можете использовать получателя, зарегистрированного в контексте, когда пользователь активно использует ваше приложение. Ссылка

У вас нет проблем с MyDynamicReceiver, потому что это получатель, зарегистрированный в контексте.

Но чтобы заставить это работать для MyStaticReceiver, вы можете попробовать отправить явную рассылку , передав имя компонента в конструкторе Intent.

Intent staticIntent = new Intent(this, MyStaticReceiver.class);
staticIntent.setAction(getString(R.string.StaticAction));
sendBroadcast(staticIntent);
...