我正在使用 AlarmManager 通过播放声音来创建闹钟。为此,我首先创建一个 PendingIntent ,为此我必须创建一个名为 AlarmReceiver 的类,它扩展了 BroadcastReceiver 。在这个新类中,我重写 onReceive 方法,我也在其中启动声音。但是,根据我测试的内容,甚至没有从MainActivity调用onReceive方法。
经过一番研究,我发现我应该在清单文件中声明接收器。因此,我声明了它,但它没有识别类的名称, 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中做错了,尽管我认为我在那里做了一切。我将不胜感激任何帮助。
答案 0 :(得分:2)
将接收者声明的第一行更改为:
<receiver android:name="com.example.alarmsound.MainActivity$AlarmReceiver">
。这应该让Android通过清单检测你的类。
$
符号用于引用Android Manifest中的内部类。
答案 1 :(得分:1)
好。正如您所提到的,AlarmReceiver
中无法识别AndroidManifest.xml
类。所以我在Android Studio中尝试了它,看起来格式应该是这样的:
<receiver android:name=".MainActivity$AlarmReceiver">
<intent-filter>
<action android:name="com.example.alarmsound.MainActivity" />
</intent-filter>
</receiver>
尝试运行代码,但它会在应用崩溃时返回错误。无论如何,我认为现在这是另一个问题。祝好运。 :)