BroadcastReceiver 的 onReceive 方法没有被调用

onReceive method of BroadcastReceiver does not get called

我正在使用 AlarmManager 通过播放声音来创建警报。为此,我首先创建一个 PendingIntent,为此我必须创建一个名为 AlarmReceiver 的 class,它扩展了 广播接收器。在这个新的 class 中,我覆盖了 onReceive 方法,我也在该方法中启动了声音。但是,根据我的测试,甚至没有从 MainActivity 调用 onReceive 方法。

经过一些研究,我发现我应该在清单文件中声明接收器。因此,我声明了它,但它不识别 class、AlarmReceiver 的名称,它以红色显示。我不完全明白如何在清单文件中正确声明。我知道还有其他类似的 SO 问题,我已经检查了所有问题,但我仍然无法正常工作。

MainActivity 的代码是:

package com.example.alarmsound;
public class MainActivity extends AppCompatActivity {

public class AlarmReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        final MediaPlayer mp = MediaPlayer.create(context, R.raw.music);
        Log.d("Music", "It went here.");
        mp.start();

        Button stop = (Button) findViewById(R.id.stopAlarm);
        stop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mp.stop();
            }
        });
    }
}

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

    Calendar t = Calendar.getInstance();
    t.add(Calendar.SECOND, 5);

    Context context = this;
    AlarmManager alarmMgr;
    alarmMgr = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(this, AlarmReceiver.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    alarmMgr.set(AlarmManager.RTC_WAKEUP, t.getTimeInMillis(), pendingIntent);
}
}

Manifest 中的声明是:

<receiver android:name="com.example.alarmsound.AlarmReceiver">
        <intent-filter>
            <action android:name="com.example.alarmsound.MainActivity" />
        </intent-filter>
</receiver>

我也可能在 MainActivity 中做错了什么,尽管我认为我所做的一切都是正确的。

将接收方声明的第一行更改为: <receiver android:name="com.example.alarmsound.MainActivity$AlarmReceiver">。这应该让 Android 通过清单检测到您的 class。

$ 符号用于引用 Android 清单中的内部 classes。

好的。因此,正如您提到的 AlarmReceiver class 无法在 AndroidManifest.xml 中识别。所以我在 Android Studio 中尝试了一下,格式似乎应该是这样的:

<receiver android:name=".MainActivity$AlarmReceiver">
            <intent-filter>
                <action android:name="com.example.alarmsound.MainActivity" />
            </intent-filter>
        </receiver>

尝试了 运行 代码,但 returns 应用程序崩溃的错误。无论如何,我认为现在这是一个不同的问题。