Почему не срабатывает простейший BroadCastReceiver
Почему не срабатывает простейший Receiver , я уже ничего непонимаю если регистрировать програмно работает: Manifest:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="net.maioya.testreceivers">
<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/Theme.TestReceivers">
<receiver
android:name=".TestReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="net.maioya.testreceivers.ActionTestReceiver"/>
</intent-filter>
</receiver>
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Receiver:
class TestReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
Log.i("TAG", "working")
}
companion object {
const val MACTION = "net.maioya.testreceivers.ActionTestReceiver"
}
}
MainActivity:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
var button = findViewById(R.id.button) as Button
button.setOnClickListener {
val intent = Intent()
intent.action = TestReceiver.MACTION
//intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES)
sendBroadcast(intent)
}
}
}
Ответы (2 шт):
Похоже что это из-за версий андроид. Там с 8 версии ограничения наложены видимо это коснулось и моих. Вот кусок официального гайда: Beginning with Android 8.0 (API level 26), the system imposes additional restrictions on manifest-declared receivers. If your app targets Android 8.0 or higher, you cannot use the manifest to declare a receiver for most implicit broadcasts (broadcasts that don't target your app specifically). You can still use a context-registered receiver when the user is actively using your app.
Потому что ваш BroadcastReceiver является явным (explicit), то есть предназначен только для вашего приложения, а Intent которые ловит данный приемник должен содержать ComponentName. Это можно сделать например методом setPackage.
Intent intent = new Intent("TEST");
intent.setPackage( getPackageName() );
sendBroadcast(intent);
И все начинает работать. Флаг в манифесте android:exported="true" не нужен.
В документации информация по данному нюансу отсутствует.