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 应用程序崩溃的错误。无论如何,我认为现在这是一个不同的问题。
我正在使用 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 应用程序崩溃的错误。无论如何,我认为现在这是一个不同的问题。